From b75d0676ffd07557a9f6aeef0cf4f250f4cdc06c Mon Sep 17 00:00:00 2001 From: Maria Wisniewska Date: Fri, 26 May 2023 13:11:56 +0200 Subject: [PATCH] Release 1.10.1 --- .bumpversion.cfg | 2 +- SW_Content_Register_SPSDK.txt | 2 +- docs/_static/custom.css | 4 + docs/apps/elftosb.rst | 3 +- docs/apps/images.rst | 299 - docs/apps/nxpimage.rst | 3 +- docs/exts/generate_schemas.py | 272 +- docs/images/ahab.rst | 23 + docs/images/bootable.rst | 31 + docs/images/executable.rst | 14 + docs/images/fcb.rst | 6 + docs/images/flash.rst | 82 + docs/images/hab.rst | 255 + docs/images/mbi.rst | 102 + docs/images/sb2.rst | 49 + docs/images/sb3.rst | 25 + docs/images/secure_update.rst | 23 + docs/images/xmcd.rst | 6 + docs/index.rst | 11 +- docs/release_notes.rst | 23 +- docs/usage/elf2sb.md | 2 +- examples/jupyter_examples/init_notebook.ipynb | 34 + .../kw45xx_k32w1xx_load_NBU_image.ipynb | 3 +- .../lpc55sxx_secure_boot.ipynb | 3 +- release_notes.txt | 58 +- requirements-develop.txt | 16 +- spsdk/__init__.py | 73 - spsdk/__version__.py | 2 +- spsdk/apps/blhost.py | 3 +- spsdk/apps/ifr.py | 3 +- spsdk/apps/nxpcertgen.py | 3 +- spsdk/apps/nxpcrypto.py | 3 +- spsdk/apps/nxpdebugmbox.py | 3 +- spsdk/apps/nxpdevhsm.py | 3 +- spsdk/apps/nxpdevscan.py | 6 +- spsdk/apps/nxpimage.py | 151 +- spsdk/apps/nxpkeygen.py | 3 +- spsdk/apps/pfr.py | 3 +- spsdk/apps/sdphost.py | 3 +- spsdk/apps/sdpshost.py | 3 +- spsdk/apps/shadowregs.py | 3 +- spsdk/apps/tpconfig.py | 3 +- spsdk/apps/tphost.py | 3 +- spsdk/apps/utils/spsdk_logger.py | 121 + spsdk/apps/utils/utils.py | 42 +- spsdk/data/image/database_sb31.yaml | 31 +- spsdk/data/image/xmcd/flexspi_ram_full.xml | 210 +- .../image/xmcd/flexspi_ram_simplified.xml | 48 +- spsdk/data/image/xmcd/header.xml | 10 +- spsdk/data/image/xmcd/sch_xmcd.yaml | 8 +- spsdk/data/image/xmcd/semc_sdram_full.xml | 120 +- .../data/image/xmcd/semc_sdram_simplified.xml | 22 +- spsdk/data/pfr/cfpa/lpc553x_1a.xml | 2 +- spsdk/data/pfr/cfpa/lpc55s3x_1a.xml | 16 +- spsdk/data/utils/iee/database.yaml | 5 +- spsdk/data/utils/iee/sch_iee.yaml | 43 +- spsdk/data/utils/otfad/database.yaml | 3 + spsdk/data/utils/otfad/sch_otfad.yaml | 20 +- spsdk/exceptions.py | 8 + spsdk/image/bootable_image/bimg.py | 5 +- spsdk/image/hab/config_parser.py | 117 + spsdk/image/hab/csf_builder.py | 1528 +++++ spsdk/image/hab/hab_binary_image.py | 104 + spsdk/image/hab/hab_container.py | 281 +- spsdk/image/secret.py | 2 +- spsdk/image/segments.py | 6 + spsdk/image/segments_base.py | 2 - spsdk/image/xmcd/xmcd.py | 66 +- spsdk/mboot/properties.py | 40 +- spsdk/sbfile/sb2/sb_21_helper.py | 67 +- spsdk/sbfile/sb2/sly_bd_parser.py | 6 +- spsdk/utils/crypto/iee.py | 9 +- spsdk/utils/crypto/otfad.py | 9 +- spsdk/utils/images.py | 15 +- spsdk/utils/registers.py | 11 +- tests/elftosb/test_bd_compiler.py | 5 + tests/image/segments/test_xmcd.py | 10 + tests/mboot/test_properties.py | 4 + .../config.bd | 86 + .../CSF2_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG2_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 546 bytes .../CSF2_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG2_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../led_blinky_xip_srec_iar.srec | 362 ++ .../output.bin | Bin 0 -> 20480 bytes .../hab/export/rt1160_RAM_encrypted/config.bd | 90 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes .../gen_hab_encrypt/nonce.bin | 1 + ...rt1160_iled_blinky_cm7_int_RAM_hab_dek.bin | 1 + .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../rt1160_RAM_encrypted/keys/key_pass.txt | 2 + .../export/rt1160_RAM_encrypted/output.bin | Bin 0 -> 32768 bytes ...oard_imxrt1160_iled_blinky_cm7_int_RAM.s19 | 1221 ++++ .../rt1160_xip_mdk_unsigned/config.bd} | 0 ...1160_iled_blinky_cm7_xip_mdk_unsigned.srec | 0 .../rt1160_xip_mdk_unsigned/output.bin} | Bin .../config.bd | 86 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../flashloader.srec | 5253 +++++++++++++++++ .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../output.bin | Bin 0 -> 102400 bytes .../rt1165_semcnand_authenticated/config.bd | 87 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../dcd_files/evkmimxrt1166_SDRAM_dcd.bin | Bin 0 -> 1288 bytes .../evkmimxrt1064_iled_blinky_SDRAM.s19 | 605 ++ .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../rt1165_semcnand_authenticated/output.bin | Bin 0 -> 23552 bytes .../rt1165_semcnand_encrypted/config.bd | 91 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../dcd_files/evkmimxrt1166_SDRAM_dcd.bin | Bin 0 -> 1288 bytes .../evkmimxrt1064_iled_blinky_SDRAM.s19 | 605 ++ .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes ...vkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin | 1 + .../gen_hab_encrypt/nonce.bin | 1 + .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../rt1165_semcnand_encrypted/output.bin | Bin 0 -> 23552 bytes .../config.bd | 88 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../dcd_files/evkmimxrt1166_SDRAM_dcd.bin | Bin 0 -> 1288 bytes .../evkmimxrt1064_iled_blinky_SDRAM.s19 | 605 ++ .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../rt1170_QSPI_flash_unsigned/config.bd} | 0 ...70_iled_blinky_cm7_QSPI_FLASH_unsigned.s19 | 0 .../rt1170_QSPI_flash_unsigned/output.bin} | Bin .../export/rt1170_RAM_authenticated/config.bd | 86 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + ...evkmimxrt1170_iled_blinky_cm7_int_RAM.s19} | 0 .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../rt1170_RAM_authenticated/output.bin | Bin 0 -> 36864 bytes .../rt1170_RAM_non_xip_unsigned/config.bd} | 0 ...d_blinky_cm7_int_RAM_non_xip_unsigned.s19} | 0 .../rt1170_RAM_non_xip_unsigned/output.bin} | Bin .../rt1170_RAM_unsigned/config.bd} | 0 ...t1170_iled_blinky_cm7_int_RAM_unsigned.s19 | 1418 +++++ .../rt1170_RAM_unsigned/output.bin} | Bin .../config.bd | 86 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../flashloader.srec} | 0 .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 1088 bytes .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../output.bin | Bin 0 -> 94208 bytes .../rt1170_flashloader_unsigned/config.bd} | 0 .../evkmimxrt1170_flashloader.srec | 5138 ++++++++++++++++ .../rt1170_flashloader_unsigned/output.bin} | Bin .../rt1170_semcnand_authenticated/config.bd | 86 + .../CSF1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../IMG1_1_sha256_2048_65537_v3_usr_crt.pem | 79 + .../evkmimxrt1170_iled_blinky_cm7_int_RAM.s19 | 1418 +++++ .../gen_hab_certs/SRK_hash.bin | Bin 0 -> 546 bytes .../CSF1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../IMG1_1_sha256_2048_65537_v3_usr_key.pem | 30 + .../keys/key_pass.txt | 2 + .../rt1170_semcnand_authenticated/output.bin | Bin 0 -> 35840 bytes .../rt1170_RAM_unsigned}/app.bin | Bin .../rt1170_RAM_unsigned}/bdt.bin | Bin ...t1170_iled_blinky_cm7_int_RAM_unsigned.bin | Bin 0 -> 26732 bytes .../rt1170_RAM_unsigned}/ivt.bin | Bin .../aes_xts512_custom_names/iee_config.yaml | 38 + .../data/mbi/ext_xip_signed_lpc55s3x.yml | 2 +- .../mbi/ext_xip_signed_lpc55s3x_invalid.yml | 2 +- .../data/mbi/ext_xip_signed_rtxxxx.yml | 2 +- .../mbi/ext_xip_signed_rtxxxx_invalid.yml | 2 +- .../data/mbi/int_xip_signed_kw45xx.yml | 2 +- .../mbi/int_xip_signed_kw45xx_invalid.yml | 2 +- .../nxpimage/data/mbi/int_xip_signed_xip.yml | 2 +- .../data/mbi/int_xip_signed_xip_invalid.yml | 2 +- .../data/otfad/otfad_rt1170_custom_name.yaml | 30 + .../data/xmcd/rt116x/flexspi_ram_full.yaml | 2 +- .../xmcd_rt116x_flexspi_ram_full.yaml | 50 +- .../xmcd_rt116x_flexspi_ram_simplified.yaml | 2 +- .../xmcd_rt116x_semc_sdram_full.yaml | 16 +- .../xmcd_rt116x_semc_sdram_simplified.yaml | 46 +- .../data/xmcd/rt117x/flexspi_ram_full.yaml | 30 +- .../xmcd_rt117x_flexspi_ram_full.yaml | 50 +- .../xmcd_rt117x_flexspi_ram_simplified.yaml | 2 +- .../xmcd_rt117x_semc_sdram_full.yaml | 16 +- .../xmcd_rt117x_semc_sdram_simplified.yaml | 46 +- tests/nxpimage/test_nxpimage_hab.py | 113 +- tests/nxpimage/test_nxpimage_iee.py | 36 + tests/nxpimage/test_nxpimage_otfad.py | 31 + tests/nxpimage/test_nxpimage_xmcd.py | 42 +- tests/utils/test_registers.py | 2 +- 209 files changed, 23540 insertions(+), 1041 deletions(-) delete mode 100644 docs/apps/images.rst create mode 100644 docs/images/ahab.rst create mode 100644 docs/images/bootable.rst create mode 100644 docs/images/executable.rst create mode 100644 docs/images/fcb.rst create mode 100644 docs/images/flash.rst create mode 100644 docs/images/hab.rst create mode 100644 docs/images/mbi.rst create mode 100644 docs/images/sb2.rst create mode 100644 docs/images/sb3.rst create mode 100644 docs/images/secure_update.rst create mode 100644 docs/images/xmcd.rst create mode 100644 examples/jupyter_examples/init_notebook.ipynb create mode 100644 spsdk/apps/utils/spsdk_logger.py create mode 100644 spsdk/image/hab/config_parser.py create mode 100644 spsdk/image/hab/csf_builder.py create mode 100644 spsdk/image/hab/hab_binary_image.py create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/CSF2_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/IMG2_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/keys/CSF2_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/keys/IMG2_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/led_blinky_xip_srec_iar.srec create mode 100644 tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/output.bin create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/nonce.bin create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/validationboard_imxrt1160_iled_blinky_cm7_int_RAM_hab_dek.bin create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/output.bin create mode 100644 tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/validationboard_imxrt1160_iled_blinky_cm7_int_RAM.s19 rename tests/nxpimage/data/hab/{evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bd => export/rt1160_xip_mdk_unsigned/config.bd} (100%) rename tests/nxpimage/data/hab/{ => export/rt1160_xip_mdk_unsigned}/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec (100%) rename tests/nxpimage/data/hab/{evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bin => export/rt1160_xip_mdk_unsigned/output.bin} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/flashloader.srec create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/output.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/dcd_files/evkmimxrt1166_SDRAM_dcd.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/evkmimxrt1064_iled_blinky_SDRAM.s19 create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/output.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/dcd_files/evkmimxrt1166_SDRAM_dcd.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/evkmimxrt1064_iled_blinky_SDRAM.s19 create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/nonce.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/output.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/dcd_files/evkmimxrt1166_SDRAM_dcd.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/evkmimxrt1064_iled_blinky_SDRAM.s19 create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/key_pass.txt rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bd => export/rt1170_QSPI_flash_unsigned/config.bd} (100%) rename tests/nxpimage/data/hab/{ => export/rt1170_QSPI_flash_unsigned}/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19 (100%) rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bin => export/rt1170_QSPI_flash_unsigned/output.bin} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19 => export/rt1170_RAM_authenticated/evkmimxrt1170_iled_blinky_cm7_int_RAM.s19} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/output.bin rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bd => export/rt1170_RAM_non_xip_unsigned/config.bd} (100%) rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 => export/rt1170_RAM_non_xip_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19} (100%) rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bin => export/rt1170_RAM_non_xip_unsigned/output.bin} (100%) rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bd => export/rt1170_RAM_unsigned/config.bd} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin => export/rt1170_RAM_unsigned/output.bin} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem rename tests/nxpimage/data/hab/{evkmimxrt1170_flashloader.srec => export/rt1170_flashloader_authenticated/flashloader.srec} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/output.bin rename tests/nxpimage/data/hab/{evkmimxrt1170_flashloader.bd => export/rt1170_flashloader_unsigned/config.bd} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_flashloader_unsigned/evkmimxrt1170_flashloader.srec rename tests/nxpimage/data/hab/{evkmimxrt1170_flashloader.bin => export/rt1170_flashloader_unsigned/output.bin} (100%) create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/config.bd create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/evkmimxrt1170_iled_blinky_cm7_int_RAM.s19 create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/gen_hab_certs/SRK_hash.bin create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/keys/key_pass.txt create mode 100644 tests/nxpimage/data/hab/export/rt1170_semcnand_authenticated/output.bin rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned => parse/rt1170_RAM_unsigned}/app.bin (100%) rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned => parse/rt1170_RAM_unsigned}/bdt.bin (100%) create mode 100644 tests/nxpimage/data/hab/parse/rt1170_RAM_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin rename tests/nxpimage/data/hab/{evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned => parse/rt1170_RAM_unsigned}/ivt.bin (100%) create mode 100644 tests/nxpimage/data/iee/aes_xts512_custom_names/iee_config.yaml create mode 100644 tests/nxpimage/data/otfad/otfad_rt1170_custom_name.yaml diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 82b7f8f0..1958733e 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.10.0 +current_version = 1.10.1 parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P.*))? serialize = {major}.{minor}.{patch}.{suffix} diff --git a/SW_Content_Register_SPSDK.txt b/SW_Content_Register_SPSDK.txt index afbfe9ec..bb13063d 100644 --- a/SW_Content_Register_SPSDK.txt +++ b/SW_Content_Register_SPSDK.txt @@ -1,7 +1,7 @@ NXP Software Content Register Package: NXP SPSDK -Version: 1.10.0 +Version: 1.10.1 Outgoing License: BSD-3-Clause License Files: LICENSE Type of content: Source code diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 0b570a74..1b39cc42 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,3 +1,7 @@ .wy-nav-content { max-width: 75% !important; } + +.wy-table-responsive table td { + white-space: normal; +} diff --git a/docs/apps/elftosb.rst b/docs/apps/elftosb.rst index 2b964b9d..3cd766b3 100644 --- a/docs/apps/elftosb.rst +++ b/docs/apps/elftosb.rst @@ -7,8 +7,7 @@ User Guide - elftosb This user guide describes how to use *elftosb* application. *elftosb* is a tool for generating TrustZone, Master Boot Image and Secure Binary images. -For more information about the supported binary images and how to configure them visit page -:ref:`Supported binary images` +Refer to the chapter supported binary images for more information. ---------------------------- Legacy elftosb documentation diff --git a/docs/apps/images.rst b/docs/apps/images.rst deleted file mode 100644 index f3eb32c1..00000000 --- a/docs/apps/images.rst +++ /dev/null @@ -1,299 +0,0 @@ -======================= -Supported binary images -======================= - - - ----------------------------------- -Master Boot Image (MBI) ----------------------------------- -Master Boot Image can be used directly (e.g. by using *blhost write-memory* command) or it can be used for further processing (e.g. used as input to Secure Binary image container). -Image is created based on a supplied configuration file, either JSON or YAML is supported. - -Example of use - -nxpimage: ``nxpimage mbi export `` - -elftosb: ``elftosb –J `` - -Sample configuration for LPC55s6x plain signed XIP image. Other sample configurations might be obtained with the *get-templates* sub-command. - -.. code-block:: yaml - - # =========== Master Boot Image Configuration template for lpc55s6x, Plain Signed XIP Image. =========== - # - # == Basic Settings == - # - family: lpc55s6x # MCU family., MCU family name. - outputImageExecutionTarget: Internal flash (XIP) # Application target., Definition if application is Execute in Place(XiP) or loaded to RAM during reset sequence. - outputImageAuthenticationType: Signed # Type of boot image authentication., Specification of final master boot image authentication. - masterBootOutputFile: my_mbi.bin # Master Boot Image name., The file for Master Boot Image result file. - inputImageFile: my_application.bin # Plain application image., The input application image to by modified to Master Boot Image. - # - # == Trust Zone Settings == - # - enableTrustZone: false # TrustZone enable option, If not specified, the Trust zone is disabled. - trustZonePresetFile: my_tz_custom.yaml # TrustZone Customization file, If not specified, but TrustZone is enabled(enableTrustZone) the default values are used. - # - # == Certificate V2 Settings == - # - mainCertPrivateKeyFile: my_prv_key.pem # Main Certificate private key, Main Certificate private key used to sign certificate - imageBuildNumber: 0 # Image Build Number, If it's omitted, it will be used 0 as default value. - rootCertificate0File: my_certificate0.pem # Root Certificate File 0, Root certificate file index 0. - rootCertificate1File: my_certificate1.pem # Root Certificate File 1, Root certificate file index 1. - rootCertificate2File: my_certificate2.pem # Root Certificate File 2, Root certificate file index 2. - rootCertificate3File: my_certificate3.pem # Root Certificate File 3, Root certificate file index 3. - mainCertChainId: 0 # Main Certificate Index, Index of certificate that is used as a main. - chainCertificate0File0: chain_certificate0_depth0.pem # Chain certificate 0 for root 0, Chain certificate 0 for root certificate 0 - chainCertificate0File1: chain_certificate0_depth1.pem # Chain certificate 1 for root 0, Chain certificate 1 for root certificate 0 - chainCertificate0File2: chain_certificate0_depth2.pem # Chain certificate 2 for root 0, Chain certificate 2 for root certificate 0 - chainCertificate0File3: chain_certificate0_depth3.pem # Chain certificate 3 for root 0, Chain certificate 3 for root certificate 0 - chainCertificate1File0: chain_certificate1_depth0.pem # Chain certificate 0 for root 1, Chain certificate 0 for root certificate 1 - chainCertificate1File1: chain_certificate1_depth1.pem # Chain certificate 1 for root 1, Chain certificate 1 for root certificate 1 - chainCertificate1File2: chain_certificate1_depth2.pem # Chain certificate 2 for root 1, Chain certificate 2 for root certificate 1 - chainCertificate1File3: chain_certificate1_depth3.pem # Chain certificate 3 for root 1, Chain certificate 3 for root certificate 1 - chainCertificate2File0: chain_certificate2_depth0.pem # Chain certificate 0 for root 2, Chain certificate 0 for root certificate 2 - chainCertificate2File1: chain_certificate2_depth1.pem # Chain certificate 1 for root 2, Chain certificate 1 for root certificate 2 - chainCertificate2File2: chain_certificate2_depth2.pem # Chain certificate 2 for root 2, Chain certificate 2 for root certificate 2 - chainCertificate2File3: chain_certificate2_depth3.pem # Chain certificate 3 for root 2, Chain certificate 3 for root certificate 2 - chainCertificate3File0: chain_certificate3_depth0.pem # Chain certificate 0 for root 3, Chain certificate 0 for root certificate 3 - chainCertificate3File1: chain_certificate3_depth1.pem # Chain certificate 1 for root 3, Chain certificate 1 for root certificate 3 - chainCertificate3File2: chain_certificate3_depth2.pem # Chain certificate 2 for root 3, Chain certificate 2 for root certificate 3 - chainCertificate3File3: chain_certificate3_depth3.pem # Chain certificate 3 for root 3, Chain certificate 3 for root certificate 3 - ------------------------------------- -Supported devices for MBI ------------------------------------- -NXPIMAGE support devices from LPC55xx family (*LPC55S0x, LPC55S1x, LPC55S2x, LPC552x, LPC55S6x*), *RT5xx*, *RT6xx* and *LPC55S3x*. -Supported execution targets are: *Internal flash (XIP), External Flash (XIP) and RAM* and image authentication types: *Plain, CRC, Signed and Encrypted*. - -The following table shows the supported image types for each device, -it either shows "N/A" if the configuration is not available or respective class that will be used for image creation. - -*Target* in the table represents *outputImageExecutionTarget* in the configuration file and *authentication* in the table represents *outputImageAuthenticationType*. - -.. include:: ../_prebuild/table.inc - ------------------------------------------- -Supported configuration options ------------------------------------------- - -Refer to the documentation below for the supported configuration options for each image type. -Please note that the *outputImageExecutionTarget* and *outputImageAuthenticationType* must be filled in addition to the basic settings according to the table with supported devices. - - -.. code-block:: yaml - - outputImageExecutionTarget: Internal flash (XIP) # Application target., Definition if application is Execute in Place(XiP) or loaded to RAM during reset sequence. - outputImageAuthenticationType: Signed # Type of boot image authentication., Specification of final master boot image authentication. - - -.. include:: ../_prebuild/schemas.inc - :parser: myst_parser.sphinx_ - - ---------------------------- -Secure binary ---------------------------- - -Secure binary is a binary output file that contains the user's application image along with a series of bootloader commands. -The output file is known as a "Secure Binary" or SB file for short. -These files typically have a .sb extension. - -This format has a long history, the latest version is 3.1. (2022). -SPSDK elftosb tool supports SB 2.1 (2.0) and SB 3.1. - -Version 2.1 added support for digital signatures. - -The SB 2.0 and 2.1 file format also uses AES encryption for confidentiality and HMAC for -extending trust from the signed part of the SB file to the command and data part of the SB -file. These two keys (AES decrypt key and HMAC key) are wrapped in the RFC3394 key -blob, for which the key wrapping key is the SBKEK key - - -SB2 generation using BD file -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The tool uses an input command file to control the sequence of bootloader commands present in the output file. This command file is called a "boot descriptor file" or BD file for short. - -The image location is stated in the "sources" section of the .bd file. The SB key in the text file is used for encryption with the *nxpimage* command line tool. - -Description of how to use BD file is in bellow chapter. - -.. toctree:: - :maxdepth: 1 - - ../usage/elf2sb - -For more information about the Secure boot setup for LPC55Sxx family follow the `AN12283 -`_. - -Example of SB2 generation for 4 root keys - -nxpimage: ``nxpimage sb21 export -k "sbkek.txt" -c "commandFile.bd" -o "output.sb2" -s private_key_1_2048.pem --S certificate_1_2048.der.crt -R certificate_1_2048.der.crt -R -certificate_2_2048.der.crt -R certificate_3_2048.der.crt -R certificate_4_2048.der.crt -h "RHKT.bin" -"input.bin"`` - -elftosb: ``elftosb -f lpc55xx -k "sbkek.txt" -c "commandFile.bd" -o "output.sb2" -s private_key_1_2048.pem --S certificate_1_2048.der.crt -R certificate_1_2048.der.crt -R -certificate_2_2048.der.crt -R certificate_3_2048.der.crt -R certificate_4_2048.der.crt -h "RHKT.bin" -"input.bin"`` - -Created SB2 file can be loaded into the device using blhost *receive-sb-file* command. -``blhost -p COMxx receive-sb-file `` - -SB 3.1 -^^^^^^^^^^^^^^^^^ -SB 3.1 is an evolution of the SB 2 format. -The configuration is done in a similar way as a master boot image by configuration file in YAML or JSON. BD files are no longer used, commands are supplied in the configuration file. - -Example of use -nxpimage: ``nxpimage sb31 export "sb3_config.yaml`` -elftosb: ``elftosb -j "sb3_config.yaml`` - -------------------------- -AHAB -------------------------- -AHAB (Advanced High Assurance Boot) is a container format supported on some devices. A configuration file in YAML or -JSON is used to instruct nxpimage how the output should look like. - -AHAB container is not supported by elftosb tool. - -Example of use for export -``nxpimage ahab export "path\to\config\file.yaml"`` - -Example of use for parse binary AHAB container -``nxpimage ahab parse -b "my_ahab_container.bin" "path\to_parsed_data"`` - -.. code-block:: yaml - - # =========== Advanced High-Assurance Boot Configuration template for rt118x. =========== - # ---------------------------------------------------------------------------------------------------- - # == General Options == - # ---------------------------------------------------------------------------------------------------- - family: rt118x # [Required], MCU family, Family identifier including the chip revision. If revision is not present, latest revision is used as default., Possible options:['rt118x'] - revision: a0 # [Optional], MCU revision, Revision of silicon, Possible options:['a0'] - output: generated_ahab.bin # [Required], Output AHAB file name, Revision of silicon - containers: # [Required], List of containers present in AHAB., The order of containers in the list defines the order in AHAB. - - - # ---------------------------------------------------------------------------------------------------- - # == Optional Binary Container format to add to AHAB image == - # ---------------------------------------------------------------------------------------------------- - binary_container: # [Required], Binary AHAB container - path: my_ahab_container.bin # [Required], The AHAB container binary file, The binary file that contains AHAB "my_binary_container.bin - - - # ---------------------------------------------------------------------------------------------------- - # == Optional Configuration Container format to add to AHAB image == - # ---------------------------------------------------------------------------------------------------- - container: # [Required], AHAB Container - srk_set: oem # [Required], Super Root Key (SRK) set, Defines which set is used to authenticate the container., Possible options:['none', 'oem', 'nxp'] - used_srk_id: 0 # [Conditionally required], Used SRK, Which key from SRK set is being used. - srk_revoke_mask: 0 # [Optional], SRK revoke mask, Bitmask to indicate which SRKs to revoke. Bit set to 1 means revoke key. Bit 0 = revoke SRK_0, bit 1 = revoke SRK_1 etc. - fuse_version: 0 # [Required], Fuse version, The value must be equal or greater than the version stored in fuses to allow loading this container. - sw_version: 0 # [Required], Software version, Number used by Privileged Host Boot Companion (PHBC) to select between multiple images with same Fuse version field. - signing_key: my_signing_key.pem # [Conditionally required], AHAB container signing key, Private key used for sign the container header. Header can be signed by SRK or by image key that was signed by SRK. If an image key is used, it must be the same algorithm and key size as the SRK. In both cases, the referenced SRK must not have been revoked. - # ---------------------------------------------------------------------------------------------------- - # == Configuration of AHAB Container images (array of multiple images) == - # ---------------------------------------------------------------------------------------------------- - images: # [Required], Image array, Array of image entries. - - image_path: my_image.bin # [Required], Image path, Path to image binary (absolute/relative). - image_offset: '0x4000' # [Required], Image offset in AHAB container, Relative address for start of AHAB image (can contain multiple AHAB containers). In case of XiP type of AHAB image, the load_address and entry_point must correspond to this values. Example of setting of load_address - AHAB_IMAGE_ADDRESS+IMAGE_OFFSET=LOAD_ADDRESS - load_address: '0x5000' # [Required], Image destination address, Address the image is written to in memory (absolute address in system memory). - entry_point: '0x5000' # [Required], Image entry point, Image entry point (absolute address). Valid only for executable image types. - image_type: executable # [Required], Image type, Kind of image., Possible options:['executable', 'data', 'dcd_image', 'seco', 'provisioning_image', 'provisioning_data'] - core_id: cortex-m33 # [Required], Core ID, Defines the core the image is dedicated for., Possible options:['cortex-m33', 'cortex-m7'] - is_encrypted: false # [Required], Image encryption, Determines, whether image is encrypted or not. - boot_flags: 0 # [Optional], Boot flags, Boot flags controlling SCFW boot. - meta_data_start_cpu_id: 0 # [Optional], Start CPU ID, Resource ID of CPU to be started - meta_data_mu_cpu_id: 0 # [Optional], CPU memory unit start ID, Resource ID of the MU associated with the CPU - meta_data_start_partition_id: 0 # [Optional], Start partition ID, Partition ID of the partition to start - hash_type: sha256 # [Optional], Images HASH type, HASH type of image. All images in the container must have the same HASH type., Possible options:['sha256', 'sha384', 'sha512'] - iv_path: my_IV.bin # [Optional], IV file path, Used only for encrypted images (zero otherwise); SHA256 of the plain text image. Fixed size at 256 bits. The lower 128-bit part of the SHA256 value will be retained as IV in the encryption/decryption process. - # ---------------------------------------------------------------------------------------------------- - # == Configuration of AHAB SRK table == - # ---------------------------------------------------------------------------------------------------- - srk_table: # [Conditionally required], SRK Table, SRK (Super Root key) table definition. - hash_type: sha256 # [Required], SRK HASH type, HASH type of image. All images in the container must have the same HASH type., Possible options:['sha256', 'sha384', 'sha512'] - srk_array: # [Required], Super Root Key (SRK) table, Table containing the used SRK records. All SRKs must be of the same type. Supported signing algorithms are; RSASSA-PSS or ECDSA. Supported hash algorithms; sha256, sha384, sha512. Supported key sizes/curves; prime256v1, sec384r1, sec512r1, rsa2048, rsa4096. Certificate may be of Certificate Authority. - - my_srk_public_key0.pem - - my_srk_public_key1.pem - - my_srk_public_key2.pem - - my_srk_public_key3.pem - # ---------------------------------------------------------------------------------------------------- - # == Optional configuration of AHAB Container Certificate (if not used, erase the section) == - # ---------------------------------------------------------------------------------------------------- - certificate: # [Optional], Certificate container, Optional certificate container definition." - permissions: # [Optional], Certificate permissions, Permissions used to indicate what a certificate can be used for - - container - - secure_enclave_debug - - phbc_debug - - hdmi_debug - - soc_debug_domain_1 - - soc_debug_domain_2 - - life_cycle - - hdcp_fuses - - monotonic_counter - uuid: 00001111aaaabbbb22223333ccccdddd # [Optional], UUID, (Optional) 128-bit unique identifier - public_key: my_cert_public_key.pem # [Required], Certificate public key, Path to Public key file (RSA and ECDSA). - hash_type: sha256 # [Required], Certificate HASH type, HASH type of public key. The hash type should correspond to SRK keys., Possible options:['sha256', 'sha384', 'sha512'] - signing_key: my_cert_signing_key.pem # [Required], Certificate container signing key, Private key used for sign the certificate container. - # ---------------------------------------------------------------------------------------------------- - # == Optional configuration of AHAB Container Encryption blob (if not used, erase the section) == - # ---------------------------------------------------------------------------------------------------- - blob: # [Optional], Encryption blob, Encryption blob container definition - wrapped_key_path: my_wrapped_key.pem # [Required], KEK blob wrapped key, Wrapped Data Encryption key. Used for AES CBC-MAC (128/192/256 size). - - -The full AHAB configuration template could be generated by nxpimage tool "get_template" sub-command for family that supports AHAB, example: -``nxpimage ahab get-template -f rt118x ./my_config_templates`` - ------------------------------------------- -Flash encryption engines ------------------------------------------- - -*nxpimage* currently supports generation of bootable images and keyblobs for NXP bus encryption engines -- OTFAD (On-the-fly AES decryption engines), BEE (Bus encryption engine) and IEE (Inline encryption engine). - -IEE -^^^^^ -*nxpimage* supports generation of bootable image for MIMXRT117x. More details can be found in the security reference manual: https://www.nxp.com/webapp/sps/download/mod_download.jsp?colCode=IMXRT1170SRM&appType=moderated or in the Secure Boot modes application note https://www.nxp.com/webapp/Download?colCode=AN13250 - -IEE engine provides means to perform inline encryption and decryption. Following algorithms are supported AES-128/256-CTR and AES-256/512-XTS. -The IEE key blob containing keys and context structures is encrypted by a KEK according to the RFC3394 key-wrapping algorithm, because the key blob resides in the external memory along with the image and it must be protected - -*Generation of bootable image* -First step is to get a template for configuration. The template might look like the file below. -``nxpimage iee get-template -f rt1170 iee_template.yaml`` - -.. code-block:: yaml - - # =========== IEE: Inline Encryption Engine Configuration template for rt1170. =========== - # ---------------------------------------------------------------------------------------------------- - # == Basic Settings == - # ---------------------------------------------------------------------------------------------------- - family: rt1170 # [Required], MCU family, MCU family name., Possible options:['rt1170'] - output_folder: iee_output # [Required], IEE output directory, Path to directory where the IEE output will be generated - output_name: encrypted.bin # [Optional], Output binary image file name, File name of the output image containing keyblobs and encrypted data blobs - keyblob_name: iee_keyblob.bin # [Optional], Keyblob file name, File name of the keyblob, output_folder/keyblob_name - encrypted_name: encrypted_blob.bin # [Optional], Encrypted name, filename of the encrypted datablobs - # ---------------------------------------------------------------------------------------------------- - # == IEE Settings == - # ---------------------------------------------------------------------------------------------------- - ibkek1: '0x000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F' # [Required], IBKEK1 AES-XTS 256-bit key, IBKEK1 AES-XTS key for keyblob encryption - ibkek2: '0x202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F' # [Required], IBKEK2 AES-XTS 256-bit key, IBKEK2 AES-XTS key for keyblob encryption - keyblob_address: '0x30000000' # [Required], Base address of the IEE keyblob, Should be aligned to 1 kB - data_blobs: # [Optional], Data blobs list, List of all data blobs that will be encrypted - - data: my_data.bin # [Required], Binary data blob, Path to binary file with plain text data to be encrypted - address: '0x03001000' # [Optional], Data blob address, Data blob address, it doesn't have to be specified for S-REC - key_blobs: # [Required], List of Key Blobs used by IEE, The list of definition of individual key blobs including plain data. Add other array items as you need and device allows - - region_lock: false # [Optional], Keyblob lock attribute, Determines if the ROM will lock the IEE configuration to prevent later changes. - aes_mode: AesXTS # [Required], AES mode, AES mode, Encryption bypass, AES-XTS, AES-CTR (with or without address binding) or AES-CTR keystream only, Possible options:['Bypass', 'AesXTS', 'AesCTRWAddress', 'AesCTRWOAddress', 'AesCTRkeystream'] - key_size: CTR256XTS512 # [Required], AES key size, 128/256 for AES-CTR or 256/512 for AES-XTS, AES mode, AES-XTS or AES-CTR, Possible options:['CTR256XTS512', 'CTR128XTS256'] - page_offset: 0 # [Optional], Page offset, Page offset, IEE_REG0PO value - key1: '0x000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F' # [Required], AES-XTS key1 / AES-CTR key, AES key for the key blob, size depends on key_size - key2: '0x202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F' # [Required], AES-CTR Counter value or AES-XTS key2, AES key for the key blob, size depends on key_size - start_address: '0x30001000' # [Required], Start address of key blob data, Start address of key blob data, it should be aligned to 1 KB (1024 B) - end_address: '0x30008000' # [Required], End address of key blob data, End address of key blob data, it should be aligned to 1 KB (1024 B) - -Fill the configuration file and export the image. -``nxpimage iee export iee_template.yaml`` diff --git a/docs/apps/nxpimage.rst b/docs/apps/nxpimage.rst index 13894900..3b66a47f 100644 --- a/docs/apps/nxpimage.rst +++ b/docs/apps/nxpimage.rst @@ -7,8 +7,7 @@ Master Boot Image and Secure Binary images. This tool is successor of obsolete * replace *elftosb* is bring clear and more usable user interface to application that is used to create various kind of NXP images. To keep backward compatibility as much as possible the configuration files has been kept as is. -For more information about the supported binary images and how to configure them visit page -:ref:`Supported binary images` +Refer to the chapter supported binary images for more information. ---------------------- Command line interface diff --git a/docs/exts/generate_schemas.py b/docs/exts/generate_schemas.py index 942e4bf2..b697c19a 100644 --- a/docs/exts/generate_schemas.py +++ b/docs/exts/generate_schemas.py @@ -7,16 +7,36 @@ # Script for the automated generation of schemas documentation for elftosb/nxpimage import os from typing import Any, Dict, List, Sequence +import yaml import jsonschema2md from spsdk.image.mbimg import get_all_mbi_classes -from spsdk.sbfile.sb31.images import SecureBinary31 + +from spsdk.image.ahab.ahab_container import AHABImage +from spsdk.image.bee import BeeNxp +from spsdk.image.bootable_image.bimg import BootableImage, FCB, XMCD +from spsdk.utils.crypto.otfad import OtfadNxp +from spsdk.utils.crypto.iee import IeeNxp +from spsdk.sbfile.sb31.images import SecureBinary31, SB3_SCH_FILE, DATABASE_FILE +from spsdk.sbfile.sb2.sb_21_helper import cmds as sb2_cmds from spsdk.utils.schema_validator import ConfigTemplate, SPSDKMerger +from pytablewriter import MarkdownTableWriter DOC_PATH = os.path.abspath(".") -SCHEMAS_DIR = os.path.join(DOC_PATH, "_prebuild") -SCHEMAS_FILE = os.path.join(SCHEMAS_DIR, "schemas.inc") +DOC_DIR = os.path.join(DOC_PATH, "_prebuild") +MBI_SCHEMAS_FILE = os.path.join(DOC_DIR, "schemas.inc") +SB3_SCHEMAS_FILE = os.path.join(DOC_DIR, "schemas_sb3.inc") +AHAB_SCHEMAS_FILE = os.path.join(DOC_DIR, "ahab_schemas.inc") +OTFAD_SCHEMAS_FILE = os.path.join(DOC_DIR, "otfad_schemas.inc") +IEE_SCHEMAS_FILE = os.path.join(DOC_DIR, "iee_schemas.inc") +BEE_SCHEMAS_FILE = os.path.join(DOC_DIR, "bee_schemas.inc") +FCB_SCHEMAS_FILE = os.path.join(DOC_DIR, "fcb_schemas.inc") +XMCD_SCHEMAS_FILE = os.path.join(DOC_DIR, "xmcd_schemas.inc") +BOOTABLE_SCHEMAS_FILE = os.path.join(DOC_DIR, "bootable_schemas.inc") +SB2_TABLE_FILE = os.path.join(DOC_DIR, "table_sb21.inc") +SB3_TABLE_FILE = os.path.join(DOC_DIR, "table_sb31.inc") +BOOTABLE_TABLE_FILE = os.path.join(DOC_DIR, "table_bootable.inc") def get_schema(schemas: List[Dict[str, Any]]) -> Dict: @@ -53,15 +73,20 @@ def parse_schema(schema: Dict) -> Sequence[str]: return parser.parse_schema(schema) -def append_schema(parsed: Sequence[str], template: str) -> None: +def append_schema( + parsed: Sequence[str], + template: str, + file: str, +) -> None: """Appends schema and template to the markdown document :param parsed: sequence of MD strings :param template: string with YAML to be appended to the doc + :param file: schema file """ - if not os.path.exists(SCHEMAS_DIR): - os.makedirs(SCHEMAS_DIR) - with open(SCHEMAS_FILE, "a+") as f: + if not os.path.exists(DOC_DIR): + os.makedirs(DOC_DIR) + with open(file, "a+") as f: del parsed[1] # remove subtitle f.writelines(parsed) f.write("\n") @@ -95,6 +120,8 @@ def get_template(schemas: Dict, name: str) -> str: def get_mbi_doc() -> None: """Get doc for MBI classes.""" + if os.path.exists(MBI_SCHEMAS_FILE): + os.remove(MBI_SCHEMAS_FILE) image_classes = get_all_mbi_classes() for cls in image_classes: validation_schemas = cls.get_validation_schemas() @@ -102,11 +129,60 @@ def get_mbi_doc() -> None: schema["title"] = cls.__name__ parsed_schema = parse_schema(schema) template = get_template([schema], f"YAML template {cls.__name__}") - append_schema(parsed_schema, template) + append_schema(parsed_schema, template, MBI_SCHEMAS_FILE) + + +def get_sb3_table() -> None: + """Generates table with SB3 supported commands""" + # Load the YAML files + with open(DATABASE_FILE, "r") as file: + devices_yaml = yaml.safe_load(file) + + with open(SB3_SCH_FILE, "r") as file: + commands_yaml = yaml.safe_load(file) + + headers = ["Command", "Command Description"] + values = [] + supported_commands = {} + devices = [] + + # Iterate over the devices in the devices YAML data + for device, device_data in devices_yaml["devices"].items(): + # Check if the device has a device alias + if "device_alias" in device_data: + device_alias = device_data["device_alias"] + # Get the supported commands from the device alias + supported_commands[device] = devices_yaml["devices"][device_alias]["attributes"][ + "supported_commands" + ] + else: + supported_commands[device] = device_data["attributes"]["supported_commands"] + devices.append(device) + headers.extend(devices) + commands = commands_yaml["sb3_commands"]["properties"]["commands"]["items"]["oneOf"] + + for command in commands: + properties = command["properties"] + command_name = list(properties.keys())[0] + description = properties[command_name]["description"] + vals = [command_name, description] + + for device in devices: + if command_name in supported_commands[device]: + supported = "YES" + else: + supported = "NO" + vals.append(supported) + values.append(vals) + + write_table(headers, values, "List of SB 3.1 supported commands", SB3_TABLE_FILE) def get_sb3_doc() -> None: """Get doc for SB3 configurations.""" + # Get validation schemas DOC + if os.path.exists(SB3_SCHEMAS_FILE): + os.remove(SB3_SCHEMAS_FILE) families = SecureBinary31.get_supported_families() for fam in families: validation_schemas = SecureBinary31.get_validation_schemas(fam) @@ -114,17 +190,191 @@ def get_sb3_doc() -> None: schema["title"] = f"{SecureBinary31.__name__} for {fam}" parsed_schema = parse_schema(schema) template = get_template([schema], f"YAML template {SecureBinary31.__name__} for {fam}") - append_schema(parsed_schema, template) + append_schema(parsed_schema, template, SB3_SCHEMAS_FILE) + + +def get_ahab_doc() -> None: + """Get doc for AHAB configurations.""" + # Get validation schemas DOC + if os.path.exists(AHAB_SCHEMAS_FILE): + os.remove(AHAB_SCHEMAS_FILE) + validation_schemas = AHABImage.get_validation_schemas() + schema = get_schema(validation_schemas) + schema["title"] = f"{AHABImage.__name__}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"AHAB template {AHABImage.__name__}") + append_schema(parsed_schema, template, AHAB_SCHEMAS_FILE) + + +def get_otfad_doc() -> None: + """Get doc for OTFAD configurations.""" + # Get validation schemas DOC + if os.path.exists(OTFAD_SCHEMAS_FILE): + os.remove(OTFAD_SCHEMAS_FILE) + families = OtfadNxp.get_supported_families() + for fam in families: + validation_schemas = OtfadNxp.get_validation_schemas(fam) + schema = get_schema(validation_schemas) + schema["title"] = f"OTFAD template for {fam}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"OTFAD template for {fam}") + append_schema(parsed_schema, template, OTFAD_SCHEMAS_FILE) + + +def get_iee_doc() -> None: + """Get doc for AHAB configurations.""" + # Get validation schemas DOC + if os.path.exists(IEE_SCHEMAS_FILE): + os.remove(IEE_SCHEMAS_FILE) + families = IeeNxp.get_supported_families() + for fam in families: + validation_schemas = IeeNxp.get_validation_schemas(fam) + schema = get_schema(validation_schemas) + schema["title"] = f"IEE template for {fam}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"IEE template for {fam}") + append_schema(parsed_schema, template, IEE_SCHEMAS_FILE) + + +def get_bee_doc() -> None: + """Get doc for AHAB configurations.""" + # Get validation schemas DOC + if os.path.exists(BEE_SCHEMAS_FILE): + os.remove(BEE_SCHEMAS_FILE) + validation_schemas = BeeNxp.get_validation_schemas() + schema = get_schema(validation_schemas) + schema["title"] = f"{BeeNxp.__name__}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"BEE template") + append_schema(parsed_schema, template, BEE_SCHEMAS_FILE) + + +def get_bootable_image() -> None: + """Get bootable image schemas.""" + if os.path.exists(BOOTABLE_SCHEMAS_FILE): + os.remove(BOOTABLE_SCHEMAS_FILE) + families = BootableImage.get_supported_families() + for fam in families: + memories = BootableImage.get_supported_memory_types(fam) + for mem in memories: + validation_schemas = BootableImage.get_validation_schemas(fam, mem) + schema = get_schema(validation_schemas) + schema["title"] = f"Bootable Image template for {fam} and {mem}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"Bootable Image template for {fam} and {mem}") + append_schema(parsed_schema, template, BOOTABLE_SCHEMAS_FILE) + + +def get_bootable_image_table() -> None: + """Get bootable image table.""" + values = [] + families = BootableImage.get_supported_families() + for fam in families: + supported_memory = BootableImage.get_supported_memory_types(fam) + for mem in supported_memory: + config = BootableImage.get_memory_type_config(fam, mem) + values.append([fam, mem, "```" + str(config) + "```"]) + + write_table( + ["Family", "Memory Type", "Offsets"], + values, + "List of devices and supported memory types", + BOOTABLE_TABLE_FILE, + ) + + +def get_fcb_doc() -> None: + """Get doc for FCB configurations.""" + # Get validation schemas DOC + if os.path.exists(FCB_SCHEMAS_FILE): + os.remove(FCB_SCHEMAS_FILE) + families = FCB.get_supported_families() + for fam in families: + memories = FCB.get_supported_memory_types(fam) + for mem in memories: + validation_schemas = FCB.get_validation_schemas(fam, mem) + schema = get_schema(validation_schemas) + schema["title"] = f"FCB template for {fam} and {mem}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"FCB template for {fam} and {mem}") + append_schema(parsed_schema, template, FCB_SCHEMAS_FILE) + + +def get_xmcd_doc() -> None: + """Get doc for XMCD configurations.""" + # Get validation schemas DOC + if os.path.exists(XMCD_SCHEMAS_FILE): + os.remove(XMCD_SCHEMAS_FILE) + families = XMCD.get_supported_families() + for fam in families: + memories = XMCD.get_supported_memory_types(fam) + for mem in memories: + validation_schemas = XMCD.get_validation_schemas(fam, mem, "full") + schema = get_schema(validation_schemas) + schema["title"] = f"XMCD template for {fam} and {mem}" + parsed_schema = parse_schema(schema) + template = get_template([schema], f"XMCD template for {fam} and {mem}") + append_schema(parsed_schema, template, XMCD_SCHEMAS_FILE) + + +def write_table(header: List[str], values: List[List[str]], table_name: str, table_file_path: str): + """Write MD table to file using pytablewriter + + :param header: table header + :param values: values to be writter + :param table_name: Name of the table + :param table_file_path: Path to the file + """ + writer = MarkdownTableWriter( + table_name=table_name, + headers=header, + value_matrix=values, + ) + + if not os.path.exists(DOC_DIR): + os.makedirs(DOC_DIR) + + with open(table_file_path, "w") as f: + writer.stream = f + writer.write_table() + + +def get_sb2_doc() -> None: + """Get doc for SB2 commands.""" + doc_lst = [] + for key, val in sb2_cmds.items(): + doc = [ + line.strip() + for line in val.__doc__.split("\n\n") + if not (line.strip().startswith(":") or line.strip().startswith("Returns")) + ] + doc_lst.append([key, doc[0], r"" + doc[1].replace("\n", "
") + r"
"]) + write_table( + ["Command", "Description", "Example"], + doc_lst, + "Supported commands for SB2.1", + SB2_TABLE_FILE, + ) def main(): print("Running generate schemas script") - if os.path.exists(SCHEMAS_FILE): - os.remove(SCHEMAS_FILE) + if os.path.exists(MBI_SCHEMAS_FILE): + os.remove(MBI_SCHEMAS_FILE) print("Existing schemas file has been removed") get_mbi_doc() get_sb3_doc() + get_sb2_doc() + get_sb3_table() + get_ahab_doc() + get_otfad_doc() + get_iee_doc() + get_bee_doc() + get_bootable_image() + get_bootable_image_table() + get_fcb_doc() + get_xmcd_doc() print("Finished running") diff --git a/docs/images/ahab.rst b/docs/images/ahab.rst new file mode 100644 index 00000000..b4401ab6 --- /dev/null +++ b/docs/images/ahab.rst @@ -0,0 +1,23 @@ +------ +AHAB +------ + +AHAB (Advanced High Assurance Boot) is a container format supported on some devices. A configuration file in YAML or +JSON is used to instruct nxpimage how the output should look like. + +AHAB container is not supported by elftosb tool. + +Example of use for export +``nxpimage ahab export "path\to\config\file.yaml"`` + +Example of use for parse binary AHAB container +``nxpimage ahab parse -b "my_ahab_container.bin" "path\to_parsed_data"`` + +The full AHAB configuration template could be generated by nxpimage tool "get_template" sub-command for family that supports AHAB, example: +``nxpimage ahab get-template -f rt118x ./my_config_templates`` + +Supported configuration options +================================ + +.. include:: ../_prebuild/ahab_schemas.inc + :parser: myst_parser.sphinx_ diff --git a/docs/images/bootable.rst b/docs/images/bootable.rst new file mode 100644 index 00000000..59903389 --- /dev/null +++ b/docs/images/bootable.rst @@ -0,0 +1,31 @@ +=============== +Bootable Image +=============== + +Bootable image encapsulates the executable application images and adds additional data processed by the bootROM that are needed for boot, like for example configuration of the flash memories. +The bootable image might consists of: + +- Keyblob for data decryption +- Keystore +- FlexSPI Configuration Block (FCB) +- External Memory Configuration Data (XMCD) +- Device Configuration Data (DCD) - The DCD contains configuration data to configure any peripherals. +- Application Image - It might contain plain application image or HAB or AHAB image. + + +.. toctree:: + :caption: Sub images + :maxdepth: 1 + + fcb + xmcd + +------------------------------------------- +List of supported devices and memory types +------------------------------------------- + +.. include:: ../_prebuild/table_bootable.inc + :parser: myst_parser.sphinx_ + +.. include:: ../_prebuild/bootable_schemas.inc + :parser: myst_parser.sphinx_ diff --git a/docs/images/executable.rst b/docs/images/executable.rst new file mode 100644 index 00000000..d852f191 --- /dev/null +++ b/docs/images/executable.rst @@ -0,0 +1,14 @@ +========================== +Executable Images +========================== + +Executable Images can be executed by the bootROM. They might be divided into three categories based on the additional information they provide: *Plain*, *Signed*, *Encrypted*. +Plain images provide just minimal additional information like for example image version and IVT table. Signed and encrypted images provide additional security to boot process. + +.. toctree:: + :caption: Executable Images + :maxdepth: 1 + + mbi + hab + ahab diff --git a/docs/images/fcb.rst b/docs/images/fcb.rst new file mode 100644 index 00000000..d065ed23 --- /dev/null +++ b/docs/images/fcb.rst @@ -0,0 +1,6 @@ +FlexSPI Configuration Block (FCB) +"""""""""""""""""""""""""""""""""""""""" +The FCB will configure the settings of the FlexSPI communication. It will establish how many ports will be used, what clock speed to run the FlexSPI controller at, etc. This is the first thing that happens, as everything else is stored in Flash memory. In order to read anything else, the flash must first be configured. + +.. include:: ../_prebuild/fcb_schemas.inc + :parser: myst_parser.sphinx_ diff --git a/docs/images/flash.rst b/docs/images/flash.rst new file mode 100644 index 00000000..751af146 --- /dev/null +++ b/docs/images/flash.rst @@ -0,0 +1,82 @@ + +========================= +Flash encryption engines +========================= + +*nxpimage* currently supports generation of bootable images and keyblobs for NXP bus encryption engines -- OTFAD (On-the-fly AES decryption engines), BEE (Bus encryption engine) and IEE (Inline encryption engine). + +.. note:: For Prince algorithm based inline encryption & decryption engines (IPED, Prince & NPX) we don't support offline image creation. + +---- +IEE +---- + +*nxpimage* supports generation of bootable image for MIMXRT117x. More details can be found in the security reference manual: https://www.nxp.com/webapp/sps/download/mod_download.jsp?colCode=IMXRT1170SRM&appType=moderated or in the Secure Boot modes application note https://www.nxp.com/webapp/Download?colCode=AN13250 + +IEE engine provides means to perform inline encryption and decryption. Following algorithms are supported AES-128/256-CTR and AES-256/512-XTS. +The IEE key blob containing keys and context structures is encrypted by a KEK according to the RFC3394 key-wrapping algorithm, because the key blob resides in the external memory along with the image and it must be protected + +*Generation of bootable image* +First step is to get a template for configuration. The template might look like the file below. +``nxpimage iee get-template -f rt1170 iee_template.yaml`` + + +.. include:: ../_prebuild/iee_schemas.inc + :parser: myst_parser.sphinx_ + +.. code-block:: yaml + + # =========== IEE: Inline Encryption Engine Configuration template for rt1170. =========== + # ---------------------------------------------------------------------------------------------------- + # == Basic Settings == + # ---------------------------------------------------------------------------------------------------- + family: rt1170 # [Required], MCU family, MCU family name., Possible options:['rt1170'] + output_folder: iee_output # [Required], IEE output directory, Path to directory where the IEE output will be generated + output_name: encrypted.bin # [Optional], Output binary image file name, File name of the output image containing keyblobs and encrypted data blobs + keyblob_name: iee_keyblob.bin # [Optional], Keyblob file name, File name of the keyblob, output_folder/keyblob_name + encrypted_name: encrypted_blob.bin # [Optional], Encrypted name, filename of the encrypted datablobs + # ---------------------------------------------------------------------------------------------------- + # == IEE Settings == + # ---------------------------------------------------------------------------------------------------- + ibkek1: '0x000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F' # [Required], IBKEK1 AES-XTS 256-bit key, IBKEK1 AES-XTS key for keyblob encryption + ibkek2: '0x202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F' # [Required], IBKEK2 AES-XTS 256-bit key, IBKEK2 AES-XTS key for keyblob encryption + keyblob_address: '0x30000000' # [Required], Base address of the IEE keyblob, Should be aligned to 1 kB + data_blobs: # [Optional], Data blobs list, List of all data blobs that will be encrypted + - data: my_data.bin # [Required], Binary data blob, Path to binary file with plain text data to be encrypted + address: '0x03001000' # [Optional], Data blob address, Data blob address, it doesn't have to be specified for S-REC + key_blobs: # [Required], List of Key Blobs used by IEE, The list of definition of individual key blobs including plain data. Add other array items as you need and device allows + - region_lock: false # [Optional], Keyblob lock attribute, Determines if the ROM will lock the IEE configuration to prevent later changes. + aes_mode: AesXTS # [Required], AES mode, AES mode, Encryption bypass, AES-XTS, AES-CTR (with or without address binding) or AES-CTR keystream only, Possible options:['Bypass', 'AesXTS', 'AesCTRWAddress', 'AesCTRWOAddress', 'AesCTRkeystream'] + key_size: CTR256XTS512 # [Required], AES key size, 128/256 for AES-CTR or 256/512 for AES-XTS, AES mode, AES-XTS or AES-CTR, Possible options:['CTR256XTS512', 'CTR128XTS256'] + page_offset: 0 # [Optional], Page offset, Page offset, IEE_REG0PO value + key1: '0x000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F' # [Required], AES-XTS key1 / AES-CTR key, AES key for the key blob, size depends on key_size + key2: '0x202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F' # [Required], AES-CTR Counter value or AES-XTS key2, AES key for the key blob, size depends on key_size + start_address: '0x30001000' # [Required], Start address of key blob data, Start address of key blob data, it should be aligned to 1 KB (1024 B) + end_address: '0x30008000' # [Required], End address of key blob data, End address of key blob data, it should be aligned to 1 KB (1024 B) + +Fill the configuration file and export the image. +``nxpimage iee export iee_template.yaml`` + +------ +OTFAD +------ + +The On-The-Fly AES Decryption (OTFAD) module provides an advanced hardware implementation that minimizes any incremental cycles of latency introduced by the decryption in the overall external memory-access time. +It implements a block cipher mode of operation supporting the counter mode (CTR). +The CTR mode provides a confidentiality mode that features the application of the forward cipher to a set of input blocks (called counters) to produce a sequence of output blocks that are exclusive-ORed with the plaintext to produce the ciphertext and vice versa. +The OTFAD engine includes complete hardware support for a standard AES key unwrap mechanism to decrypt a key BLOB data instruction containing the parameters needed for up to 4 unique AES contexts. Each context has a unique 128-bit key, a 64-bit counter, and a 64-bit memory region descriptor. + +.. include:: ../_prebuild/otfad_schemas.inc + :parser: myst_parser.sphinx_ + + +------ +BEE +------ + +i.MX RT10xx, except i.MX1010, provides an on-the-fly encryption engine called Bus Encryption Engine(BEE) +Refer to this application note for more info: +`AN12852 `_. + +.. include:: ../_prebuild/bee_schemas.inc + :parser: myst_parser.sphinx_ diff --git a/docs/images/hab.rst b/docs/images/hab.rst new file mode 100644 index 00000000..ad204a33 --- /dev/null +++ b/docs/images/hab.rst @@ -0,0 +1,255 @@ +------ +HAB +------ + +HAB (High Assurance Boot) provides a mechanism to ensure that the running software can be trusted. +Nxpimage application is used for generation of HAB container including CSF data and image encryption(if applicable). +It is an actual successor of legacy elftosb and CST tools. + +Compared to other SPSDK image types, the HAB container configuration is stored in BD configuration files. +The main reason for it is keeping the backwards compatibility with legacy elftosb and CST tools. +BD configuration file instructs nxpimage how the image and CSF data will look like. + +There are three supported types of images: + +* plain +* authenticated +* encrypted + + +Examples +================================ +| HAB Export +| ``nxpimage hab export --command "path\to\config\file.bd" --output path\to\output.bin`` + +| HAB Parse +| ``nxpimage hab parse --binary "path\to\output.bin" path\to\output\dir`` + + +Configuration file types +================================ + + +.. code-block:: + :caption: Example of Plain BD config + + options { + flags = 0x00; + startAddress = 0x2024ff00; + ivtOffset = 0x0; + initialLoadSize = 0x100; + + entryPointAddress = 0x202629e1; + } + + sources { + elfFile = extern(0); + } + + section (0) { + } + + +.. code-block:: + :caption: Example of Authenticated BD config + + options { + flags = 0x08; + startAddress = 0x1000; + ivtOffset = 0x1000; + initialLoadSize = 0x2000; + entryPointAddress = 0x34e1; + } + + sources { + elfFile = extern(0); + } + + constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; + } + + section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) + { + } + + section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) + { + } + + section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) + { + } + + section (SEC_CSF_AUTHENTICATE_CSF) + { + } + + section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) + { + } + + section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) + { + } + + section (SEC_SET_ENGINE; + SetEngine_HashAlgorithm = "sha256", + SetEngine_Engine = "ANY", + SetEngine_EngineConfiguration = "0") + { + } + + section (SEC_UNLOCK; + Unlock_Engine = "SNVS", + Unlock_features = "ZMK WRITE" + ) + { + } + +.. code-block:: + :caption: Example of Encrypted BD config + + options { + flags = 0x0c; + startAddress = 0x80001000; + ivtOffset = 0x400; + initialLoadSize = 0x1000; + DCDFilePath = "dcd_files\evkmimxrt1166_SDRAM_dcd.bin"; + entryPointAddress = 0x800041f5; + } + + sources { + elfFile = extern(0); + } + + constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; + } + + section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) + { + } + + section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) + { + } + + section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) + { + } + + section (SEC_CSF_AUTHENTICATE_CSF) + { + } + + section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) + { + } + + section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) + { + } + + section (SEC_CSF_INSTALL_SECRET_KEY; + SecretKey_Name="gen_hab_encrypt\evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin", + SecretKey_Length=256, + SecretKey_VerifyIndex=0, + SecretKey_TargetIndex=0) + { + } + + section (SEC_CSF_DECRYPT_DATA; + Decrypt_Engine="ANY", + Decrypt_EngineConfiguration="0", + Decrypt_VerifyIndex=0, + Decrypt_MacBytes=16) + { + } + + +Additional configuration parameters +==================================== + +| Although the nxpimage application fully supports legacy elftosb configuration files, the support of some new optional parameters has been added. +| Newly added BD configuration parameters: + + ++---------------------------------+----------------------------+--------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ +| Name | BD Section | Example | Description | ++=================================+============================+================================================================================+=======================================================================================================================+ +| signatureTimestamp | options | signatureTimestamp = "11/05/2023 11:58:00"; | Timestamp of generated signature | ++---------------------------------+----------------------------+--------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ +| AuthenticateCsf_PrivateKeyFile | SEC_CSF_AUTHENTICATE_CSF | AuthenticateCsf_PrivateKeyFile="keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem" | Path to authenticate CSF private key file. If not set, the file will be determined from InstallCSFK_File parameter | ++---------------------------------+----------------------------+--------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ +| AuthenticateData_PrivateKeyFile | SEC_CSF_AUTHENTICATE_DATA | AuthenticateData_PrivateKeyFile="keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem" | Path to authenticate IMG private key file. If not set, the file will be determined from InstallKey_File parameter | ++---------------------------------+----------------------------+--------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ +| SecretKey_ReuseDek | SEC_CSF_INSTALL_SECRET_KEY | SecretKey_ReuseDek=true | If set, the secret key from SecretKey_Name parameter will be used. If not, a random key will be generated and stored. | ++---------------------------------+----------------------------+--------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ +| Decrypt_Nonce | SEC_CSF_DECRYPT_DATA | Decrypt_Nonce="gen_hab_encrypt/nonce.bin" | If set, the nonce from the given file will be used. If not, a random nonce will be generated. | ++---------------------------------+----------------------------+--------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ + diff --git a/docs/images/mbi.rst b/docs/images/mbi.rst new file mode 100644 index 00000000..bc5391bc --- /dev/null +++ b/docs/images/mbi.rst @@ -0,0 +1,102 @@ + +------------------------- +Master Boot Image (MBI) +------------------------- + +Master Boot Image can be used directly (e.g. by using *blhost write-memory* command) or it can be used for further processing (e.g. used as input to Secure Binary image container). +Image is created based on a supplied configuration file, either JSON or YAML is supported. + +We can divide divide into two categories based on layout. + +* eXecute-In-Place (XIP) images + * Plain + * CRC + * Signed + +* Load-to-RAM images + * Plain + * CRC + * Signed images with HMAC signed header. Since load-to-RAM copies the image from untrusted media to on-chip RAM, the length field in header should be authenticated before copy. Hence HMAC signed headers are used. + * Encrypted (plain header with HMAC + AES-CBC encrypted). + +Example of use + +nxpimage: ``nxpimage mbi export `` + +Sample configuration for LPC55s6x plain signed XIP image. Other sample configurations might be obtained with the *get-templates* sub-command. + +.. code-block:: yaml + + # =========== Master Boot Image Configuration template for lpc55s6x, Plain Signed XIP Image. =========== + # + # == Basic Settings == + # + family: lpc55s6x # MCU family., MCU family name. + outputImageExecutionTarget: Internal flash (XIP) # Application target., Definition if application is Execute in Place(XiP) or loaded to RAM during reset sequence. + outputImageAuthenticationType: Signed # Type of boot image authentication., Specification of final master boot image authentication. + masterBootOutputFile: my_mbi.bin # Master Boot Image name., The file for Master Boot Image result file. + inputImageFile: my_application.bin # Plain application image., The input application image to by modified to Master Boot Image. + # + # == Trust Zone Settings == + # + enableTrustZone: false # TrustZone enable option, If not specified, the Trust zone is disabled. + trustZonePresetFile: my_tz_custom.yaml # TrustZone Customization file, If not specified, but TrustZone is enabled(enableTrustZone) the default values are used. + # + # == Certificate V2 Settings == + # + mainCertPrivateKeyFile: my_prv_key.pem # Main Certificate private key, Main Certificate private key used to sign certificate + imageBuildNumber: 0 # Image Build Number, If it's omitted, it will be used 0 as default value. + rootCertificate0File: my_certificate0.pem # Root Certificate File 0, Root certificate file index 0. + rootCertificate1File: my_certificate1.pem # Root Certificate File 1, Root certificate file index 1. + rootCertificate2File: my_certificate2.pem # Root Certificate File 2, Root certificate file index 2. + rootCertificate3File: my_certificate3.pem # Root Certificate File 3, Root certificate file index 3. + mainCertChainId: 0 # Main Certificate Index, Index of certificate that is used as a main. + chainCertificate0File0: chain_certificate0_depth0.pem # Chain certificate 0 for root 0, Chain certificate 0 for root certificate 0 + chainCertificate0File1: chain_certificate0_depth1.pem # Chain certificate 1 for root 0, Chain certificate 1 for root certificate 0 + chainCertificate0File2: chain_certificate0_depth2.pem # Chain certificate 2 for root 0, Chain certificate 2 for root certificate 0 + chainCertificate0File3: chain_certificate0_depth3.pem # Chain certificate 3 for root 0, Chain certificate 3 for root certificate 0 + chainCertificate1File0: chain_certificate1_depth0.pem # Chain certificate 0 for root 1, Chain certificate 0 for root certificate 1 + chainCertificate1File1: chain_certificate1_depth1.pem # Chain certificate 1 for root 1, Chain certificate 1 for root certificate 1 + chainCertificate1File2: chain_certificate1_depth2.pem # Chain certificate 2 for root 1, Chain certificate 2 for root certificate 1 + chainCertificate1File3: chain_certificate1_depth3.pem # Chain certificate 3 for root 1, Chain certificate 3 for root certificate 1 + chainCertificate2File0: chain_certificate2_depth0.pem # Chain certificate 0 for root 2, Chain certificate 0 for root certificate 2 + chainCertificate2File1: chain_certificate2_depth1.pem # Chain certificate 1 for root 2, Chain certificate 1 for root certificate 2 + chainCertificate2File2: chain_certificate2_depth2.pem # Chain certificate 2 for root 2, Chain certificate 2 for root certificate 2 + chainCertificate2File3: chain_certificate2_depth3.pem # Chain certificate 3 for root 2, Chain certificate 3 for root certificate 2 + chainCertificate3File0: chain_certificate3_depth0.pem # Chain certificate 0 for root 3, Chain certificate 0 for root certificate 3 + chainCertificate3File1: chain_certificate3_depth1.pem # Chain certificate 1 for root 3, Chain certificate 1 for root certificate 3 + chainCertificate3File2: chain_certificate3_depth2.pem # Chain certificate 2 for root 3, Chain certificate 2 for root certificate 3 + chainCertificate3File3: chain_certificate3_depth3.pem # Chain certificate 3 for root 3, Chain certificate 3 for root certificate 3 + + +Supported devices for MBI +========================== + +NXPIMAGE support devices from LPC55xx family (*LPC55S0x, LPC55S1x, LPC55S2x, LPC552x, LPC55S6x*), *RT5xx*, *RT6xx* and *LPC55S3x*. +Supported execution targets are: *Internal flash (XIP), External Flash (XIP) and Load to RAM* and image authentication types: *Plain, CRC, Signed, Encrypted and NXP Signed*. + +The following table shows the supported image types for each device, +it either shows "N/A" if the configuration is not available or respective class that will be used for image creation. + +*Target* in the table represents *outputImageExecutionTarget* in the configuration file and *authentication* in the table represents *outputImageAuthenticationType*. + +.. include:: ../_prebuild/table.inc + + + +Supported configuration options +================================ + +Refer to the documentation below for the supported configuration options for each image type. +Please note that the *outputImageExecutionTarget* and *outputImageAuthenticationType* must be filled in addition to the basic settings according to the table with supported devices. + + +.. code-block:: yaml + + outputImageExecutionTarget: Internal flash (XIP) # Application target., Definition if application is Execute in Place(XiP) or loaded to RAM during reset sequence. + outputImageAuthenticationType: Signed # Type of boot image authentication., Specification of final master boot image authentication. + + +.. include:: ../_prebuild/schemas.inc + :parser: myst_parser.sphinx_ + diff --git a/docs/images/sb2.rst b/docs/images/sb2.rst new file mode 100644 index 00000000..a4be685b --- /dev/null +++ b/docs/images/sb2.rst @@ -0,0 +1,49 @@ +------------------ +Secure Binary 2.1 +------------------ + +Version 2.1 added support for digital signatures. + +The SB 2.0 and 2.1 file format also uses AES encryption for confidentiality and HMAC for +extending trust from the signed part of the SB file to the command and data part of the SB +file. These two keys (AES decrypt key and HMAC key) are wrapped in the RFC3394 key +blob, for which the key wrapping key is the SBKEK key + + +SB2 generation using BD file +============================= + +The tool uses an input command file to control the sequence of bootloader commands present in the output file. +This command file is called a "boot descriptor file" or BD file for short. +The image location is stated in the "sources" section of the .bd file. +The SB key in the text file is used for encryption with the *nxpimage* command line tool. + +It is possible to use NXP elftosb tool user guide located `here `_. + +.. note:: Please note that some functionality described in the UG may not be supported in SPSDK SB2 parser. + +For more information about the Secure boot setup for LPC55Sxx family follow the `AN12283 +`_. + +Supported Commands + +.. include:: ../_prebuild/table_sb21.inc + :parser: myst_parser.sphinx_ + + +Example of SB2 generation for 4 root keys + +nxpimage: ``nxpimage sb21 export -k "sbkek.txt" -c "commandFile.bd" -o "output.sb2" -s private_key_1_2048.pem +-S certificate_1_2048.der.crt -R certificate_1_2048.der.crt -R +certificate_2_2048.der.crt -R certificate_3_2048.der.crt -R certificate_4_2048.der.crt -h "RHKT.bin" +"input.bin"`` + + +Created SB2 file can be loaded into the device using blhost *receive-sb-file* command. +``blhost -p COMxx receive-sb-file `` + + +Description of how to use BD file is in bellow chapter. + +.. include:: ../usage/elf2sb.md + :parser: myst_parser.sphinx_ diff --git a/docs/images/sb3.rst b/docs/images/sb3.rst new file mode 100644 index 00000000..e5f44479 --- /dev/null +++ b/docs/images/sb3.rst @@ -0,0 +1,25 @@ +------------------ +Secure Binary 3.1 +------------------ + +SB 3.1 is an evolution of the SB 2 format. +The configuration is done in a similar way as a master boot image by configuration file in YAML or JSON. BD files are no longer used, commands are supplied in the configuration file. + +Example of use +nxpimage: ``nxpimage sb31 export "sb3_config.yaml`` + + +Supported commands +============================= + + +.. include:: ../_prebuild/table_sb31.inc + :parser: myst_parser.sphinx_ + + + +Supported configuration options +================================= + +.. include:: ../_prebuild/schemas_sb3.inc + :parser: myst_parser.sphinx_ diff --git a/docs/images/secure_update.rst b/docs/images/secure_update.rst new file mode 100644 index 00000000..5c0b995b --- /dev/null +++ b/docs/images/secure_update.rst @@ -0,0 +1,23 @@ +========================== +Secure update +========================== + +Containers used for secure device firmware ugprade that cannot be executed directly on target but must be processed by the bootROM first. + +-------------- +Secure Binary +-------------- + +Secure binary is a binary output file that contains the user's application image along with a series of bootloader commands. +The output file is known as a "Secure Binary" or SB file for short. +These files typically have an .sb extension. + +This format has a long history, the latest version is 3.1. (2022). +SPSDK nxpimage tool supports SB 2.1 (2.0) and SB 3.1. + +.. toctree:: + :caption: Secure Binary + :maxdepth: 1 + + sb2 + sb3 diff --git a/docs/images/xmcd.rst b/docs/images/xmcd.rst new file mode 100644 index 00000000..98751630 --- /dev/null +++ b/docs/images/xmcd.rst @@ -0,0 +1,6 @@ +External Memory Configuration Data (XMCD) +"""""""""""""""""""""""""""""""""""""""""" +The XMCD is used for configuration of external memories (RAM) + +.. include:: ../_prebuild/xmcd_schemas.inc + :parser: myst_parser.sphinx_ diff --git a/docs/index.rst b/docs/index.rst index d70f50b6..20dfb2a4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,6 +22,15 @@ Secure Provisioning SDK (SPSDK) usage/applications usage/apis +.. toctree:: + :caption: Supported Binary Images + :maxdepth: 1 + + images/executable + images/secure_update + images/flash + images/bootable + .. toctree:: :caption: Application User Guides :maxdepth: 1 @@ -42,7 +51,7 @@ Secure Provisioning SDK (SPSDK) apps/shadowregs apps/trust_provisioning - apps/images + .. toctree:: :caption: API Development Guide diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 71c0f7c4..c3760da5 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -8,6 +8,27 @@ Release Notes ============= +--------------------- +1.10.1 (26-May-2023) +--------------------- + +**New features** + +* :ref:`nxpimage`: + - support encrypted image hab + - support for RT11xx and RT10xx + - improve OTFAD/IEE names generation +* add API to retrieve info about fuses + +**Bugfixes** + +* :ref:`nxpimage`: + - fix XMCD load_from_config + - fix IEE template +* fix circular dependency in signature provider import +* fix issue with loading keys as INT +* not enable logging when spsdk is used as a library + ----------------------- 1.10.0 (5-April-2023) ----------------------- @@ -388,7 +409,7 @@ Release Notes * :ref:`elftosb`: - * support for :ref:`SB 2.1 generation using BD file` + * support for SB 2.1 generation using BD file * LPC55S3x - add support for unsigned/plain images * SB2.1 - SHA256 digest of all sections included in signed SB2.1 header * add supported families listing into elftosb diff --git a/docs/usage/elf2sb.md b/docs/usage/elf2sb.md index d5d25388..49e2d0bd 100644 --- a/docs/usage/elf2sb.md +++ b/docs/usage/elf2sb.md @@ -1,4 +1,4 @@ -# SB 2.1 generation using BD file +# Parser grammar This is a user guide describing how to generate a secure binary rev. 2.1 based on a configuration file (a so called BD file or command file) and additional inputs like certificates, keys, binary files etc. diff --git a/examples/jupyter_examples/init_notebook.ipynb b/examples/jupyter_examples/init_notebook.ipynb new file mode 100644 index 00000000..b5ff7083 --- /dev/null +++ b/examples/jupyter_examples/init_notebook.ipynb @@ -0,0 +1,34 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initializaton notebook for SPSDK examples\n", + "This notebook contains initialization for the SPSDK examples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This env variable sets colored logger output to STDOUT\n", + "%env JUPYTER_SPSDK=1\n", + "# Seto magic for command execution and echo\n", + "%alias execute echo %l && %l\n", + "%alias_magic ! execute" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/jupyter_examples/kw45xx_k32w1xx/kw45xx_k32w1xx_load_NBU_image.ipynb b/examples/jupyter_examples/kw45xx_k32w1xx/kw45xx_k32w1xx_load_NBU_image.ipynb index 59ecb9a8..0a7935fa 100644 --- a/examples/jupyter_examples/kw45xx_k32w1xx/kw45xx_k32w1xx_load_NBU_image.ipynb +++ b/examples/jupyter_examples/kw45xx_k32w1xx/kw45xx_k32w1xx_load_NBU_image.ipynb @@ -39,8 +39,7 @@ } ], "source": [ - "%alias execute echo %l && %l\n", - "%alias_magic ! execute\n", + "%run ../init_notebook.ipynb\n", "\n", "import os\n", "import pprint\n", diff --git a/examples/jupyter_examples/lpc55sxx_secure_boot/lpc55sxx_secure_boot.ipynb b/examples/jupyter_examples/lpc55sxx_secure_boot/lpc55sxx_secure_boot.ipynb index 8f5a33b3..56501d1a 100644 --- a/examples/jupyter_examples/lpc55sxx_secure_boot/lpc55sxx_secure_boot.ipynb +++ b/examples/jupyter_examples/lpc55sxx_secure_boot/lpc55sxx_secure_boot.ipynb @@ -48,8 +48,7 @@ } ], "source": [ - "%alias execute echo %l && %l\n", - "%alias_magic ! execute\n", + "%run ../init_notebook.ipynb\n", "\n", "import os\n", "import pprint\n", diff --git a/release_notes.txt b/release_notes.txt index 550b3092..2c205861 100644 --- a/release_notes.txt +++ b/release_notes.txt @@ -7,35 +7,23 @@ configure the device, prepare, download and upload data, including security oper delivered in the form of a python library and command-line applications. -Version: 1.10.0 -============== -Date: 5-April-2023 +Version: 1.10.1 +================ +Date: 26-May-2023 New features -- blhost: - - add new command: ele_message -- nxpdebugmbox: - - add command: read UUID from device - - update PyOCD to latest version to support CMSIS DAP FW v3 -- nxpdevhsm: - - USER_PCK rename to CUST_MK_SK - nxpimage: - - add subcommand group for generate and parse certificate block - - replace private key to signature provider in master boot image - - OTFAD support for RT1170 -- ifr: - - add commands read/write -- pfr: - - add CMPA erase command + - support encrypted image hab + - support for RT11xx and RT10xx + - improve OTFAD/IEE names generation +- add API to retrieve info about fuses Bugfixes -- nxpdebugmbox: - - fix AP selection issue for PyOCD and PEMICRO - - fix DAC verification when there is only 1 root key - nxpimage: - - fix MBI issue with HMAC -- shadowregs: - - fix endianness for OTP MASTER KEY -- drop support for Python 3.7 + - fix XMCD load_from_config + - fix IEE template +- fix circular dependency in signature provider import +- fix issue with loading keys as INT +- not enable logging when spsdk is used as a library Supported devices ================= @@ -62,6 +50,28 @@ Python 3.8+ interpreter, old version 2.x is not supported Revision History ================ +1.10.0 +- blhost: + - add new command: ele_message +- ifr: + - add commands read/write +- nxpdebugmbox: + - add command: read UUID from device + - update PyOCD to latest version to support CMSIS DAP FW v3 + - fix AP selection issue for PyOCD and PEMICRO + - fix DAC verification when there is only 1 root key +- nxpdevhsm: + - USER_PCK rename to CUST_MK_SK +- nxpimage: + - add subcommand group for generate and parse certificate block + - replace private key to signature provider in master boot image + - OTFAD support for RT1170 + - fix MBI issue with HMAC +- pfr: + - add CMPA erase command +- shadowregs: + - fix endianness for OTP MASTER KEY +- drop support for Python 3.7 1.9.1 - nxpdebugmbox: - fix Linux error on PyOCD diff --git a/requirements-develop.txt b/requirements-develop.txt index 9f4f8bd3..f7f38316 100644 --- a/requirements-develop.txt +++ b/requirements-develop.txt @@ -2,32 +2,32 @@ tox<4.5 -r requirements.txt # testing -pytest<7.3 +pytest<7.4 pytest-cov<4.1 pytest-xdist<3.3 voluptuous<0.14 # metrics -radon<5.2 -mypy>=0.800,<1.2 +radon<6.1 +mypy>=0.800,<1.3 types-requests>=2.26,<2.29 types-setuptools<67.7 types-pyyaml<6.1 # codestyle pylint>=2.6.0,<2.18 pydocstyle[toml]<6.4 -black<23.2 +black<23.4 # cli executables -pyinstaller<5.10 -pyinstaller-hooks-contrib<2023.2 +pyinstaller<5.11 +pyinstaller-hooks-contrib<2023.3 # developement/CI tools bump2version<1.1 pre-commit<3.3 openpyxl<3.2 -cachier<2.1 +cachier<2.2 jira<3.6 inquirerpy<0.4 # examples flask<2.3 requests<2.29 -ipython<8.12 +ipython<8.13 notebook<6.6 diff --git a/spsdk/__init__.py b/spsdk/__init__.py index 77554a72..3cc00115 100644 --- a/spsdk/__init__.py +++ b/spsdk/__init__.py @@ -20,10 +20,6 @@ import logging import logging.config import os -import re -from typing import Any, Mapping, Optional - -import colorama from .__version__ import __version__ as version from .exceptions import ( @@ -46,75 +42,6 @@ SPSDK_DATA_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") SPSDK_YML_INDENT = 2 -colorama.just_fix_windows_console() - - -class ColoredFormatter(logging.Formatter): - """Colored Formatter. - - SPSDK modified formatter class. - """ - - FORMAT = logging.BASIC_FORMAT - FORMAT_DEBUG = FORMAT + " (%(relativeCreated)dms since start, %(filename)s:%(lineno)d)" - - COLORED_FORMATS = { - logging.DEBUG: colorama.Fore.BLUE + FORMAT_DEBUG + colorama.Fore.RESET, - logging.INFO: colorama.Fore.WHITE - + colorama.Style.BRIGHT - + FORMAT - + colorama.Fore.RESET - + colorama.Style.RESET_ALL, - logging.WARNING: colorama.Fore.YELLOW + FORMAT_DEBUG + colorama.Fore.RESET, - logging.ERROR: colorama.Fore.RED + FORMAT_DEBUG + colorama.Fore.RESET, - logging.CRITICAL: colorama.Fore.RED - + colorama.Style.BRIGHT - + FORMAT_DEBUG - + colorama.Fore.RESET - + colorama.Style.RESET_ALL, - } - FORMATS = { - logging.DEBUG: FORMAT_DEBUG, - logging.INFO: FORMAT, - logging.WARNING: FORMAT_DEBUG, - logging.ERROR: FORMAT_DEBUG, - logging.CRITICAL: FORMAT_DEBUG, - } - - def __init__( - self, - colored: bool = True, - ) -> None: - """Overloaded init method to add colored parameter.""" - super().__init__() - - self.colored = colored - self.formats = self.COLORED_FORMATS if colored else self.FORMATS - - def format(self, record: logging.LogRecord) -> str: - """Modified format method. - - :param record: Input logging record to print. - :return: Formatted logging string. - """ - fmt = self.formats.get(record.levelno) - formatter = logging.Formatter(fmt) - if not self.colored: - try: - record.msg = re.sub("\\x1b\[\d{1,3}m", "", record.msg) - except: - # Just ignore all exceptions on this "remove color" operation - pass - return formatter.format(record) - - -spsdk_log_handler = logging.StreamHandler() -spsdk_log_handler.setFormatter(ColoredFormatter(colored=spsdk_log_handler.stream.isatty())) -spsdk_logger = logging.getLogger(__name__) -spsdk_logger.addHandler(spsdk_log_handler) -spsdk_logger.propagate = False - - # this import has to be after SPSDK_DATA_FOLDER definition # pylint: disable=wrong-import-position,wrong-import-order from spsdk.utils.misc import find_file, load_configuration diff --git a/spsdk/__version__.py b/spsdk/__version__.py index 779beea8..602c8045 100644 --- a/spsdk/__version__.py +++ b/spsdk/__version__.py @@ -10,4 +10,4 @@ Having the version in a separate file makes it easier to share it with setup.py """ -__version__ = "1.10.0" +__version__ = "1.10.1" diff --git a/spsdk/apps/blhost.py b/spsdk/apps/blhost.py index ae8025c0..b3b47aca 100644 --- a/spsdk/apps/blhost.py +++ b/spsdk/apps/blhost.py @@ -28,6 +28,7 @@ parse_trust_prov_oem_key_type, progress_bar, ) +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroup, isp_interfaces, @@ -71,7 +72,7 @@ def main( ) -> int: """Utility for communication with the bootloader on target.""" log_level = log_level or logging.WARNING - logging.basicConfig(level=log_level) + spsdk_logger.install(level=log_level) # print help for get-property if property tag is 0 or 'list-properties' if ctx.invoked_subcommand == "get-property": diff --git a/spsdk/apps/ifr.py b/spsdk/apps/ifr.py index c5eafbe9..d06e5bdc 100644 --- a/spsdk/apps/ifr.py +++ b/spsdk/apps/ifr.py @@ -13,6 +13,7 @@ import click +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( FC, CommandsTreeGroupAliasedGetCfgTemplate, @@ -89,7 +90,7 @@ def ifr_device_type_options(options: FC) -> FC: @spsdk_apps_common_options def main(log_level: int) -> int: """Utility for generating and parsing IFR. Please note that IFR0 ROMCFG region is one-time-programmable only.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) return 0 diff --git a/spsdk/apps/nxpcertgen.py b/spsdk/apps/nxpcertgen.py index 7f336443..ef279b99 100644 --- a/spsdk/apps/nxpcertgen.py +++ b/spsdk/apps/nxpcertgen.py @@ -14,6 +14,7 @@ from click_option_group import optgroup from spsdk import SPSDK_DATA_FOLDER, SPSDKError +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroupAliasedGetCfgTemplate, spsdk_apps_common_options, @@ -60,7 +61,7 @@ def __init__(self, config_data: dict) -> None: @spsdk_apps_common_options def main(log_level: int) -> None: """Utility for certificate generation.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level, logger=logger) @main.command(name="generate", no_args_is_help=True) diff --git a/spsdk/apps/nxpcrypto.py b/spsdk/apps/nxpcrypto.py index 9c6bf245..06996ca6 100644 --- a/spsdk/apps/nxpcrypto.py +++ b/spsdk/apps/nxpcrypto.py @@ -20,6 +20,7 @@ from spsdk import SPSDKError from spsdk.apps.nxpcertgen import main as cert_gen_main from spsdk.apps.nxpkeygen import main as key_gen_main +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroup, GroupAliasedGetCfgTemplate, @@ -33,7 +34,7 @@ @spsdk_apps_common_options def main(log_level: int) -> None: """Collection of utilities for cryptographic operations.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) @main.command(name="digest", no_args_is_help=True) diff --git a/spsdk/apps/nxpdebugmbox.py b/spsdk/apps/nxpdebugmbox.py index 0cbe43b9..eb8aabcb 100644 --- a/spsdk/apps/nxpdebugmbox.py +++ b/spsdk/apps/nxpdebugmbox.py @@ -22,6 +22,7 @@ from spsdk import SPSDK_DATA_FOLDER, SPSDKError from spsdk.apps.blhost_helper import progress_bar from spsdk.apps.elftosb_utils.sb_31_helper import RootOfTrustInfo +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroupAliasedGetCfgTemplate, spsdk_apps_common_options, @@ -221,7 +222,7 @@ def main( operation_timeout: int, ) -> int: """Tool for working with Debug Mailbox.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) probe_user_params = {} for par in debug_probe_option: diff --git a/spsdk/apps/nxpdevhsm.py b/spsdk/apps/nxpdevhsm.py index cffce79a..d32f9128 100644 --- a/spsdk/apps/nxpdevhsm.py +++ b/spsdk/apps/nxpdevhsm.py @@ -15,6 +15,7 @@ import click from spsdk import SPSDK_DATA_FOLDER, SPSDKError, SPSDKValueError +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroup, isp_interfaces, @@ -701,7 +702,7 @@ def get_oem_share_input(binary: str) -> bytes: @spsdk_apps_common_options def main(log_level: int) -> int: """Nxpdevhsm application is designed to create SB3 provisioning file for initial provisioning of device by OEM.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) return 0 diff --git a/spsdk/apps/nxpdevscan.py b/spsdk/apps/nxpdevscan.py index 742f84a7..b22ff965 100644 --- a/spsdk/apps/nxpdevscan.py +++ b/spsdk/apps/nxpdevscan.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: UTF-8 -*- # -# Copyright 2020-2022 NXP +# Copyright 2020-2023 NXP # # SPDX-License-Identifier: BSD-3-Clause @@ -14,6 +14,7 @@ import click from click_option_group import MutuallyExclusiveOptionGroup, optgroup +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import spsdk_apps_common_options from spsdk.apps.utils.utils import catch_spsdk_error from spsdk.utils import nxpdevscan @@ -62,8 +63,7 @@ @spsdk_apps_common_options def main(extend_vids: str, out: IO[str], scope: str, log_level: int) -> None: """Utility listing all connected NXP USB and UART devices.""" - logging.basicConfig(level=log_level or logging.WARNING) - + spsdk_logger.install(level=log_level) additional_vids = [int(vid, 16) for vid in extend_vids] if scope in ["all", "usb"]: diff --git a/spsdk/apps/nxpimage.py b/spsdk/apps/nxpimage.py index 3bd5f7eb..416537e7 100644 --- a/spsdk/apps/nxpimage.py +++ b/spsdk/apps/nxpimage.py @@ -14,8 +14,16 @@ import click +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import CommandsTreeGroup, spsdk_apps_common_options -from spsdk.apps.utils.utils import INT, SPSDKAppError, catch_spsdk_error, get_key, store_key +from spsdk.apps.utils.utils import ( + INT, + SPSDKAppError, + catch_spsdk_error, + filepath_from_config, + get_key, + store_key, +) from spsdk.exceptions import SPSDKError from spsdk.image import TrustZone, get_mbi_class from spsdk.image.ahab.ahab_container import AHABImage @@ -23,6 +31,7 @@ from spsdk.image.bee import BeeNxp from spsdk.image.bootable_image.bimg import BootableImage, get_bimg_class from spsdk.image.fcb.fcb import FCB +from spsdk.image.hab.config_parser import ImageConfig from spsdk.image.hab.hab_container import HabContainer from spsdk.image.keystore import KeyStore from spsdk.image.mbimg import mbi_generate_config_templates, mbi_get_supported_families @@ -31,7 +40,7 @@ from spsdk.sbfile.sb2.commands import CmdLoad from spsdk.sbfile.sb2.images import BootImageV21, generate_SB21 from spsdk.sbfile.sb31.images import SB3_SCH_FILE, SecureBinary31 -from spsdk.utils.crypto.cert_blocks import CertBlockV2, CertBlockV31, convert_to_ecc_key +from spsdk.utils.crypto.cert_blocks import CertBlockV2, CertBlockV31 from spsdk.utils.crypto.iee import IeeNxp from spsdk.utils.crypto.otfad import OtfadNxp from spsdk.utils.images import BinaryImage, BinaryPattern @@ -59,7 +68,7 @@ def main(log_level: int) -> None: Manage various kinds of images for NXP parts. It's successor of obsolete ELFTOSB tool. """ - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) @main.group(name="mbi", no_args_is_help=True) @@ -883,7 +892,8 @@ def otfad_group() -> None: "--alignment", default="512", type=INT(), - help="Alignment of key blob data blocks to simplify align data to external memory blocks.", + help="Alignment of key blob data blocks. Default value is 512 B if not specified.", + required=False, ) @click.option( "-i", @@ -891,8 +901,9 @@ def otfad_group() -> None: type=INT(), help=( "OTFAD peripheral index - This is needed to generate proper " - "indexes of fuses in optional BLHOST script. For example for RT118x." + "indexes of fuses in optional BLHOST script. If not specified, BLHOST fuse script won't be generated" ), + required=False, ) @click.argument("config", type=click.Path(exists=True, readable=True)) def otfad_export_command(alignment: int, config: str, index: Optional[int] = None) -> None: @@ -913,17 +924,22 @@ def otfad_export(alignment: int, config: str, index: Optional[int] = None) -> No family = config_data["family"] schemas = OtfadNxp.get_validation_schemas(family) check_config(config_data, schemas, search_paths=[config_dir]) - otfad = OtfadNxp.load_from_config(config_data, search_paths=[config_dir]) - otfad_table_name = config_data.get("keyblob_name", "OTFAD_Table") - binary_image = otfad.binary_image(data_alignment=alignment, otfad_table_name=otfad_table_name) - logger.info(f" The OTFAD image structure:\n{binary_image.draw()}") + otfad = OtfadNxp.load_from_config(config_data, config_dir, search_paths=[config_dir]) output_folder = get_abs_path(config_data["output_folder"], config_dir) - output_name = config_data.get("output_name", "otfad_whole_image") + ".bin" - - otfad_all = os.path.join(output_folder, output_name) - write_file(binary_image.export(), otfad_all, mode="wb") - logger.info(f"Created OTFAD Image:\n{otfad_all}") + otfad_table_name = filepath_from_config( + config_data, "keyblob_name", "OTFAD_Table", config_dir, output_folder + ) + binary_image = otfad.binary_image(data_alignment=alignment, otfad_table_name=otfad_table_name) + logger.info(f" The OTFAD image structure:\n{binary_image.draw()}") + otfad_all = filepath_from_config( + config_data, "output_name", "otfad_whole_image", config_dir, output_folder + ) + if otfad_all != "": + write_file(binary_image.export(), otfad_all, mode="wb") + logger.info(f"Created OTFAD Image:\n{otfad_all}") + else: + logger.info("Skipping export of OTFAD image") sb21_supported = otfad.database.get_device_value("sb_21_supported", otfad.family, default=False) memory_map = ( "In folder is stored two kind of files:\n" @@ -941,20 +957,27 @@ def otfad_export(alignment: int, config: str, index: Optional[int] = None) -> No ) for i, image in enumerate(binary_image.sub_images): - image_file = os.path.join(output_folder, f"{image.name}.bin") - write_file(image.export(), image_file, mode="wb") - logger.info(f"Created OTFAD Image:\n{image_file}") - memory_map += f"\n{image_file}:\n{image.info()}" + if image.name != "": + write_file(image.export(), image.name, mode="wb") + logger.info(f"Created OTFAD Image:\n{image.name}") + memory_map += f"\n{image.name}:\n{image.info()}" + else: + logger.info( + f"Skipping export of {image.info()}, value is blank in the configuration file" + ) if sb21_supported: - bd_file_sources += f'\n image{i} = "{image_file}";' + bd_file_sources += f'\n image{i} = "{image.name}";' bd_file_section0 += f"\n // Load Image: {image.name}" bd_file_section0 += f"\n erase {hex(image.absolute_address)}..{hex(image.absolute_address+len(image))};" bd_file_section0 += f"\n load image{i} > {hex(image.absolute_address)}" readme_file = os.path.join(output_folder, "readme.txt") - write_file(memory_map, readme_file) - logger.info(f"Created OTFAD readme file:\n{readme_file}") + if config_data.get("generate_readme", True): + write_file(memory_map, readme_file) + logger.info(f"Created OTFAD readme file:\n{readme_file}") + else: + logger.info("Skipping generation of OTFAD readme file") if sb21_supported: bd_file_name = os.path.join(output_folder, "sb21_otfad_example.bd") @@ -985,7 +1008,7 @@ def otfad_export(alignment: int, config: str, index: Optional[int] = None) -> No write_file(blhost_script, blhost_script_filename) click.echo(f"Created OTFAD BLHOST load fuses script:\n{blhost_script_filename}") - click.echo(f"Success. OTFAD files has been created and stored into: {output_folder}") + click.echo(f"Success. OTFAD files have been created") @otfad_group.command(name="get-kek", no_args_is_help=False) @@ -1098,39 +1121,40 @@ def iee_group() -> None: # pylint: disable=unused-argument @iee_group.command(name="export", no_args_is_help=True) @click.argument("config", type=click.Path(exists=True, readable=True)) -def iee_export(config: str) -> None: +def iee_export_command(config: str) -> None: """Generate IEE Images from YAML/JSON configuration. CONFIG is path to the YAML/JSON configuration The configuration template files could be generated by subcommand 'get-template'. """ + iee_export(config) + + +def iee_export(config: str) -> None: + """Generate IEE Images from YAML/JSON configuration.""" config_data = load_configuration(config) config_dir = os.path.dirname(config) check_config(config_data, IeeNxp.get_validation_schemas_family(), search_paths=[config_dir]) family = config_data["family"] schemas = IeeNxp.get_validation_schemas(family) check_config(config_data, schemas, search_paths=[config_dir]) - iee = IeeNxp.load_from_config(config_data, search_paths=[config_dir]) + iee = IeeNxp.load_from_config(config_data, config_dir, search_paths=[config_dir]) output_folder = get_abs_path(config_data["output_folder"], config_dir) + iee_all = filepath_from_config(config_data, "output_name", "iee_whole_image", output_folder) + keyblob_name = filepath_from_config( + config_data, "keyblob_name", "iee_keyblob", config_dir, output_folder + ) - output_name = config_data.get("output_name") - if not output_name: - output_name = "encrypted.bin" - - keyblob_name = config_data.get("keyblob_name") - if not keyblob_name: - keyblob_name = "iee_keyblob.bin" - - iee_all = os.path.join(output_folder, output_name) - - binary_image = iee.binary_image(keyblob_name=keyblob_name, image_name=output_name) + binary_image = iee.binary_image(keyblob_name=keyblob_name, image_name=iee_all) logger.info(binary_image.draw()) - write_file(binary_image.export(), iee_all, mode="wb") - - click.echo(f"Created IEE Image containing keyblobs and encrypted data:\n{iee_all}") + if iee_all == "": + logger.info("Skipping export of IEE whole image") + else: + write_file(binary_image.export(), iee_all, mode="wb") + click.echo(f"Created IEE Image containing keyblobs and encrypted data:\n{iee_all}") memory_map = ( "Output folder contains:\n" @@ -1140,24 +1164,34 @@ def iee_export(config: str) -> None: ) for image in binary_image.sub_images: - image_file = os.path.join(output_folder, image.name) - write_file(image.export(), image_file, mode="wb") - logger.info(f"Created Encrypted IEE data blob:\n{image_file}") - memory_map += f"\n{image_file}:\n{image.info()}" + if image.name != "": + write_file(image.export(), image.name, mode="wb") + logger.info(f"Created Encrypted IEE data blob {image.description}:\n{image.name}") + memory_map += f"\n{image.name}:\n{image.info()}" + else: + logger.info( + f"Skipping export of {image.info()}, value is blank in the configuration file" + ) readme_file = os.path.join(output_folder, "readme.txt") - write_file(memory_map, readme_file) - logger.info(f"Created IEE readme file:\n{readme_file}") + if config_data.get("generate_readme", True): + write_file(memory_map, readme_file) + logger.info(f"Created IEE readme file:\n{readme_file}") + else: + logger.info(f"Skipping generation of IEE readme file") - if iee.database.get_device_value("has_kek_fuses", iee.family): + if iee.database.get_device_value("has_kek_fuses", iee.family) and config_data.get( + "generate_fuses_script" + ): blhost_script = iee.get_blhost_script_otp_kek() - if blhost_script: - blhost_script_filename = os.path.join(output_folder, f"iee_{iee.family}_blhost.bcf") - write_file(blhost_script, blhost_script_filename) - click.echo(f"Created IEE BLHOST load fuses script:\n{blhost_script_filename}") + blhost_script_filename = os.path.join(output_folder, f"iee_{iee.family}_blhost.bcf") + write_file(blhost_script, blhost_script_filename) + click.echo(f"Created IEE BLHOST load fuses script:\n{blhost_script_filename}") + else: + logger.info("Skipping generation of IEE BLHOST load fuses script") - click.echo(f"Success. IEE files have been created and stored into: {output_folder}") + click.echo(f"Success. IEE files have been created") @iee_group.command(name="get-template", no_args_is_help=True) @@ -1419,15 +1453,13 @@ def hab_export_command( EXTERNAL is a space separated list of external binary files defined in BD file """ - image = hab_export(command, output, external) + image = hab_export(command, external) write_file(image, output, mode="wb") click.echo(f"Success. (HAB container: {output} created.)") -def hab_export(command: str, output: str, external: List[str]) -> bytes: +def hab_export(command: str, external: List[str]) -> bytes: """Generate HAB container from configuration.""" - if output is None: - raise SPSDKAppError("Error: no output file was specified") try: parser = bd_parser.BDParser() @@ -1435,8 +1467,11 @@ def hab_export(command: str, output: str, external: List[str]) -> bytes: bd_data = parser.parse(text=bd_file_content, extern=external) if bd_data is None: raise SPSDKError("Invalid bd file, secure binary file generation terminated") + bd_config = ImageConfig.parse(bd_data) hab_container = HabContainer.load( - bd_data, external=external, search_paths=[os.path.dirname(command)] + bd_config, + search_paths=[os.path.dirname(command)], + timestamp=bd_config.options.signature_timestamp, ) data = hab_container.export() return data @@ -1457,7 +1492,7 @@ def hab_parse_command( binary: str, output_folder: str, ) -> None: - """Parse HAb contianer into individual segments.""" + """Parse HAB contianer into individual segments.""" file_bin = load_binary(binary) created_files = hab_parse(file_bin, output_folder) for file_path in created_files: @@ -1469,7 +1504,7 @@ def hab_parse(binary: bytes, output: str) -> List[str]: """Generate HAB container from configuration.""" hab_container = HabContainer.parse(binary) created_files = [] - for sub_image in hab_container.binary_image.sub_images: + for sub_image in hab_container.hab_image.sub_images: sub_image_data = sub_image.export() sub_image_path = os.path.join(output, f"{sub_image.name.lower()}.bin") write_file(sub_image_data, sub_image_path, mode="wb") @@ -1622,8 +1657,6 @@ def xmcd_export(config: str, output: str) -> None: """Export XMCD Image from YAML/JSON configuration.""" config_data = load_configuration(config) xmcd_image = XMCD.load_from_config(config_data) - check_config(config_data, XMCD.get_validation_schemas_family()) - # Add validation of config xmcd_data = xmcd_image.export() write_file(xmcd_data, output, mode="wb") diff --git a/spsdk/apps/nxpkeygen.py b/spsdk/apps/nxpkeygen.py index 110b923c..3f0293c0 100644 --- a/spsdk/apps/nxpkeygen.py +++ b/spsdk/apps/nxpkeygen.py @@ -13,6 +13,7 @@ import click +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import spsdk_apps_common_options from spsdk.apps.utils.utils import catch_spsdk_error, check_file_exists from spsdk.crypto import ( @@ -86,7 +87,7 @@ def main(log_level: int, key_type: str, path: str, password: str, force: bool) - PATH - output file path, where the key pairs (private and public key) will be stored. Each key will be stored in separate file (.pub and .pem). """ - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) key_param = key_type.lower().strip() is_rsa = "rsa" in key_param diff --git a/spsdk/apps/pfr.py b/spsdk/apps/pfr.py index 5d182891..efdf5976 100644 --- a/spsdk/apps/pfr.py +++ b/spsdk/apps/pfr.py @@ -17,6 +17,7 @@ from spsdk import pfr from spsdk.apps.elftosb_utils.sb_31_helper import RootOfTrustInfo +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( FC, CommandsTreeGroupAliasedGetCfgTemplate, @@ -92,7 +93,7 @@ def decorator(options: Callable[[FC], FC]) -> Callable[[FC], FC]: @spsdk_apps_common_options def main(log_level: int) -> int: """Utility for generating and parsing Protected Flash Region data (CMPA, CFPA).""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) return 0 diff --git a/spsdk/apps/sdphost.py b/spsdk/apps/sdphost.py index 893a3b22..f3cfb34b 100644 --- a/spsdk/apps/sdphost.py +++ b/spsdk/apps/sdphost.py @@ -15,6 +15,7 @@ import click +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroup, isp_interfaces, @@ -44,7 +45,7 @@ def main( timeout: int, ) -> int: """Utility for communication with ROM on i.MX targets using SDP protocol (i.MX RT1xxx).""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) # if --help is provided anywhere on command line, skip interface lookup and display help message if "--help" not in sys.argv[1:]: ctx.obj = { diff --git a/spsdk/apps/sdpshost.py b/spsdk/apps/sdpshost.py index bb451474..b972e905 100644 --- a/spsdk/apps/sdpshost.py +++ b/spsdk/apps/sdpshost.py @@ -12,6 +12,7 @@ import click +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import ( CommandsTreeGroup, isp_interfaces, @@ -33,7 +34,7 @@ @click.pass_context def main(ctx: click.Context, port: str, usb: str, name: str, log_level: int, timeout: int) -> int: """Utility for communication with ROM on i.MX targets using SDPS protocol (i.MX8/9).""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) click.echo(WARNING_MSG) # if --help is provided anywhere on command line, skip interface lookup and display help message if "--help " in sys.argv: diff --git a/spsdk/apps/shadowregs.py b/spsdk/apps/shadowregs.py index b1bdf345..dd99433d 100644 --- a/spsdk/apps/shadowregs.py +++ b/spsdk/apps/shadowregs.py @@ -16,6 +16,7 @@ from spsdk import SPSDK_DATA_FOLDER from spsdk.apps.nxpdebugmbox import get_debug_probe_options_help +from spsdk.apps.utils import spsdk_logger from spsdk.apps.utils.common_cli_options import CommandsTreeGroup, spsdk_apps_common_options from spsdk.apps.utils.utils import catch_spsdk_error from spsdk.debuggers.utils import DebugProbe, open_debug_probe @@ -121,7 +122,7 @@ def main( revision: str, ) -> int: """NXP Shadow Registers control Tool.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) probe_user_params = {} for par in debug_probe_option: diff --git a/spsdk/apps/tpconfig.py b/spsdk/apps/tpconfig.py index dec0a45d..50590048 100644 --- a/spsdk/apps/tpconfig.py +++ b/spsdk/apps/tpconfig.py @@ -26,6 +26,7 @@ CommandsTreeGroupAliasedGetCfgTemplate, catch_spsdk_error, spsdk_apps_common_options, + spsdk_logger, ) from spsdk.tp import TP_DATA_FOLDER, SPSDKTpError, TpDevInterface, TrustProvisioningConfig from spsdk.tp.utils import get_supported_devices, scan_tp_devices @@ -36,7 +37,7 @@ @spsdk_apps_common_options def main(log_level: int) -> int: """Application for configuration of trusted device.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) return 0 diff --git a/spsdk/apps/tphost.py b/spsdk/apps/tphost.py index 2397c48f..4846b6da 100644 --- a/spsdk/apps/tphost.py +++ b/spsdk/apps/tphost.py @@ -29,6 +29,7 @@ CommandsTreeGroupAliasedGetCfgTemplate, catch_spsdk_error, spsdk_apps_common_options, + spsdk_logger, ) from spsdk.apps.utils.utils import SPSDKAppError from spsdk.crypto import Encoding, ec @@ -49,7 +50,7 @@ @spsdk_apps_common_options def main(log_level: int) -> int: """Application to secure Trust provisioning process of loading application in Un-trusted environment.""" - logging.basicConfig(level=log_level or logging.WARNING) + spsdk_logger.install(level=log_level) return 0 diff --git a/spsdk/apps/utils/spsdk_logger.py b/spsdk/apps/utils/spsdk_logger.py new file mode 100644 index 00000000..b1589e24 --- /dev/null +++ b/spsdk/apps/utils/spsdk_logger.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# Copyright 2023 NXP +# +# SPDX-License-Identifier: BSD-3-Clause + +"""SPSDK colored logger.""" + +import logging +import logging.config +import os +import re +import sys +from typing import Optional, TextIO + +import colorama + +colorama.just_fix_windows_console() + + +class ColoredFormatter(logging.Formatter): + """Colored Formatter. + + SPSDK modified formatter class. + """ + + FORMAT = logging.BASIC_FORMAT + FORMAT_DEBUG = FORMAT + " (%(relativeCreated)dms since start, %(filename)s:%(lineno)d)" + + COLORED_FORMATS = { + logging.DEBUG: colorama.Fore.BLUE + FORMAT_DEBUG + colorama.Fore.RESET, + logging.INFO: colorama.Fore.WHITE + + colorama.Style.BRIGHT + + FORMAT + + colorama.Fore.RESET + + colorama.Style.RESET_ALL, + logging.WARNING: colorama.Fore.YELLOW + FORMAT_DEBUG + colorama.Fore.RESET, + logging.ERROR: colorama.Fore.RED + FORMAT_DEBUG + colorama.Fore.RESET, + logging.CRITICAL: colorama.Fore.RED + + colorama.Style.BRIGHT + + FORMAT_DEBUG + + colorama.Fore.RESET + + colorama.Style.RESET_ALL, + } + FORMATS = { + logging.DEBUG: FORMAT_DEBUG, + logging.INFO: FORMAT, + logging.WARNING: FORMAT_DEBUG, + logging.ERROR: FORMAT_DEBUG, + logging.CRITICAL: FORMAT_DEBUG, + } + + def __init__( + self, + colored: bool = True, + ) -> None: + """Overloaded init method to add colored parameter.""" + super().__init__() + + self.colored = colored + self.formats = self.COLORED_FORMATS if colored else self.FORMATS + + def format(self, record: logging.LogRecord) -> str: + """Modified format method. + + :param record: Input logging record to print. + :return: Formatted logging string. + """ + fmt = self.formats.get(record.levelno) + formatter = logging.Formatter(fmt) + if not self.colored: + try: + record.msg = re.sub("\\x1b\[\d{1,3}m", "", record.msg) + except: + # Just ignore all exceptions on this "remove color" operation + pass + return formatter.format(record) + + +def install( + level: Optional[int], + stream: TextIO = sys.stderr, + colored: Optional[bool] = None, + logger: Optional[logging.Logger] = None, +) -> None: + """Install SPSDK log handler for colored output. + + :param level: logging level, defaults to logging.WARNING + :param stream: stream to output logging, defaults to sys.stderr + :param colored: colored output, always colored if true + :param logger: defaults to root logger + """ + color = True + if not level: + level = logging.WARNING + logger = logger or logging.getLogger() + # This env variable tells us that jupyter notebook is executed + if "JUPYTER_SPSDK" in os.environ: + stream = sys.stdout + handler = logging.StreamHandler(stream) + handler.setLevel(level) + if "NO_COLOR" in os.environ: + # For details see https://no-color.org/ + color = False + if not handler.stream.isatty(): + # disable color if the stream is not console + color = False + if "JUPYTER_SPSDK" in os.environ: + # always colored for jupyter + color = True + if colored is not None: + color = colored + # enforce color if specified in constructor + handler.setFormatter(ColoredFormatter(color)) + # Adjust the level of the logger + if logger.getEffectiveLevel() > level: + logger.setLevel(level) + # Install the stream handler + logger.addHandler(handler) + logger.propagate = False diff --git a/spsdk/apps/utils/utils.py b/spsdk/apps/utils/utils.py index c97bf2a0..9e1c4054 100644 --- a/spsdk/apps/utils/utils.py +++ b/spsdk/apps/utils/utils.py @@ -12,7 +12,7 @@ import re import sys from functools import wraps -from typing import Any, Callable, List, Optional, Tuple, Union +from typing import Any, Callable, Dict, List, Optional, Tuple, Union import click import hexdump @@ -24,6 +24,7 @@ from spsdk.sdp.interfaces import SDPInterface from spsdk.utils.misc import ( # pylint: disable=unused-import #backward-compatibility find_file, + get_abs_path, load_binary, load_file, value_to_bytes, @@ -292,7 +293,9 @@ def check_file_exists(path: str, force_overwrite: bool = False) -> bool: # type raise SPSDKAppError(f"File '{path}' already exists. Use --force to overwrite it.") -def get_key(key_source: str, expected_size: int, search_paths: Optional[List[str]] = None) -> bytes: +def get_key( + key_source: Union[str, int], expected_size: int, search_paths: Optional[List[str]] = None +) -> bytes: """Get the key from the command line parameter. :param key_source: File path to key file or hexadecimal value. If not specified random value is used. @@ -303,6 +306,9 @@ def get_key(key_source: str, expected_size: int, search_paths: Optional[List[str """ key = None assert expected_size > 0, "Invalid expected size of key" + if isinstance(key_source, int): + return value_to_bytes(key_source, byte_cnt=expected_size) + if not key_source: logger.debug( f"The key source is not specified, the random value is used in size of {expected_size} B." @@ -350,3 +356,35 @@ def store_key(file_name: str, key: bytes, reverse: bool = False) -> None: key.reverse() key = bytes(key) write_file(key, file_name + ".bin", mode="wb") + + +def filepath_from_config( + config: Dict, + key: str, + default_value: str, + base_dir: str, + output_folder: str = "", + file_extension: str = "bin", +) -> str: + """Get file path from configuration dictionary and append .bin if the value is not blank. + + Function returns the output_folder + filename if the filename does not contain path. + In case filename contains path, return filename and append ".bin". + The empty string "" indicates that the user doesn't want the output. + :param config: Configuration dictionary + :param key: Name of the key + :param default_value: default value in case key value is not present + :param base_dir: base directory for path expansion + :param output_folder: Output folder, if blank file path from config will be used + :param file_extension: File extension that will be appended + :return: filename with appended ".bin" or blank filename "" + """ + filename = config.get(key, default_value) + file_extension = "." + file_extension + if filename == "": + return filename + if not os.path.dirname(filename): + filename = os.path.join(output_folder, filename) + if not filename.endswith(file_extension): + filename += file_extension + return get_abs_path(filename, base_dir) diff --git a/spsdk/data/image/database_sb31.yaml b/spsdk/data/image/database_sb31.yaml index c131cfad..478d050b 100644 --- a/spsdk/data/image/database_sb31.yaml +++ b/spsdk/data/image/database_sb31.yaml @@ -5,11 +5,34 @@ devices: lpc55s3x: attributes: - supported_commands: [erase, load, execute, programFuses, programIFR, loadCMAC, copy, loadHashLocking, loadKeyBlob, configureMemory, fillMemory, checkFwVersion] - mcxn9xx: - device_alias: lpc55s3x + supported_commands: + [ + erase, + load, + execute, + programFuses, + programIFR, + loadCMAC, + copy, + loadHashLocking, + loadKeyBlob, + configureMemory, + fillMemory, + checkFwVersion, + ] kw45xx: attributes: - supported_commands: [erase, load, execute, programFuses, programIFR, loadCMAC, loadHashLocking, fillMemory, checkFwVersion] + supported_commands: + [ + erase, + load, + execute, + programFuses, + programIFR, + loadCMAC, + loadHashLocking, + fillMemory, + checkFwVersion, + ] k32w1xx: device_alias: kw45xx diff --git a/spsdk/data/image/xmcd/flexspi_ram_full.xml b/spsdk/data/image/xmcd/flexspi_ram_full.xml index 799f09cb..e945edee 100644 --- a/spsdk/data/image/xmcd/flexspi_ram_full.xml +++ b/spsdk/data/image/xmcd/flexspi_ram_full.xml @@ -5,51 +5,138 @@ SPDX-License-Identifier: BSD-3-Clause --> - - + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,7 +152,12 @@ - + + + + + + @@ -131,64 +223,64 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -200,9 +292,21 @@ - + + + + + + + + - + + + + + + diff --git a/spsdk/data/image/xmcd/flexspi_ram_simplified.xml b/spsdk/data/image/xmcd/flexspi_ram_simplified.xml index d28af33e..895da207 100644 --- a/spsdk/data/image/xmcd/flexspi_ram_simplified.xml +++ b/spsdk/data/image/xmcd/flexspi_ram_simplified.xml @@ -6,27 +6,49 @@ --> - - - + + + + + + + + + + + + + - - - + + + + + + + - - + - - + + - - + + + + + + + + - + + + + diff --git a/spsdk/data/image/xmcd/header.xml b/spsdk/data/image/xmcd/header.xml index 48012f7a..d1b9c2c8 100644 --- a/spsdk/data/image/xmcd/header.xml +++ b/spsdk/data/image/xmcd/header.xml @@ -7,16 +7,16 @@ - - - + + + - + - + diff --git a/spsdk/data/image/xmcd/sch_xmcd.yaml b/spsdk/data/image/xmcd/sch_xmcd.yaml index 5d04975f..6499c785 100644 --- a/spsdk/data/image/xmcd/sch_xmcd.yaml +++ b/spsdk/data/image/xmcd/sch_xmcd.yaml @@ -1,4 +1,4 @@ -# Copyright 2022 NXP +# Copyright 2022-2023 NXP # # SPDX-License-Identifier: BSD-3-Clause @@ -21,13 +21,17 @@ xmcd_family_rev: type: string title: Memory type description: Specify type of memory used by XMCD description. + enum: [flexspi_ram, semc_sdram] template_value: flexspi_ram config_type: type: string title: Configuration type description: Specify type of configuration used by XMCD description. + enum: [full, simplified] template_value: simplified + + required: [family, mem_type, config_type] xmcd: type: object properties: @@ -36,4 +40,4 @@ xmcd: title: Settings of XMCD description: External memory configuration settings for selected MCU. - required: [family, xmcd_settings] + required: [xmcd_settings] diff --git a/spsdk/data/image/xmcd/semc_sdram_full.xml b/spsdk/data/image/xmcd/semc_sdram_full.xml index 93a1ce17..67fc26c6 100644 --- a/spsdk/data/image/xmcd/semc_sdram_full.xml +++ b/spsdk/data/image/xmcd/semc_sdram_full.xml @@ -7,21 +7,99 @@ - + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -33,11 +111,11 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/spsdk/data/image/xmcd/semc_sdram_simplified.xml b/spsdk/data/image/xmcd/semc_sdram_simplified.xml index e37e95aa..4607aa71 100644 --- a/spsdk/data/image/xmcd/semc_sdram_simplified.xml +++ b/spsdk/data/image/xmcd/semc_sdram_simplified.xml @@ -5,10 +5,20 @@ SPDX-License-Identifier: BSD-3-Clause --> - - - + + + + + + + - - - \ No newline at end of file + + + + + + + + + diff --git a/spsdk/data/pfr/cfpa/lpc553x_1a.xml b/spsdk/data/pfr/cfpa/lpc553x_1a.xml index 6b573773..58014a70 100644 --- a/spsdk/data/pfr/cfpa/lpc553x_1a.xml +++ b/spsdk/data/pfr/cfpa/lpc553x_1a.xml @@ -11,7 +11,7 @@ - + diff --git a/spsdk/data/pfr/cfpa/lpc55s3x_1a.xml b/spsdk/data/pfr/cfpa/lpc55s3x_1a.xml index 334f15b3..047c8ee5 100644 --- a/spsdk/data/pfr/cfpa/lpc55s3x_1a.xml +++ b/spsdk/data/pfr/cfpa/lpc55s3x_1a.xml @@ -11,7 +11,7 @@ - + @@ -37,43 +37,43 @@ - + - + - + - + - + - + - + diff --git a/spsdk/data/utils/iee/database.yaml b/spsdk/data/utils/iee/database.yaml index 370d5dbd..4fa70bd9 100644 --- a/spsdk/data/utils/iee/database.yaml +++ b/spsdk/data/utils/iee/database.yaml @@ -10,7 +10,10 @@ devices: sb_21_supported: False has_kek_fuses: True additional_template: ["ibkek", "key_blobs"] - + additional_template_text: | + Refer to the Security Reference Manual for RT117x and Application Note 13250 for more information. + In case blank string is used, the output is not generated. If the filename contains directory, + the output folder will be ignored and the full path from filename will be used. grouped_registers: - name: USER_KEY1 width: 512 diff --git a/spsdk/data/utils/iee/sch_iee.yaml b/spsdk/data/utils/iee/sch_iee.yaml index 30b69541..bccc5a03 100644 --- a/spsdk/data/utils/iee/sch_iee.yaml +++ b/spsdk/data/utils/iee/sch_iee.yaml @@ -22,29 +22,42 @@ iee_output: type: string title: IEE output directory description: Path to directory where the IEE output will be generated - template_value: iee_output + template_value: "iee_output" output_name: type: string - title: Output binary image file name - description: File name of the output image containing keyblobs and encrypted data blobs - template_value: "encrypted.bin" - default: "encrypted.bin" + title: Output binary image filename + description: Filename of the output image containing keyblobs and encrypted data blobs without file extension (.bin will be appended) + template_value: "iee_whole_image" + default: "iee_whole_image" keyblob_name: type: string - title: Keyblob file name - description: File name of the keyblob, output_folder/keyblob_name - template_value: "iee_keyblob.bin" - default: "iee_keyblob.bin" + title: Keyblob filename + description: Filename of the keyblob without file extension (.bin will be appended) + template_value: "iee_keyblob" + default: "iee_keyblob" encrypted_name: type: string title: Encrypted name - description: filename of the encrypted datablobs - template_value: encrypted_blob.bin - default: encrypted_blob.bin - + description: filename of the encrypted datablobs without file extension (.bin will be appended) + template_value: "encrypted_blob" + default: "encrypted_blob" + + generate_readme: + type: boolean + title: Generate readme.txt + description: Readme file contains information about image layout + template_value: true + default: true + + generate_fuses_script: + type: boolean + title: Generate blhost batch file to burn fuses + description: BCF file with fuses configuration + template_value: true + default: true required: [output_folder] iee: @@ -79,7 +92,7 @@ iee: title: Data blob address description: Data blob address, it doesn't have to be specified for S-REC format: number - template_value: "0x03001000" + template_value: "0x30001000" ibkek: type: object @@ -105,7 +118,7 @@ key_blobs: title: List of Key Blobs used by IEE required: [key_blobs] properties: - key_blob: + key_blobs: description: The list of definition of individual key blobs including plain data. Add other array items as you need and device allows type: array minItems: 1 diff --git a/spsdk/data/utils/otfad/database.yaml b/spsdk/data/utils/otfad/database.yaml index a6a44f6c..9e77a8e2 100644 --- a/spsdk/data/utils/otfad/database.yaml +++ b/spsdk/data/utils/otfad/database.yaml @@ -80,6 +80,9 @@ devices: The encrypted XiP can be also enabled by the BOOT_CFG pin It is recommended to set the USER_KEY5_RLOCK and OTFAD1/2_KEY_SEL_LOCK fuses for production to protect sensitive data stored in the USER_KEY5 fuse (if used) and to prevent a modification of the OTFAD key selection by malicious software. + + In case blank string is used, the output is not generated. If the filename contains directory, + the output folder will be ignored and the full path from filename will be used. grouped_registers: - name: OTFAD_KEY width: 128 diff --git a/spsdk/data/utils/otfad/sch_otfad.yaml b/spsdk/data/utils/otfad/sch_otfad.yaml index 07d2a8a8..434ed5ad 100644 --- a/spsdk/data/utils/otfad/sch_otfad.yaml +++ b/spsdk/data/utils/otfad/sch_otfad.yaml @@ -21,13 +21,13 @@ otfad_output: output_folder: type: string title: OTFAD output folder - description: Folder name to be stored generated OTFAD outputs - template_value: otfad_outputs + description: Path to directory where the OTFAD output will be generated + template_value: "otfad_output" output_name: type: string title: Output binary image file name - description: Filename of the output image containing keyblobs and encrypted data blob without file extension (.bin will be appended) + description: Filename of the output image containing keyblobs and encrypted data blobs without file extension (.bin will be appended) template_value: "otfad_whole_image" default: "otfad_whole_image" @@ -42,8 +42,16 @@ otfad_output: type: string title: Encrypted name description: filename of the encrypted datablobs without file extension (.bin will be appended) - template_value: encrypted_blob - default: encrypted_blob + template_value: "encrypted_blob" + default: "encrypted_blob" + + generate_readme: + type: boolean + title: Generate readme.txt + description: Readme file contains information about image layout + template_value: true + default: true + required: [output_folder] otfad: @@ -54,7 +62,7 @@ otfad: kek: type: string title: KEK - description: OTFAD Key Encryption Key to encrypt OTFAD table + description: OTFAD Key Encryption Key to encrypt OTFAD table. Might be provided as a path to binary file containing KEK or as a string or number template_value: my_secret_kek.bin otfad_table_address: diff --git a/spsdk/exceptions.py b/spsdk/exceptions.py index 96697885..7273f234 100644 --- a/spsdk/exceptions.py +++ b/spsdk/exceptions.py @@ -76,3 +76,11 @@ class SPSDKUnsupportedOperation(SPSDKError): class SPSDKSyntaxError(SyntaxError, SPSDKError): """SPSDK syntax error.""" + + +class SPSDKFileNotFoundError(FileNotFoundError, SPSDKError): + """SPSDK file not found error.""" + + +class SPSDKAttributeError(SPSDKError, AttributeError): + """SPSDK standard attribute error.""" diff --git a/spsdk/image/bootable_image/bimg.py b/spsdk/image/bootable_image/bimg.py index e1bef504..f7fe11c0 100644 --- a/spsdk/image/bootable_image/bimg.py +++ b/spsdk/image/bootable_image/bimg.py @@ -69,6 +69,7 @@ def convert_segment_value(value: bytes, output_type: Type) -> Any: :param value: Segment value as bytes. :param output_type: Output type. + :raises SPSDKTypeError: If given type is not supported :return: Converted value. """ if output_type == int: @@ -882,8 +883,8 @@ def _get_xmcd_size(self, header_binary: bytes) -> int: header = XMCDHeader.parse(header_binary) except SPSDKParsingError: return 0 - mem_type = MemoryType(header.interface).name.lower() - config_type = ConfigurationBlockType(header.block_type).name.lower() + mem_type = MemoryType.name(header.interface) + config_type = ConfigurationBlockType.name(header.block_type) registers = XMCD.load_registers(self.family, mem_type, config_type, self.revision) return len(registers.image_info()) diff --git a/spsdk/image/hab/config_parser.py b/spsdk/image/hab/config_parser.py new file mode 100644 index 00000000..5d4fdacf --- /dev/null +++ b/spsdk/image/hab/config_parser.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# Copyright 2023 NXP +# +# SPDX-License-Identifier: BSD-3-Clause + + +"""Parser of BD configuration.""" + +from collections import UserDict +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Any, Dict, List, Optional + +from spsdk.exceptions import SPSDKKeyError + + +@dataclass +class ImageConfig: + """Represent parsed image configuration including options and sections.""" + + elf_file: str + options: "ConfigOptions" + sections: List["SectionConfig"] + + @staticmethod + def parse(data: Dict[str, Any]) -> "ImageConfig": + """Parse config from dictionary. + + :param data: Configuration data to be parsed. + """ + options = ConfigOptions.parse(data["options"]) + sections: List = [] + for section in data["sections"]: + sections.append(SectionConfig.parse(section)) + return ImageConfig(elf_file=data["sources"]["elfFile"], options=options, sections=sections) + + def get_section(self, section_index: int) -> Optional["SectionConfig"]: + """Get config section by section id. + + :param section_index: Section with index to be retrieved + """ + for section in self.sections: + if section.index == section_index: + return section + return None + + +@dataclass +class ConfigOptions: + """Dataclass holding configuration options.""" + + flags: int + start_address: int + ivt_offset: int + initial_load_size: int + entrypoint_address: int + signature_timestamp: Optional[datetime] = None + dcd_file_path: Optional[str] = None + xmcd_file_path: Optional[str] = None + + _FIELD_MAPPING = { + "flags": "flags", + "startaddress": "start_address", + "ivtoffset": "ivt_offset", + "initialloadsize": "initial_load_size", + "entrypointaddress": "entrypoint_address", + "signaturetimestamp": "signature_timestamp", + "dcdfilepath": "dcd_file_path", + "xmcdfilepath": "xmcd_file_path", + } + + @staticmethod + def parse(options: Dict[str, Any]) -> "ConfigOptions": + """Parse config options from dictionary. + + :param options: Options to be parsed + :raise SPSDKKeyError: If unexpected key is present + """ + params = {} + for opt in options: + if opt.lower() not in ConfigOptions._FIELD_MAPPING: + raise SPSDKKeyError(f"Unexpected option field {opt}") + value = options[opt] + if opt.lower() == "signaturetimestamp": + value = datetime.strptime(value, "%d/%m/%Y %H:%M:%S").replace(tzinfo=timezone.utc) + params[ConfigOptions._FIELD_MAPPING[opt.lower()]] = value + return ConfigOptions(**params) + + +class CaseInsensitiveDict(UserDict): + """Case insensitive dictionary.""" + + def __getitem__(self, key: str) -> Any: + for item in self: + if isinstance(item, str) and item.lower() == key.lower(): + return self.data[item] + raise SPSDKKeyError(f"The key {key} was not found.") + + +@dataclass +class SectionConfig: + """Dataclass holding single section data.""" + + index: int + options: CaseInsensitiveDict + + @staticmethod + def parse(section: Dict[str, Any]) -> "SectionConfig": + """Parse config section from dictionary. + + :param section: Section to be parsed + """ + index = int(section["section_id"]) + options = CaseInsensitiveDict((key, d[key]) for d in section["options"] for key in d) + return SectionConfig(index=index, options=options) diff --git a/spsdk/image/hab/csf_builder.py b/spsdk/image/hab/csf_builder.py new file mode 100644 index 00000000..21a9b8cc --- /dev/null +++ b/spsdk/image/hab/csf_builder.py @@ -0,0 +1,1528 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# Copyright 2023 NXP +# +# SPDX-License-Identifier: BSD-3-Clause + + +"""Builder of CST segments.""" + +import logging +import os +from abc import ABC, abstractmethod +from copy import deepcopy +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Any, Dict, List, Optional, Tuple, Union + +from cryptography.hazmat.primitives.ciphers.aead import AESCCM +from cryptography.hazmat.primitives.serialization import Encoding + +from spsdk.crypto import Certificate +from spsdk.crypto.loaders import load_certificate_from_data, load_private_key_from_data +from spsdk.exceptions import ( + SPSDKAttributeError, + SPSDKError, + SPSDKFileNotFoundError, + SPSDKKeyError, + SPSDKTypeError, + SPSDKValueError, +) +from spsdk.image import segments +from spsdk.image.commands import ( + CmdAuthData, + CmdBase, + CmdInstallKey, + CmdSet, + CmdUnlockAbstract, + CmdUnlockCAAM, + CmdUnlockSNVS, + EnumAuthDat, + EnumCertFormat, + EnumEngine, + EnumInsKey, +) +from spsdk.image.hab.config_parser import ImageConfig, SectionConfig +from spsdk.image.hab.hab_binary_image import HabBinaryImage, HabSegment +from spsdk.image.header import Header, SegTag +from spsdk.image.images import BootImgRT +from spsdk.image.secret import MAC, CertificateImg, EnumAlgorithm, Signature, SrkTable +from spsdk.utils.crypto.common import crypto_backend +from spsdk.utils.misc import ( + BinaryPattern, + align_block, + find_file, + find_first, + get_abs_path, + load_binary, + write_file, +) + +logger = logging.getLogger(__name__) + + +@dataclass +class ImageBlock: + """Single image block.""" + + base_address: int + start: int + size: int + + +class SecCommand(ABC): + """Sec command abstract class.""" + + CMD_INDEX: int + CONFIGURATION_PARAMS: Dict[str, Any] + + def __init__(self) -> None: + """Command abstract class constructor.""" + self._cmd: Optional[Union[CmdBase, Header]] = None + + @property + def cmd(self) -> Union[CmdBase, Header]: + """Command property. + + :raises SPSDKAttributeError: If command is not set + """ + if self._cmd is None: + raise SPSDKAttributeError("Command is not set") + return self._cmd + + @cmd.setter + def cmd(self, value: Union[CmdBase, Header]) -> None: + """Command setter.""" + self._cmd = value + + @classmethod + def check_config_section_params(cls, section_data: SectionConfig) -> None: + """Check if options contains only accepted arguments. + + :param section_data: Section data to be checked + :raises SPSDKError: If mandatory parameter is not present + :raises SPSDKError: If unexpected key is present + """ + for param, is_mandatory in cls.CONFIGURATION_PARAMS.items(): + if is_mandatory and section_data.options.get(param) is None: + raise SPSDKError(f"Mandatory parameter is not defined") + + additional_params = list( + set(key.lower() for key in section_data.options.keys()) + - set(key.lower() for key in cls.CONFIGURATION_PARAMS.keys()) + ) + if additional_params: + raise SPSDKError(f"Unexpected arguments {additional_params}") + + @staticmethod + @abstractmethod + def parse(config: SectionConfig, search_paths: Optional[List[str]] = None) -> "SecCommand": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + "return: Parsed command instance + """ + + @abstractmethod + def build_command(self) -> None: + """Build command with given properties.""" + + @staticmethod + def generate_random_bytes(length: int) -> bytes: + """Generate random bytes. + + :param length: Length of random bytes + :raises SPSDKError: If length of bytes is not as expected + :return: Generated random bytes + """ + secret_key = crypto_backend().random_bytes(length) + if length != len(secret_key): + raise SPSDKError(f"Invalid sectet key bytes length: {len(secret_key)}") + return secret_key + + +class SecCsfHeader(SecCommand): + """CSF header command.""" + + CMD_INDEX = 20 + CONFIGURATION_PARAMS = { + "Header_Version": True, + "Header_HashAlgorithm": False, + "Header_Engine": True, + "Header_EngineConfiguration": True, + "Header_CertificateFormat": False, + "Header_SignatureFormat": True, + } + + def __init__( + self, + version: Union[int, str], + engine: EnumEngine, + engine_config: int, + hash_algorithm: Optional[EnumAlgorithm] = None, + certificate_format: Optional[EnumCertFormat] = None, + signature_format: Optional[str] = None, + ) -> None: + """CSF header class constructor. + + :param version: Header version + :param engine: Engine plugin tag + :param engine_config: Engine configuration index + :param hash_algorithm: Hash algorithm type + :param certificate_format: Certificate format tag + :param signature_format: Signature format + :raises SPSDKValueError: Invalid combination of input parameters. + :raises SPSDKValueError: Invalid signature format. + """ + super().__init__() + self.version = self._parse_version(version) + if engine == EnumEngine.ANY and engine_config != 0: + raise SPSDKValueError(f"Invalid combination:{engine}: {engine_config}") + self.engine: EnumEngine = engine + self.engine_config: int = engine_config + if not signature_format: + signature_format = "CMS" + if signature_format and signature_format.lower() != "cms": + raise SPSDKValueError(f"Invalid signature format: {signature_format}") + self.signature_format: str = signature_format + self.certificate_format: Optional[EnumCertFormat] = certificate_format + self.hash_algorithm: Optional[EnumAlgorithm] = hash_algorithm + + @staticmethod + def parse(config: SectionConfig, search_paths: Optional[List[str]] = None) -> "SecCsfHeader": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecCsfHeader.check_config_section_params(config) + version = config.options["Header_Version"] + assert version + + hash_algorithm = config.options.get("Header_HashAlgorithm") + if hash_algorithm is not None: + hash_algorithm = EnumAlgorithm[hash_algorithm] + + engine = EnumEngine[config.options["Header_Engine"]] + engine_config = int(config.options["Header_EngineConfiguration"]) + + cert_format = config.options.get("Header_CertificateFormat") + if cert_format is not None: + cert_format = EnumCertFormat[cert_format] + + signature_format = config.options.get("Header_SignatureFormat") + return SecCsfHeader( + version=version, + engine=engine, + engine_config=engine_config, + hash_algorithm=hash_algorithm, + certificate_format=cert_format, + signature_format=signature_format, + ) + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: Header = Header(SegTag.CSF, param=self.version) + self.cmd.length = 4 + + @staticmethod + def _parse_version(version: Union[str, int]) -> int: + """Parse version from string to actiual integer. + + An example: "4.2" -> 0x42 -> 64 + + :param version: Version as string or int + :raises SPSDKTypeError: Input version if wrong type. + :return: Version as int value + """ + if not isinstance(version, (str, int)): + raise SPSDKTypeError("Version can be either int or string") + if isinstance(version, str): + int_version = int(version.replace(".", ""), 16) + else: + int_version = version + return int_version + + +class SecCsfInstallSrk(SecCommand): + """Install SRK command.""" + + CMD_INDEX = 21 + CONFIGURATION_PARAMS = {"InstallSRK_Table": True, "InstallSRK_SourceIndex": True} + + def __init__(self, srk_table: bytes, source_index: int) -> None: + """Install SRK class constructor. + + :param srk_table: SRK table + :param source_index: Source index + :raises SPSDKError: Srk table is not defined . + :raises SPSDKError: Source index is not defined . + """ + super().__init__() + if not srk_table: + raise SPSDKError("SRK table must be defined.") + self.srk_table = srk_table + if source_index is None: + raise SPSDKError("Source index must be defined.") + self.source_index = source_index + + @staticmethod + def parse( + config: SectionConfig, search_paths: Optional[List[str]] = None + ) -> "SecCsfInstallSrk": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecCsfInstallSrk.check_config_section_params(config) + + source_index = int(config.options["InstallSRK_SourceIndex"]) + srk_table = load_binary(config.options["InstallSRK_Table"], search_paths=search_paths) + + return SecCsfInstallSrk(srk_table=srk_table, source_index=source_index) + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd = CmdInstallKey(flags=EnumInsKey.CLR, hash_alg=EnumAlgorithm.SHA256, tgt_index=0) + + self.cmd.certificate_ref = SrkTable.parse(self.srk_table) + self.cmd.source_index = self.source_index + + +class SecCsfInstallCsfk(SecCommand): + """Install CSFK command.""" + + CMD_INDEX = 22 + CONFIGURATION_PARAMS = {"InstallCSFK_File": True, "InstallCSFK_CertificateFormat": False} + + def __init__( + self, + csfk_file_path: str, + certificate_format: Optional[EnumCertFormat], + ) -> None: + """Install CSF class constructor. + + :param csfk_file_path: Path to CSFK file + :param version: Header version + :param certificate_format: Certificate format + :raises SPSDKValueError: Invalid combination of input parameters. + """ + super().__init__() + self._version: Optional[int] = None + self.csfk_file_path = csfk_file_path + if certificate_format == EnumCertFormat.SRK: + raise SPSDKValueError(f"Invalid certificate format: {EnumCertFormat.SRK}") + if certificate_format is None: + certificate_format == EnumCertFormat.X509 + self.certificate_format = certificate_format + + @staticmethod + def parse( + config: SectionConfig, search_paths: Optional[List[str]] = None + ) -> "SecCsfInstallCsfk": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecCsfInstallCsfk.check_config_section_params(config) + + csfk_file_path = find_file(config.options["InstallCSFK_File"], search_paths=search_paths) + cert_format = config.options.get("InstallCSFK_CertificateFormat") + cert_format = EnumCertFormat[cert_format] if cert_format is not None else None + + return SecCsfInstallCsfk( + csfk_file_path=csfk_file_path, + certificate_format=cert_format, + ) + + @property + def version(self) -> int: + """Image version.""" + assert self._version is not None + return self._version + + @version.setter + def version(self, value: int) -> None: + """Image version setter.""" + if not isinstance(value, int): + raise SPSDKTypeError("Version must be int type") + self._version = value + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: CmdInstallKey = CmdInstallKey( + flags=EnumInsKey.CSF, + tgt_index=1, + ) + self.cmd.certificate_format = self.certificate_format # type: ignore + certificate_bin = load_binary(self.csfk_file_path) + certificate = load_certificate_from_data(certificate_bin) + self.cmd.certificate_ref = CertificateImg( + version=self.version, data=certificate.public_bytes(Encoding.DER) + ) + + +class SecCsfAuthenticateCsf(SecCommand): + """Authenticate CSFK command.""" + + CMD_INDEX = 24 + CONFIGURATION_PARAMS = { + "AuthenticateCsf_PrivateKeyFile": False, + "AuthenticateCsf_KeyPass": False, + } + SIGNED_DATA_SIZE = 768 + + def __init__( + self, + private_key: Optional[bytes], + key_pass: Optional[str] = None, + ) -> None: + """Authenticate CSFK class constructor. + + :param version: Header version + :param certificate: Certificate + :param private_key: Private key used for authentication + :param data: Command data to be signed + :param key_pass: Key for decryption of private key + """ + super().__init__() + self.private_key = private_key + self.key_pass = key_pass + self._version: Optional[int] = None + self._certificate: Optional[Certificate] = None + self._engine: Optional[EnumEngine] = None + + @staticmethod + def parse( + config: SectionConfig, search_paths: Optional[List[str]] = None + ) -> "SecCsfAuthenticateCsf": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecCsfAuthenticateCsf.check_config_section_params(config) + private_key_path = config.options.get("AuthenticateCsf_PrivateKeyFile") + private_key = None + if private_key_path is not None: + private_key = load_binary(private_key_path, search_paths=search_paths) + + key_pass = None + private_key_pass_path = config.options.get("AuthenticateCsf_KeyPass") + if private_key_pass_path is not None: + private_key_pass_file = find_file(private_key_pass_path, search_paths=search_paths) + with open(private_key_pass_file) as file: + key_pass = file.readline().strip() + return SecCsfAuthenticateCsf(private_key=private_key, key_pass=key_pass) + + @property + def certificate(self) -> Certificate: + """Certificate.""" + assert self._certificate is not None + return self._certificate + + @certificate.setter + def certificate(self, value: Certificate) -> None: + """Certificate setter.""" + if not isinstance(value, Certificate): + raise SPSDKTypeError("Certificate is of incorrect type") + self._certificate = value + + @property + def engine(self) -> Optional[EnumEngine]: + """Engine.""" + return self._engine + + @engine.setter + def engine(self, value: Optional[EnumEngine]) -> None: + """Engine setter.""" + if not (isinstance(value, EnumEngine) or isinstance(value, int)): + raise SPSDKTypeError("Engine is of incorrect type") + self._engine = value + + @property + def version(self) -> int: + """Image version.""" + assert self._version is not None + return self._version + + @version.setter + def version(self, value: int) -> None: + """Image version setter.""" + if not isinstance(value, int): + raise SPSDKTypeError("Version must be int type") + self._version = value + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: CmdAuthData = CmdAuthData(certificate=self.certificate) + if self.engine is not None: + self.cmd.engine = self.engine + + assert self.private_key is not None + pem_private_key = load_private_key_from_data( + self.private_key, password=str.encode(self.key_pass) if self.key_pass else None + ) + self.cmd.private_key_pem_data = pem_private_key # type: ignore + + signature = Signature(version=self.version) + self.cmd.signature = signature + + def sign(self, data: bytes, timestamp: datetime) -> None: + """Sign data and update command signature. + + :param data: Data to be signed + :param timestamp: Signature timestamp + """ + data = align_block(data, alignment=self.SIGNED_DATA_SIZE, padding=BinaryPattern("zeros")) + self.cmd.update_signature(zulu=timestamp, data=data) + + +class SecCsfInstallKey(SecCommand): + """Install key command.""" + + CMD_INDEX = 25 + CONFIGURATION_PARAMS = { + "InstallKey_File": True, + "InstallKey_VerificationIndex": True, + "InstallKey_TargetIndex": True, + } + + def __init__( + self, + certificate_path: str, + source_index: int, + target_index: int, + ) -> None: + """Install key class constructor. + + :param certificate_path: Path to certificate + :param version: Header version + :param source_index: Source index + :param target_index: Target index + """ + super().__init__() + self.certificate_path = certificate_path + self.certificate = load_certificate_from_data(load_binary(certificate_path)) + self.source_index = source_index + self.target_index = target_index + self._version: Optional[int] = None + + @staticmethod + def parse( + config: SectionConfig, search_paths: Optional[List[str]] = None + ) -> "SecCsfInstallKey": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecCsfInstallKey.check_config_section_params(config) + + install_key_path = config.options["InstallKey_File"] + certificate_path = find_file(install_key_path, search_paths=search_paths) + + source_index = int(config.options["InstallKey_VerificationIndex"]) + + target_index = int(config.options["InstallKey_TargetIndex"]) + return SecCsfInstallKey( + certificate_path=certificate_path, source_index=source_index, target_index=target_index + ) + + @property + def version(self) -> int: + """Image version.""" + assert self._version is not None + return self._version + + @version.setter + def version(self, value: int) -> None: + """Image version setter.""" + if not isinstance(value, int): + raise SPSDKTypeError("Version must be int type") + self._version = value + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: CmdInstallKey = CmdInstallKey(cert_fmt=EnumCertFormat.X509) + self.cmd.certificate_ref = CertificateImg( + version=self.version, data=self.certificate.public_bytes(Encoding.DER) + ) + self.cmd.source_index = self.source_index + self.cmd.target_index = self.target_index + + +class SecCsfAuthenticateData(SecCommand): + """Authenticate data command.""" + + CMD_INDEX = 26 + KEY_IDX_AUT_DAT_FAST_AUTH = 0 + KEY_IDX_AUT_DAT_MIN = 2 + KEY_IDX_AUT_DAT_MAX = 5 + CONFIGURATION_PARAMS = { + "AuthenticateData_VerificationIndex": True, + "AuthenticateData_Engine": True, + "AuthenticateData_EngineConfiguration": True, + "AuthenticateData_PrivateKeyFile": False, + "AuthenticateData_KeyPass": False, + } + + def __init__( + self, + engine: EnumEngine, + engine_config: int, + verification_index: int, + private_key: Optional[bytes], + key_pass: Optional[str] = None, + ) -> None: + """Authenticate data class constructor. + + :param engine: Engine plugin tag + :param engine_config: Engine configuration index + :param verification_index: Target index + :raises SPSDKValueError: Invalid combination of input parameters. + :raises SPSDKValueError: Verification index is not defined. + :raises SPSDKValueError: Key index is not a valid value. + """ + super().__init__() + if engine == EnumEngine.ANY and engine_config != 0: + raise SPSDKValueError(f"Invalid argument combination:{engine}: {engine_config}") + self.engine = engine + self.engine_config = engine_config + if verification_index is None: + raise SPSDKValueError(f"Verification index must be defined.") + if verification_index != self.KEY_IDX_AUT_DAT_FAST_AUTH and ( + verification_index < self.KEY_IDX_AUT_DAT_MIN + or verification_index > self.KEY_IDX_AUT_DAT_MAX + ): + raise SPSDKValueError(f"Key index must have valid value.") + self.verification_index = verification_index + self.private_key = private_key + self.key_pass = key_pass + self._certificate: Optional[Certificate] = None + self._blocks: List[ImageBlock] = [] + + @property + def blocks(self) -> List[ImageBlock]: + """Blocks to be signed property.""" + return self._blocks + + @blocks.setter + def blocks(self, value: List[ImageBlock]) -> None: + """Blocks to be signed property setter.""" + if not isinstance(value, List): + raise SPSDKTypeError("Blocks must be a list type") + self._blocks = value + + def sign( + self, + data: bytes, + base_data_address: int, + timestamp: Optional[datetime] = None, + ) -> None: + """Sign data and update command signature. + + :param data: Data to be signed + :param base_data_address: Base address of the generated data + :param timestamp: Signature timestamp + """ + if timestamp is None: + timestamp = datetime.now(timezone.utc) + self.cmd.update_signature( + zulu=timestamp, + data=data, + base_data_addr=base_data_address, + ) + + @staticmethod + def parse( + config: SectionConfig, search_paths: Optional[List[str]] = None + ) -> "SecCsfAuthenticateData": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecCsfAuthenticateData.check_config_section_params(config) + verification_index = int(config.options["AuthenticateData_VerificationIndex"]) + engine = EnumEngine[config.options["AuthenticateData_Engine"]] + engine_cfg = int(config.options["AuthenticateData_EngineConfiguration"]) + + private_key_path = config.options.get("AuthenticateData_PrivateKeyFile") + private_key = None + if private_key_path is not None: + private_key = load_binary(private_key_path, search_paths=search_paths) + + key_pass = None + private_key_pass_path = config.options.get("AuthenticateData_KeyPass") + if private_key_pass_path is not None: + private_key_pass_file = find_file(private_key_pass_path, search_paths=search_paths) + with open(private_key_pass_file) as file: + key_pass = file.readline().strip() + return SecCsfAuthenticateData( + verification_index=verification_index, + engine=engine, + engine_config=engine_cfg, + private_key=private_key, + key_pass=key_pass, + ) + + @property + def certificate(self) -> Certificate: + """Certificate.""" + assert self._certificate is not None + return self._certificate + + @certificate.setter + def certificate(self, value: Certificate) -> None: + """Certificate setter.""" + if not isinstance(value, Certificate): + raise SPSDKTypeError("Certificate is of incorrect type") + self._certificate = value + + @property + def version(self) -> int: + """Image version.""" + assert self._version is not None + return self._version + + @version.setter + def version(self, value: int) -> None: + """Image version setter.""" + if not isinstance(value, int): + raise SPSDKTypeError("Version must be int type") + self._version = value + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: CmdAuthData = CmdAuthData( + certificate=self.certificate, + ) + self.cmd.engine = self.engine + self.cmd.engine_cfg = self.engine_config + self.cmd.key_index = self.verification_index + + assert self.private_key is not None + pem_private_key = load_private_key_from_data( + self.private_key, password=str.encode(self.key_pass) if self.key_pass else None + ) + self.cmd.private_key_pem_data = pem_private_key # type: ignore + + signature = Signature(version=self.version) + self.cmd.signature = signature + + if self.blocks: + for block in self.blocks: + self.cmd.append(block.base_address, block.size) + + @staticmethod + def _get_image_blocks( + image_config: ImageConfig, + app_length: int, + is_encrypted: bool, + search_paths: Optional[List[str]] = None, + ) -> List[ImageBlock]: + """Get image blocks from image binary. + + :param image_config: Loaded image configuration + :param app_length: App length + :param search_paths: List of paths where to search for the file, defaults to None + """ + blocks = [] + # IVT + BDT + blocks.append( + ImageBlock( + base_address=image_config.options.start_address + image_config.options.ivt_offset, + start=image_config.options.ivt_offset, + size=segments.SegIVT2.SIZE + BootImgRT.BDT_SIZE, + ) + ) + if image_config.options.dcd_file_path is not None: + dcd_bin = load_binary(image_config.options.dcd_file_path, search_paths=search_paths) + blocks.append( + ImageBlock( + base_address=image_config.options.start_address + + image_config.options.ivt_offset + + segments.SegIVT2.SIZE + + BootImgRT.BDT_SIZE, + start=image_config.options.ivt_offset + + segments.SegIVT2.SIZE + + BootImgRT.BDT_SIZE, + size=len(dcd_bin), + ) + ) + if image_config.options.xmcd_file_path is not None: + xmcd_bin = load_binary(image_config.options.xmcd_file_path, search_paths=search_paths) + + blocks.append( + ImageBlock( + base_address=image_config.options.start_address + + image_config.options.ivt_offset + + BootImgRT.XMCD_IVT_OFFSET, + start=image_config.options.ivt_offset + BootImgRT.XMCD_IVT_OFFSET, + size=len(xmcd_bin), + ) + ) + if not is_encrypted: + blocks.append( + ImageBlock( + base_address=image_config.options.start_address + + image_config.options.initial_load_size, + start=image_config.options.initial_load_size, + size=app_length, + ) + ) + return blocks + + +class SecSetEngine(SecCommand): + """Set engine command.""" + + CMD_INDEX = 31 + CONFIGURATION_PARAMS = { + "SetEngine_HashAlgorithm": False, + "SetEngine_Engine": False, + "SetEngine_EngineConfiguration": False, + } + + def __init__( + self, + hash_algorithm: Optional[EnumAlgorithm] = None, + engine: Optional[EnumEngine] = None, + engine_cfg: Optional[int] = None, + ) -> None: + """Set engine class constructor. + + :param hash_algorithm: Hash algorithm type + :param engine: Engine plugin tag + :param engine_config: Engine configuration index + """ + super().__init__() + self.hash_algorithm = hash_algorithm + self.engine = engine + self.engine_cfg = engine_cfg + + @staticmethod + def parse(config: SectionConfig, search_paths: Optional[List[str]] = None) -> "SecSetEngine": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecSetEngine.check_config_section_params(config) + hash_algorithm = config.options.get("SetEngine_HashAlgorithm") + hash_algorithm = EnumAlgorithm[hash_algorithm] if hash_algorithm is not None else None + + engine = config.options.get("SetEngine_Engine") + engine = EnumEngine[engine] if engine is not None else None + + engine_cfg = config.options.get("SetEngine_EngineConfiguration") + engine_cfg = int(engine_cfg) if engine_cfg is not None else None + return SecSetEngine(hash_algorithm=hash_algorithm, engine=engine, engine_cfg=engine_cfg) + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd = CmdSet() + if self.hash_algorithm is not None: + self.cmd.hash_algorithm = self.hash_algorithm + + if self.engine is not None: + self.cmd.engine = self.engine + + if self.engine_cfg is not None: + self.cmd.engine_cfg = self.engine_cfg + + +class SecUnlock(SecCommand): + """Unlock engine command.""" + + CMD_INDEX = 33 + ENGINE_CLASSES = {"SNVS": CmdUnlockSNVS, "CAAM": CmdUnlockCAAM} + UNLOCK_FEARTURES = {"LP SWR": 1, "ZMK WRITE": 2} + CONFIGURATION_PARAMS = {"Unlock_Engine": True, "Unlock_Features": False} + + def __init__(self, unlock_engine: str, features: Optional[int]) -> None: + """Unlock class constructor. + + :param unlock_engine: Unlock engine type: can be aither SNVS or CAAM + :param features: Features + :raises SPSDKKeyError: Unknown engine. + """ + super().__init__() + if unlock_engine not in self.ENGINE_CLASSES: + raise SPSDKKeyError(f"Unknown engine {unlock_engine}") + self.unlock_engine = unlock_engine + self.features = features + + @staticmethod + def parse(config: SectionConfig, search_paths: Optional[List[str]] = None) -> SecCommand: + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + :raises SPSDKKeyError: Unknown features. + """ + SecUnlock.check_config_section_params(config) + unlock_engine = config.options["Unlock_Engine"] + unlock_features = config.options.get("Unlock_Features") + if unlock_features is not None: + if unlock_features not in SecUnlock.UNLOCK_FEARTURES: + raise SPSDKKeyError(f"Unknown features {unlock_features}") + unlock_features = SecUnlock.UNLOCK_FEARTURES[unlock_features] + return SecUnlock(unlock_engine=unlock_engine, features=unlock_features) + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: CmdUnlockAbstract = self.ENGINE_CLASSES[self.unlock_engine]() + if self.features is not None: + self.cmd.features = self.features + + +class SecInstallSecretKey(SecCommand): + """Set engine command.""" + + CMD_INDEX = 27 + CONFIGURATION_PARAMS = { + "SecretKey_Name": True, + "SecretKey_Length": False, + "SecretKey_VerifyIndex": False, + "SecretKey_TargetIndex": True, + "SecretKey_ReuseDek": False, + } + + def __init__( + self, + secret_key: bytes, + source_index: int, + target_index: int, + ) -> None: + """Set install secret key class constructor. + + :param hash_algorithm: Hash algorithm type + :param engine: Engine plugin tag + :param engine_config: Engine configuration index + :raises SPSDKValueError: Source index not specified. + :raises SPSDKValueError: Source index is not lower or equal to 3. + :raises SPSDKValueError: Target index not specified. + """ + super().__init__() + self.secret_key: bytes = secret_key + if source_index is None: + raise SPSDKValueError("Source index must be specified") + if source_index > 3: + raise SPSDKValueError(f"Source index must be equal or lower than 3") + self.source_index = source_index + if target_index is None: + raise SPSDKValueError("Target index must be specified") + self.target_index = target_index + self._location: Optional[int] = None + + @staticmethod + def parse( + config: SectionConfig, search_paths: Optional[List[str]] = None + ) -> "SecInstallSecretKey": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecInstallSecretKey.check_config_section_params(config) + reuse_dek = True if config.options.get("SecretKey_ReuseDek", 0) == 1 else False + length = int(config.options.get("SecretKey_Length", 128)) # type: ignore + if length not in [128, 192, 256]: + raise SPSDKValueError(f"Invalid sectet key length {length}") + key_length = length // 8 + if reuse_dek: + secret_key_path = find_file(config.options["SecretKey_Name"], search_paths=search_paths) + secret_key = load_binary(secret_key_path) + else: + base_dir = search_paths[0] if search_paths is not None else None + secret_key_path = get_abs_path(config.options["SecretKey_Name"], base_dir) + secret_key = SecInstallSecretKey.generate_random_bytes(length // 8) + SecInstallSecretKey.save_secret_key(secret_key_path, secret_key) + if len(secret_key) != key_length: + raise SPSDKError( + f"Loaded secret key lenght does not match the expected length: {length}" + ) + source_index = int(config.options.get("SecretKey_VerifyIndex", 0)) # type: ignore + target_index = int(config.options["SecretKey_TargetIndex"]) + return SecInstallSecretKey( + secret_key=secret_key, source_index=source_index, target_index=target_index + ) + + @staticmethod + def save_secret_key(secret_key_path: str, secret_key: bytes) -> None: + """Save given sectret key into file. + + :param secret_key_path: Path to file with secret key + :param secret_key: Secret key to be saved + """ + exists = os.path.isfile(secret_key_path) + if exists: + os.remove(secret_key_path) + write_file(secret_key, secret_key_path, "wb") + + @property + def location(self) -> int: + """Start address of DEK key.""" + assert self._location is not None + return self._location + + @location.setter + def location(self, value: int) -> None: + """Setter for start address of DEK key.""" + if not isinstance(value, int): + raise SPSDKTypeError("Location must be int type") + self._location = value + + def build_command(self) -> None: + """Build command with given properties.""" + assert self.location is not None + self.cmd: CmdInstallKey = CmdInstallKey( + flags=EnumInsKey.ABS, + cert_fmt=EnumCertFormat.BLOB, + hash_alg=EnumAlgorithm.ANY, + location=self.location, + ) + self.cmd.source_index = self.source_index + self.cmd.target_index = self.target_index + + +class SecDecryptData(SecCommand): + """Set engine command.""" + + CMD_INDEX = 28 + CONFIGURATION_PARAMS = { + "Decrypt_Engine": False, + "Decrypt_EngineConfiguration": False, + "Decrypt_VerifyIndex": True, + "Decrypt_MacBytes": False, + "Decrypt_Nonce": False, + } + + def __init__( + self, + verification_index: int, + mac_len: Optional[int], + nonce: Optional[bytes] = None, + engine: Optional[EnumEngine] = None, + engine_config: Optional[int] = None, + ) -> None: + """Decrypt data class constructor. + + :param verification_index: Target index + :param mac_len: Number of mac bytes + :param nonce: Nonce binary + :param engine: Engine plugin tag + :param engine_config: Engine configuration index + :raises SPSDKValueError: Invalid combination of input parameters. + """ + super().__init__() + if verification_index is None: + raise SPSDKValueError(f"Verification index must be defined.") + if verification_index >= 6: + raise SPSDKValueError(f"Verification index must be lower than 6.") + self.verification_index = verification_index + self.engine = engine if engine is not None else EnumEngine.ANY + self.engine_config = engine_config if engine_config is not None else 0 + if engine == EnumEngine.ANY and engine_config != 0: + raise SPSDKValueError(f"Invalid argument combination:{engine}: {engine_config}") + self.mac_len = mac_len if mac_len is not None else 16 + if self.mac_len < 4 or self.mac_len > 16 or self.mac_len % 2: + raise SPSDKValueError( + f"Invalid mac length. Valid options are 4, 6, 8, 10, 12, 14 and 16." + ) + self.nonce = nonce + self._dek: Optional[bytes] = None + self._blocks: Optional[List[ImageBlock]] = None + + def encrypt(self, data: bytes) -> Tuple[bytes, bytes]: + """Encrypt data and return mac and encrypted data. + + :raises SPSDKError: Invalid length of encrypted data. + """ + assert self.dek is not None + data_to_encrypt: bytes = b"" + if self.blocks: + for block in self.blocks: + data_to_encrypt += data[block.start : block.start + block.size] + else: + data_to_encrypt = data + if self.nonce is None: + nonce_len = BootImgRT.aead_nonce_len(len(data_to_encrypt)) + self.nonce = SecDecryptData.generate_random_bytes(nonce_len) + aesccm = AESCCM(self.dek, tag_length=self.mac_len) + encr = aesccm.encrypt(self.nonce, data_to_encrypt, None) # type: ignore + if len(encr) != len(data_to_encrypt) + self.mac_len: + raise SPSDKError("Invalid length of encrypted data") + mac = encr[-self.mac_len :] + data = encr[: -self.mac_len] + return mac, data + + @property + def dek(self) -> bytes: + """Data encryption key.""" + assert self._dek is not None + return self._dek + + @dek.setter + def dek(self, value: bytes) -> None: + """Data encryption key setter.""" + if not isinstance(value, bytes): + raise SPSDKTypeError("Dek must be bytes type") + self._dek = value + + @property + def blocks(self) -> Optional[List[ImageBlock]]: + """Blocks to be encrypted property.""" + return self._blocks + + @blocks.setter + def blocks(self, value: List[ImageBlock]) -> None: + """Blocks to be encrypted property setter.""" + if not isinstance(value, List): + raise SPSDKTypeError("Blocks must be a list type") + self._blocks = value + + @staticmethod + def parse(config: SectionConfig, search_paths: Optional[List[str]] = None) -> "SecDecryptData": + """Parse configuration into the command. + + :param config: Section config + :param search_paths: List of paths where to search for the file, defaults to None + """ + SecDecryptData.check_config_section_params(config) + engine = config.options.get("Decrypt_Engine") + if engine is not None: + engine = EnumEngine[engine] + + engine_cfg = config.options.get("Decrypt_EngineConfiguration") + if engine_cfg is not None: + engine_cfg = int(engine_cfg) + + verification_index = int(config.options["Decrypt_VerifyIndex"]) + + mac_len = config.options.get("Decrypt_MacBytes") + if mac_len is not None: + mac_len = int(mac_len) + + nonce = config.options.get("Decrypt_Nonce") + if nonce is not None: + nonce = load_binary(nonce, search_paths=search_paths) + return SecDecryptData( + verification_index=verification_index, + mac_len=mac_len, + nonce=nonce, + engine=engine, + engine_config=engine_cfg, + ) + + def build_command(self) -> None: + """Build command with given properties.""" + self.cmd: CmdAuthData = CmdAuthData(flags=EnumAuthDat.CLR, sig_format=EnumCertFormat.AEAD) + + self.cmd.engine = self.engine + self.cmd.engine_cfg = self.engine_config + self.cmd.key_index = self.verification_index + if self.blocks: + for block in self.blocks: + self.cmd.append(block.base_address, block.size) + + @staticmethod + def _get_image_blocks( + image_config: ImageConfig, + app_length: int, + ) -> List[ImageBlock]: + blocks = [] + blocks.append( + ImageBlock( + base_address=image_config.options.start_address + + image_config.options.initial_load_size, + start=image_config.options.initial_load_size, + size=app_length, + ) + ) + return blocks + + +class CsfBuilder: + """Csf command builder.""" + + def __init__( + self, + bd_config: ImageConfig, + csf_offset: int, + hab_image: HabBinaryImage, + search_paths: Optional[List[str]] = None, + timestamp: Optional[datetime] = None, + ) -> None: + """CSF builder class constructor. + + :param bd_config: Loaded image configuration + :param csf_offset: CSF segment offset + :param hab_image: Hab binary image + :param search_paths: List of paths where to search for the file, defaults to None + :param timestamp: Signature timestamp + """ + self.reset() + self.bd_config = bd_config + self.is_encrypted = self.bd_config.options.flags == 0x0C + self.is_authenticated = self.bd_config.options.flags == 0x08 + self.csf_offset = csf_offset + self.search_paths = search_paths + self.timestamp = timestamp if timestamp is not None else datetime.now(timezone.utc) + if self.is_authenticated or self.is_encrypted: + hab_image.align_segment(HabSegment.APP, 16) + self.hab_image = hab_image + + def reset(self) -> None: + """Reset builder into its initial state.""" + self.header: Optional[SecCsfHeader] = None + self.commands: List[SecCommand] = [] + + def get_command(self, command_id: int, raise_exc: bool = True) -> Optional[SecCommand]: + """Get command by command id. + + :param command_id: Command ID to be retrieved + :param raise_exc: If set and section is not found, the error is raised + :raises SPSDKKeyError: If command does not exist + """ + command = find_first(self.commands, lambda cmd: cmd.CMD_INDEX == command_id) + if raise_exc and command is None: + raise SPSDKKeyError(f"Section with id {command_id} does not exist.") + return command + + def append_command(self, command: SecCommand) -> None: + """Append command to list of commands and update header length. + + :param command: Command to be appended + """ + assert self.header + assert self.header.cmd + header = self.header.cmd + header.length += len(command.cmd.export()) + self.commands.append(command) + + def get_padding_hab_image(self) -> HabBinaryImage: + """Get HAB image with initial padding.""" + image = deepcopy(self.hab_image) + for sub_img in image.sub_images: + sub_img.offset += self.bd_config.options.ivt_offset + return image + + @property + def keyblob_address(self) -> int: + """Keyblob address property.""" + return ( + self.bd_config.options.start_address + + self.csf_offset + + self.bd_config.options.ivt_offset + + self.hab_image.CSF_SIZE + ) + + def build_csf_header(self) -> None: + """Build CSF header command.""" + bd_section = self.bd_config.get_section(SecCsfHeader.CMD_INDEX) + if not bd_section: + return + command = SecCsfHeader.parse(bd_section, search_paths=self.search_paths) + command.build_command() + self.header = command + + def build_csf_install_srk(self) -> None: + """Build CSF install SRK command.""" + bd_section = self.bd_config.get_section(SecCsfInstallSrk.CMD_INDEX) + if not bd_section: + return + command = SecCsfInstallSrk.parse(bd_section, search_paths=self.search_paths) + command.build_command() + self.append_command(command) + + def build_csf_install_csfk(self) -> None: + """Build CSF install CSFK command.""" + bd_section = self.bd_config.get_section(SecCsfInstallCsfk.CMD_INDEX) + if not bd_section: + return + + assert self.header is not None + command = SecCsfInstallCsfk.parse(bd_section, search_paths=self.search_paths) + command.version = self.header.version + command.build_command() + + self.append_command(command) + + def build_authenticate_csfk(self) -> None: + """Build authenticate CSFK command.""" + bd_section = self.bd_config.get_section(SecCsfAuthenticateCsf.CMD_INDEX) + if not bd_section: + return + + assert self.header is not None + install_csfk: SecCsfInstallCsfk = self.get_command(SecCsfInstallCsfk.CMD_INDEX) # type: ignore + + command = SecCsfAuthenticateCsf.parse(bd_section, search_paths=self.search_paths) + if command.private_key is None: + private_key_path = self._determine_private_key_path(install_csfk.csfk_file_path) + if not private_key_path: + raise SPSDKFileNotFoundError("Private key could not be found.") + private_key = load_binary(private_key_path, search_paths=self.search_paths) + command.private_key = private_key + + if command.key_pass is None: + key_pass_file = self._determine_key_pass_path(install_csfk.csfk_file_path) + if key_pass_file: + with open(key_pass_file) as file: + command.key_pass = file.readline().strip() + + command.certificate = load_certificate_from_data( + load_binary(install_csfk.csfk_file_path, search_paths=self.search_paths) + ) + command.version = self.header.version + command.engine = self.header.engine + command.build_command() + + # This is just temporary signature. + # It will be recreated in the finish method + data_to_sign = self.header.cmd.export() + for section in self.commands: + data_to_sign += section.cmd.export() + data_to_sign += command.cmd.export() + + command.sign(data_to_sign, self.timestamp) + self.append_command(command) + + def build_install_key_csfk(self) -> None: + """Build install key CSFK command.""" + bd_section = self.bd_config.get_section(SecCsfInstallKey.CMD_INDEX) + if not bd_section: + return + + assert self.header is not None + command = SecCsfInstallKey.parse(bd_section, search_paths=self.search_paths) + command.version = self.header.version + command.build_command() + self.append_command(command) + + def build_authenticate_data(self) -> None: + """Build authenticate data command.""" + bd_section = self.bd_config.get_section(SecCsfAuthenticateData.CMD_INDEX) + if not bd_section: + return + + assert self.header is not None + install_key: SecCsfInstallKey = self.get_command(SecCsfInstallKey.CMD_INDEX) # type: ignore + + command = SecCsfAuthenticateData.parse(bd_section, search_paths=self.search_paths) + if command.private_key is None: + private_key_path = self._determine_private_key_path(install_key.certificate_path) + if not private_key_path: + raise SPSDKFileNotFoundError("Private key could not be found.") + command.private_key = load_binary(private_key_path, search_paths=self.search_paths) + + if command.key_pass is None: + key_pass_file = self._determine_key_pass_path(install_key.certificate_path) + if key_pass_file: + with open(key_pass_file) as file: + command.key_pass = file.readline().strip() + + app = self.hab_image.get_hab_segment(HabSegment.APP) + blocks = SecCsfAuthenticateData._get_image_blocks( + self.bd_config, + app_length=len(app), + is_encrypted=self.is_encrypted, + search_paths=self.search_paths, + ) + + command.certificate = install_key.certificate + command.version = self.header.version + command.blocks = blocks + command.build_command() + + padding_image = self.get_padding_hab_image() + command.sign( + data=padding_image.export(), + base_data_address=self.bd_config.options.start_address, + timestamp=self.timestamp, + ) + self.append_command(command) + + def build_set_engine(self) -> None: + """Build set engine command.""" + bd_section = self.bd_config.get_section(SecSetEngine.CMD_INDEX) + if not bd_section: + return + command = SecSetEngine.parse(bd_section, search_paths=self.search_paths) + command.build_command() + self.append_command(command) + + def build_unlock_engine(self) -> None: + """Build unlock engine command.""" + bd_section = self.bd_config.get_section(SecUnlock.CMD_INDEX) + if not bd_section: + return + command = SecUnlock.parse(bd_section, search_paths=self.search_paths) + command.build_command() + self.append_command(command) + + def build_install_secret_key(self) -> None: + """Build install Secret key command. + + :raises SPSDKError: Incorrect version is used + """ + bd_section = self.bd_config.get_section(SecInstallSecretKey.CMD_INDEX) + if not bd_section: + return + + assert self.header is not None + + if self.header.version <= 0x40: + raise SPSDKError("The command is supported from version 0x41 onwards") + + command = SecInstallSecretKey.parse(bd_section, search_paths=self.search_paths) + command.location = self.keyblob_address + command.build_command() + self.append_command(command) + + def build_decrypt_data(self) -> None: + """Build install Secret key command.""" + bd_section = self.bd_config.get_section(SecDecryptData.CMD_INDEX) + if not bd_section: + return + + install_secret_key: SecInstallSecretKey = self.get_command(SecInstallSecretKey.CMD_INDEX) # type: ignore + + command = SecDecryptData.parse(bd_section, search_paths=self.search_paths) + command.dek = install_secret_key.secret_key + app = self.hab_image.get_hab_segment(HabSegment.APP) + blocks = SecDecryptData._get_image_blocks( + self.bd_config, + app_length=app.aligned_length(16), + ) + command.blocks = blocks + command.build_command() + self.append_command(command) + + def finish(self) -> None: + """Finish command creation.""" + if not self.commands: + return None + assert self.header is not None + # Encrypt data if needed + if self.is_encrypted: + encrypt_data_cmd: SecDecryptData = self.get_command(SecDecryptData.CMD_INDEX) # type: ignore + app = self.hab_image.get_hab_segment(HabSegment.APP) + assert app is not None + + padding_image = self.get_padding_hab_image() + mac, data = encrypt_data_cmd.encrypt(padding_image.export()) + + app.binary = data + # Update signature + decrypt: SecDecryptData = self.get_command(SecDecryptData.CMD_INDEX) # type: ignore + assert decrypt.nonce is not None + decrypt.cmd.signature = MAC( + version=self.header.version, + nonce_len=len(decrypt.nonce), + mac_len=decrypt.mac_len, + data=decrypt.nonce + mac, + ) + + auth_command: SecCsfAuthenticateCsf = self.get_command(SecCsfAuthenticateCsf.CMD_INDEX) # type: ignore + # Sign all command's data at the end of whole process + if auth_command is not None: + csf = self._build_csf_segment() + data_to_sign = self.header.cmd.export() + for section in csf.commands: + data_to_sign += section.export() + auth_command.cmd.update_signature(zulu=self.timestamp, data=data_to_sign) + self.hab_image.add_hab_segment( + HabSegment.CSF, self._build_csf_segment().export(), offset_override=self.csf_offset + ) + + def _build_csf_segment(self) -> segments.SegCSF: + """Build whole CSF segment from individual commands.""" + assert self.header is not None + csf = segments.SegCSF(version=self.header.version, enabled=True) + for section in self.commands: + csf.append_command(section.cmd) # type: ignore + csf.update(True) + return csf + + def _determine_private_key_path(self, cert_file_path: str) -> Optional[str]: + """Determine private key path the same was as legacy CST tool does. + + :param cert_file_path: Path to certificate file + :return: Path to private key file + """ + logger.debug(f"Trying to determine the private key path.") + keys_dir = self._get_keys_dir(cert_file_path) + cert_file_name = os.path.basename(cert_file_path) + cert_file, cert_extension = os.path.splitext(cert_file_name) + if cert_file.endswith("crt"): + key_file = cert_file[:-3] + "key" + key_file_name = key_file + cert_extension + else: + return None + private_key_file = os.path.join(keys_dir, key_file_name) + if not os.path.isfile(private_key_file): + return None + return private_key_file + + def _determine_key_pass_path(self, cert_file_path: str) -> Optional[str]: + """Determine key pass path the same was as legacy CST tool does. + + :param cert_file_path: Path to certificate file + :return: Path to key pass file + """ + logger.debug(f"Trying to determine the key pass path.") + keys_dir = self._get_keys_dir(cert_file_path) + key_pass_file = os.path.join(keys_dir, "key_pass.txt") + if not os.path.isfile(key_pass_file): + return None + return key_pass_file + + @staticmethod + def _get_keys_dir(cert_file_path: str) -> str: + """Get keys directory from certificate file path. + + :param cert_file_path: Path to certificate file + :return: Keys directory path + """ + directory, _ = os.path.split(cert_file_path) + if directory.endswith("crts"): + return directory[:-4] + "keys" + return cert_file_path + + +class CsfBuildDirector: + """CSF command build director.""" + + def __init__(self, builder: CsfBuilder) -> None: + """CSF build director class constructor. + + :param builder: CSF builder + """ + self._builder: CsfBuilder = builder + + @property + def builder(self) -> CsfBuilder: + """CSF builder property.""" + return self._builder + + def build_csf(self) -> None: + """Build individual CSF commands.""" + self._builder.build_csf_header() + self._builder.build_csf_install_srk() + self._builder.build_csf_install_csfk() + self._builder.build_authenticate_csfk() + self._builder.build_install_key_csfk() + self._builder.build_authenticate_data() + self._builder.build_set_engine() + self._builder.build_unlock_engine() + self._builder.build_install_secret_key() + self._builder.build_decrypt_data() + self._builder.finish() diff --git a/spsdk/image/hab/hab_binary_image.py b/spsdk/image/hab/hab_binary_image.py new file mode 100644 index 00000000..36693703 --- /dev/null +++ b/spsdk/image/hab/hab_binary_image.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# Copyright 2023 NXP +# +# SPDX-License-Identifier: BSD-3-Clause + +"""HAB Binary Image extension.""" + +from enum import Enum +from typing import Optional + +from spsdk.exceptions import SPSDKKeyError +from spsdk.image import segments +from spsdk.image.images import BootImgRT +from spsdk.utils.images import BinaryImage +from spsdk.utils.misc import BinaryPattern, align_block, find_first + + +class HabSegment(str, Enum): + """Enum definition for HAB segments.""" + + IVT = "ivt" + BDT = "bdt" + DCD = "dcd" + XMCD = "xmcd" + CSF = "csf" + APP = "app" + + +class HabBinaryImage(BinaryImage): + """HAB binary image.""" + + IVT_OFFSET = 0 + BDT_OFFSET = IVT_OFFSET + segments.SegIVT2.SIZE + DCD_OFFSET = BDT_OFFSET + BootImgRT.BDT_SIZE + XMCD_OFFSET = IVT_OFFSET + BootImgRT.XMCD_IVT_OFFSET + + CSF_SIZE = 0x2000 + KEYBLOB_SIZE = 0x200 + + def __init__(self) -> None: + """HAB Binary Image Constructor.""" + super().__init__(name="HAB", size=0, pattern=BinaryPattern("zeros")) + + def add_hab_segment( + self, + segment_name: HabSegment, + binary: bytes, + offset_override: Optional[int] = None, + ) -> BinaryImage: + """Create binary image and add it into parent image. + + :param segment_name: Segment to be added + :param binary: Segment binary + :param offset_override: Segment offset in the parent image + :return: Created bootable image + """ + segment_defintions = { + HabSegment.IVT: (segments.SegIVT2.SIZE, self.IVT_OFFSET), + HabSegment.BDT: (segments.SegBDT.SIZE, self.BDT_OFFSET), + HabSegment.DCD: (None, self.DCD_OFFSET), + HabSegment.XMCD: (None, self.XMCD_OFFSET), + HabSegment.CSF: (BootImgRT.CSF_SIZE, None), + } + size, offset = segment_defintions.get(segment_name, (None, None)) + if size is None: + size = len(binary) + if offset_override is not None: + offset = offset_override + assert offset is not None + image = BinaryImage( + name=segment_name.value, + size=size, + offset=offset, + binary=binary, + parent=self, + ) + self.add_image(image) + return image + + def get_hab_segment(self, segment_name: HabSegment) -> BinaryImage: + """Get HAB segment. + + :param segment_name: Segment to be added + :raises SPSDKKeyError: If HAB segment not found. + :return: Segment as binary image + """ + seg = find_first(self.sub_images, lambda x: x.name == segment_name.value) + if seg is None: + raise SPSDKKeyError(f"Segment with name {segment_name} does not exist.") + return seg + + def align_segment(self, segment_name: HabSegment, alignment: int = 16) -> None: + """Align HAB segment. + + :param segment_name: Segment to be aligned + :param alignment: Alignement length + """ + seg = self.get_hab_segment(segment_name) + assert seg.binary + aligned_seg = align_block(seg.binary, alignment) + seg.binary = aligned_seg + seg.size = len(aligned_seg) diff --git a/spsdk/image/hab/hab_container.py b/spsdk/image/hab/hab_container.py index efe5f06a..96c4064b 100644 --- a/spsdk/image/hab/hab_container.py +++ b/spsdk/image/hab/hab_container.py @@ -8,178 +8,149 @@ """This module contains HAB related code.""" import logging -from dataclasses import dataclass -from enum import Enum -from typing import Any, Dict, List, Optional, Type +from datetime import datetime +from typing import List, Optional -from spsdk.exceptions import SPSDKKeyError from spsdk.image import segments +from spsdk.image.hab.config_parser import ImageConfig +from spsdk.image.hab.csf_builder import CsfBuildDirector, CsfBuilder +from spsdk.image.hab.hab_binary_image import HabBinaryImage, HabSegment from spsdk.image.images import BootImgRT from spsdk.utils.images import BinaryImage -from spsdk.utils.misc import BinaryPattern, find_file, find_first, load_binary +from spsdk.utils.misc import BinaryPattern, load_binary logger = logging.getLogger(__name__) -class HabEnumSegments(str, Enum): - """Enum definition for 'par' parameter of Check Data command.""" - - IVT = "ivt" - BDT = "bdt" - DCD = "dcd" - XMCD = "xmcd" - APP = "app" - - -@dataclass -class ConfigOptions: - """Dataclass holding data of options section of BD config file.""" - - flags: int - start_address: int - ivt_offset: int - initial_load_size: int - entrypoint_address: int - dcd_file_path: Optional[str] = None - xmcd_file_path: Optional[str] = None - - @staticmethod - def parse(options: Dict[str, Any]) -> "ConfigOptions": - """Parse config options from dictionary. - - :param options: Optiona sto be parsed - """ - return ConfigOptions( - flags=options["flags"], - start_address=options["startAddress"], - ivt_offset=options["ivtOffset"], - initial_load_size=options["initialLoadSize"], - entrypoint_address=options["entryPointAddress"], - dcd_file_path=options.get("DCDFilePath"), - xmcd_file_path=options.get("XMCDFilePath"), - ) - - class HabContainer: """Hab container.""" IVT_VERSION = 0x40 - def __init__(self, binary_image: BinaryImage) -> None: + def __init__(self, hab_image: HabBinaryImage) -> None: """HAB Constructor. :param binary_image: Binary image with required segments. """ - self.binary_image = binary_image + self.hab_image = hab_image @property def ivt_segment(self) -> Optional[bytes]: """IVT segment binary.""" - return self._get_segment_binary(HabEnumSegments.IVT) + segment = self.hab_image.get_hab_segment(HabSegment.IVT) + return segment.binary if segment else None @property def bdt_segment(self) -> Optional[bytes]: """BDT segment binary.""" - return self._get_segment_binary(HabEnumSegments.BDT) + segment = self.hab_image.get_hab_segment(HabSegment.BDT) + return segment.binary if segment else None @property def dcd_segment(self) -> Optional[bytes]: """DCD segment binary.""" - return self._get_segment_binary(HabEnumSegments.DCD) + segment = self.hab_image.get_hab_segment(HabSegment.DCD) + return segment.binary if segment else None @property def xmcd_segment(self) -> Optional[bytes]: """XMCD segment binary.""" - return self._get_segment_binary(HabEnumSegments.XMCD) + segment = self.hab_image.get_hab_segment(HabSegment.XMCD) + return segment.binary if segment else None @property def app_segment(self) -> Optional[bytes]: """APP segment binary.""" - return self._get_segment_binary(HabEnumSegments.APP) - - def _get_segment_binary(self, segment: HabEnumSegments) -> Optional[bytes]: - """Get segment by name. + segment = self.hab_image.get_hab_segment(HabSegment.APP) + return segment.binary if segment else None - :param segment: Segment to be found - """ - seg = find_first(self.binary_image.sub_images, lambda x: x.name == segment.value) - return seg.binary if seg else None + @property + def csf_segment(self) -> Optional[bytes]: + """APP segment binary.""" + segment = self.hab_image.get_hab_segment(HabSegment.CSF) + return segment.binary if segment else None @classmethod def load( - cls, bd_data: Dict[str, Any], external: List, search_paths: Optional[List[str]] = None + cls, + image_config: ImageConfig, + search_paths: Optional[List[str]] = None, + timestamp: Optional[datetime] = None, ) -> "HabContainer": """Load the HAB container object from parsed bd_data configuration. - :param bd_data: Dictionary of the command file content - :param external: List of external files + :param image_config: Image configuration :param search_paths: List of paths where to search for the file, defaults to None + :param timestamp: Signature timestamp """ - options = ConfigOptions.parse(bd_data["options"]) - bin_image = BinaryImage(name=f"HAB", size=0, pattern=BinaryPattern("zeros")) - # TODO: Fix lexer so the externals are parsed into bd_data - app_bin = BinaryImage.load_binary_image(external[0], search_paths=search_paths).export() + hab_image = HabBinaryImage() # IVT ivt = segments.SegIVT2(HabContainer.IVT_VERSION) - ivt.app_address = options.entrypoint_address - ivt.ivt_address = options.start_address + options.ivt_offset - ivt.bdt_address = options.start_address + options.ivt_offset + ivt.size - ivt_image = BinaryImage( - name=HabEnumSegments.IVT.value, - size=len(ivt.export()), - offset=0, - binary=ivt.export(), - parent=bin_image, - ) - bin_image.add_image(ivt_image) + ivt.app_address = image_config.options.entrypoint_address + ivt.ivt_address = image_config.options.start_address + image_config.options.ivt_offset + ivt.bdt_address = ivt.ivt_address + ivt.size + ivt.csf_address = 0 + hab_image.add_hab_segment(HabSegment.IVT, ivt.export()) + ivt_image = hab_image.get_hab_segment(HabSegment.IVT) # BDT - image_len = options.initial_load_size + len(app_bin) - bdt = segments.SegBDT(app_start=options.start_address, app_length=image_len) - bdt_image = BinaryImage( - name=HabEnumSegments.BDT.value, - size=len(bdt.export()), - offset=ivt_image.offset + ivt.bdt_address - ivt.ivt_address, - binary=bdt.export(), - parent=bin_image, - ) - bin_image.add_image(bdt_image) + bdt = segments.SegBDT(app_start=image_config.options.start_address) + hab_image.add_hab_segment(HabSegment.BDT, bdt.export()) # DCD - if options.dcd_file_path is not None: - dcd_path = find_file(options.dcd_file_path, search_paths=search_paths) - dcd_bin = load_binary(dcd_path) - bin_image.add_image( - BinaryImage( - name=HabEnumSegments.DCD.value, - size=len(dcd_bin), - offset=bdt_image.offset + len(bdt_image), - binary=dcd_bin, - parent=bin_image, - ) - ) + if image_config.options.dcd_file_path is not None: + dcd_bin = load_binary(image_config.options.dcd_file_path, search_paths=search_paths) + hab_image.add_hab_segment(HabSegment.DCD, dcd_bin) + ivt.dcd_address = ivt.ivt_address + HabBinaryImage.DCD_OFFSET + ivt_image.binary = ivt.export() # XMCD - if options.xmcd_file_path is not None: - xmcd_path = find_file(options.xmcd_file_path, search_paths=search_paths) - xmcd_bin = load_binary(xmcd_path) - bin_image.add_image( - BinaryImage( - name=HabEnumSegments.XMCD.value, - size=len(xmcd_bin), - offset=ivt_image.offset + BootImgRT.XMCD_IVT_OFFSET, - binary=xmcd_bin, - parent=bin_image, - ) - ) + if image_config.options.xmcd_file_path is not None: + xmcd_bin = load_binary(image_config.options.xmcd_file_path, search_paths=search_paths) + hab_image.add_hab_segment(HabSegment.XMCD, xmcd_bin) # APP - bin_image.add_image( - BinaryImage( - name=HabEnumSegments.APP.value, - size=len(app_bin), - offset=options.initial_load_size - options.ivt_offset, - binary=app_bin, - parent=bin_image, - ) + app_bin = BinaryImage.load_binary_image( + image_config.elf_file, + search_paths=search_paths, + ) + app_offset = image_config.options.initial_load_size - image_config.options.ivt_offset + hab_image.add_hab_segment(HabSegment.APP, app_bin.export(), offset_override=app_offset) + + bdt.app_length = image_config.options.ivt_offset + len(hab_image) + bdt_image = hab_image.get_hab_segment(HabSegment.BDT) + bdt_image.binary = bdt.export() + # Calculate CSF offset + app_image = hab_image.get_hab_segment(HabSegment.APP) + image_len = app_offset + len(app_image) + image_config.options.ivt_offset + csf_offset = HabContainer._calculate_csf_offset(image_len) + csf_offset = csf_offset - image_config.options.ivt_offset + + csf_builder = CsfBuilder( + image_config, + csf_offset=csf_offset, + search_paths=search_paths, + timestamp=timestamp, + hab_image=hab_image, ) - return HabContainer(binary_image=bin_image) + if csf_builder.is_authenticated or csf_builder.is_encrypted: + bdt.app_length = image_config.options.ivt_offset + csf_offset + HabBinaryImage.CSF_SIZE + if csf_builder.is_encrypted: + bdt.app_length += HabBinaryImage.KEYBLOB_SIZE + bdt_image.binary = bdt.export() + ivt.csf_address = ivt.ivt_address + csf_offset + ivt_image.binary = ivt.export() + # CSF + director = CsfBuildDirector(csf_builder) + director.build_csf() + return HabContainer(hab_image=hab_image) + + @staticmethod + def _calculate_csf_offset(image_len: int) -> int: + """Calculate CSF offset from image length. + + :param image_len: Image length + :return: CSF offset + """ + csf_offset = image_len + (16 - (image_len % 16)) + csf_offset = ((csf_offset + 0x1000 - 1) // 0x1000) * 0x1000 + return csf_offset @classmethod def parse(cls, binary: bytes) -> "HabContainer": @@ -187,61 +158,35 @@ def parse(cls, binary: bytes) -> "HabContainer": :param binary:Binary to be parsed """ - rt = BootImgRT.parse(binary) + rt_img = BootImgRT.parse(binary) # IVT - bin_image = BinaryImage(name=f"HAB", size=0, pattern=BinaryPattern("zeros")) - ivt_image = BinaryImage( - name=HabEnumSegments.IVT.value, - size=len(rt.ivt.export()), - offset=rt.offset - rt.ivt_offset, - binary=rt.ivt.export(), - parent=bin_image, - ) - bin_image.add_image(ivt_image) + hab_image = HabBinaryImage() + hab_image.add_hab_segment(HabSegment.IVT, rt_img.ivt.export()) # BDT - if rt.bdt is not None: - bdt_image = BinaryImage( - name=HabEnumSegments.BDT.value, - size=len(rt.bdt.export()), - offset=ivt_image.offset + rt.ivt.bdt_address - rt.ivt.ivt_address, - binary=rt.bdt.export(), - parent=bin_image, - ) - bin_image.add_image(bdt_image) + if rt_img.bdt is not None: + hab_image.add_hab_segment(HabSegment.BDT, rt_img.bdt.export()) # DCD - if rt.dcd is not None: - bin_image.add_image( - BinaryImage( - name=HabEnumSegments.DCD.value, - size=len(rt.dcd.export()), - offset=ivt_image.offset + rt.ivt.dcd_address - rt.ivt.ivt_address, - binary=rt.dcd.export(), - parent=bin_image, - ) - ) + if rt_img.dcd is not None: + hab_image.add_hab_segment(HabSegment.DCD, rt_img.dcd.export()) # XMCD - if rt.xmcd is not None: - bin_image.add_image( - BinaryImage( - name=HabEnumSegments.XMCD.value, - size=len(rt.xmcd.export()), - offset=ivt_image.offset + BootImgRT.XMCD_IVT_OFFSET, - binary=rt.xmcd.export(), - parent=bin_image, - ) + if rt_img.xmcd is not None: + hab_image.add_hab_segment(HabSegment.XMCD, rt_img.xmcd.export()) + # CSF + if rt_img.csf is not None: + hab_image.add_hab_segment( + HabSegment.CSF, + rt_img.csf.export(), + offset_override=rt_img.ivt.csf_address - rt_img.ivt.ivt_address, ) - if rt.app is not None: - bin_image.add_image( - BinaryImage( - name=HabEnumSegments.APP.value, - size=len(rt.app.export()), - offset=ivt_image.offset + rt.app_offset - rt.ivt_offset, - binary=rt.app.export(), - parent=bin_image, - ) + # APP + if rt_img.app is not None: + hab_image.add_hab_segment( + HabSegment.APP, + rt_img.app.export(), + offset_override=rt_img.app_offset - rt_img.ivt_offset, ) - return HabContainer(bin_image) + return HabContainer(hab_image) def export(self) -> bytes: """Export into binary.""" - return self.binary_image.export() + return self.hab_image.export() diff --git a/spsdk/image/secret.py b/spsdk/image/secret.py index 9643b5d4..7fc11d15 100644 --- a/spsdk/image/secret.py +++ b/spsdk/image/secret.py @@ -296,7 +296,7 @@ def parse(cls, data: bytes, offset: int = 0) -> "Signature": class MAC(BaseClass): - """Structure that holds initial parameter for AES encryption/description. + """Structure that holds initial parameter for AES encryption/decryption. - nonce - initialization vector for AEAD AES128 decryption - mac - message authentication code to verify the decryption was successful diff --git a/spsdk/image/segments.py b/spsdk/image/segments.py index 23a00157..889f1c39 100644 --- a/spsdk/image/segments.py +++ b/spsdk/image/segments.py @@ -1483,11 +1483,17 @@ def __init__( :param instance: Number of the interface instance, defaults to 0 :param block_type: Type of XMCD data (0 - Simplified, 1 - Full), defaults to 0 :param block_size: XMCD data block size, defaults to 4 + :raises SPSDKValueError: If the given interface is not supported + :raises SPSDKValueError: If the given blovk type is not supported """ self.tag = 0x0C self.version = 0 + if interface not in [0, 1]: + raise SPSDKValueError(f"Interface not supported: {interface}") self.interface = interface self.instance = instance + if block_type not in [0, 1]: + raise SPSDKValueError(f"Block type not supported: {block_type}") self.block_type = block_type self.block_size = block_size diff --git a/spsdk/image/segments_base.py b/spsdk/image/segments_base.py index 675b0c5a..0421e62f 100644 --- a/spsdk/image/segments_base.py +++ b/spsdk/image/segments_base.py @@ -4,9 +4,7 @@ # Copyright 2022-2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - """This module contains generic implementation of image segment.""" - import abc from typing import Any, Dict diff --git a/spsdk/image/xmcd/xmcd.py b/spsdk/image/xmcd/xmcd.py index a44d0f64..b6d2eea8 100644 --- a/spsdk/image/xmcd/xmcd.py +++ b/spsdk/image/xmcd/xmcd.py @@ -12,20 +12,20 @@ import logging import os from copy import deepcopy -from enum import Enum from typing import Any, Dict, List, Optional from crcmod.predefined import mkPredefinedCrcFun from ruamel.yaml.comments import CommentedMap as CM from spsdk import version as spsdk_version -from spsdk.exceptions import SPSDKError, SPSDKValueError +from spsdk.exceptions import SPSDKError, SPSDKKeyError, SPSDKValueError from spsdk.image.segments import XMCDHeader from spsdk.image.segments_base import SegmentBase from spsdk.image.xmcd import XMCD_DATA_FOLDER, XMCD_DATABASE_FILE, XMCD_SCH_FILE from spsdk.utils.database import Database +from spsdk.utils.easy_enum import Enum from spsdk.utils.registers import Registers -from spsdk.utils.schema_validator import ConfigTemplate, ValidationSchemas +from spsdk.utils.schema_validator import ConfigTemplate, ValidationSchemas, check_config logger = logging.getLogger(__name__) @@ -33,41 +33,15 @@ class MemoryType(Enum): """Support memory types Enum.""" - FLEXSPI_RAM = 0 - SEMC_SDRAM = 1 - - @staticmethod - def get_by_memory_type(type_name: str) -> "MemoryType": - """Get enum member by memory type as string. - - :param type_name: Memory type name. - :raises SPSDKValueError: Unsupported memory type. - :return: Memory type enum member. - """ - types = [mem.name for mem in MemoryType] - if type_name.upper() not in types: - raise SPSDKValueError(f"Memory type with name {type_name} does not exist") - return MemoryType[type_name.upper()] + FLEXSPI_RAM = (0, "flexspi_ram", "FlexSPI RAM") + SEMC_SDRAM = (1, "semc_sdram", "SEMC SDRAM") class ConfigurationBlockType(Enum): """Support configuration blocks Enum.""" - SIMPLIFIED = 0 - FULL = 1 - - @staticmethod - def get_by_config_type(type_name: str) -> "ConfigurationBlockType": - """Get enum member by config type as string. - - :param type_name: Configuration block type name. - :raises SPSDKValueError: Unsupported configuration block type. - :return: Configuration block type enum member. - """ - types = [mem.name for mem in ConfigurationBlockType] - if type_name.upper() not in types: - raise SPSDKValueError(f"Configuration type with name {type_name} does not exist") - return ConfigurationBlockType[type_name.upper()] + SIMPLIFIED = (0, "simplified", "Simplified configuration") + FULL = (1, "full", "Full configuration") class XMCD(SegmentBase): @@ -145,8 +119,8 @@ def parse(self, binary: bytes) -> None: :raises SPSDKError: If given binary block size is not equal to block size in header """ header = XMCDHeader.parse(binary[: XMCDHeader.SIZE]) - self.mem_type = MemoryType(header.interface).name.lower() - self.config_type = ConfigurationBlockType(header.block_type).name.lower() + self.mem_type = MemoryType.name(header.interface) + self.config_type = ConfigurationBlockType.name(header.block_type) option_size = None if header.block_size != len(binary): raise SPSDKError("Invalid XMCD configuration size") @@ -166,19 +140,30 @@ def load_from_config(config: Dict) -> "XMCD": """Load configuration file of XMCD. :param config: XMCD configuration file. + :raises SPSDKKeyError: If XMCD settings do not contain required key :return: XMCD object. """ + check_config(config, XMCD.get_validation_schemas_family()) family = config["family"] revision = config.get("revision", "latest") + mem_type = config["mem_type"] + config_type = config["config_type"] + check_config(config, XMCD.get_validation_schemas(family, mem_type, config_type, revision)) + xmcd_settings: Dict[str, Dict] = config["xmcd_settings"] xmcd = XMCD(family=family, revision=revision) - xmcd.mem_type = config["mem_type"] - xmcd.config_type = config["config_type"] + xmcd.mem_type = mem_type + xmcd.config_type = config_type option_size = None if xmcd.mem_type == "flexspi_ram" and xmcd.config_type == "simplified": - option_size = xmcd_settings["configOption0"]["bitfields"]["optionSize"] + try: + option_size = xmcd_settings["configOption0"]["bitfields"]["optionSize"] + except KeyError as exc: + raise SPSDKKeyError( + "XMCD settings schema must contain optionSize in configOption0" + ) from exc xmcd._registers = xmcd.load_registers( xmcd.family, xmcd.mem_type, xmcd.config_type, xmcd.revision, option_size=option_size ) @@ -321,11 +306,10 @@ def _load_header_registers( regs.load_registers_from_xml(header_file_path) header_reg = regs.find_reg("header") block_type_bf = header_reg.find_bitfield("configurationBlockType") - value = ConfigurationBlockType.get_by_config_type(config_type).value + value = ConfigurationBlockType.get(config_type) block_type_bf.set_value(value) memory_if_bf = header_reg.find_bitfield("memoryInterface") - value = MemoryType.get_by_memory_type(mem_type).value - memory_if_bf.set_value(value) + memory_if_bf.set_value(MemoryType.get(mem_type)) return regs @staticmethod diff --git a/spsdk/mboot/properties.py b/spsdk/mboot/properties.py index d537ac21..8a8c4660 100644 --- a/spsdk/mboot/properties.py +++ b/spsdk/mboot/properties.py @@ -586,8 +586,25 @@ def to_str(self) -> str: return ", ".join(str_values) +class FuseLock: + """Fuse Lock.""" + + def __init__(self, index: int, locked: bool) -> None: + """Initialize object representing information about fuse lock. + + :param index: value of OTP index + :param locked: status of the lock, true if locked + """ + self.index = index + self.locked = locked + + def __str__(self) -> str: + status = "LOCKED" if self.locked else "UNLOCKED" + return f" FUSE{(self.index):03d}: {status}\r\n" + + class FuseLockRegister: - """RAM memory regions.""" + """Fuse Lock Register.""" def __init__(self, value: int, index: int, start: int = 0) -> None: """Initialize object representing the OTP Controller Program Locked Status. @@ -600,21 +617,24 @@ def __init__(self, value: int, index: int, start: int = 0) -> None: self.value = value self.index = index self.msg = "" + self.bitfields: List[FuseLock] = [] shift = 0 for _ in range(start, 32): - bit = (value >> shift) & 1 - status = "LOCKED" if bit else "UNLOCKED" - self.msg += f" FUSE{(index + shift):03d}: {status}\r\n" + locked = (value >> shift) & 1 + self.bitfields.append(FuseLock(index + shift, bool(locked))) shift += 1 def __str__(self) -> str: """Get stringified property representation.""" + if self.bitfields: + for bitfield in self.bitfields: + self.msg += str(bitfield) return f"\r\n{self.msg}" class FuseLockedStatus(PropertyValueBase): - """Reserver Regions property.""" + """Class representing FuseLocked registers.""" __slots__ = ("fuses",) @@ -643,6 +663,16 @@ def to_str(self) -> str: msg += f"OTP Controller Program Locked Status {count} Register: {register}" return msg + def get_fuses(self) -> List[FuseLock]: + """Get list of fuses bitfield objects. + + :return: list of FuseLockBitfield objects + """ + fuses = [] + for registers in self.fuses: + fuses.extend(registers.bitfields) + return fuses + ######################################################################################################################## # McuBoot property response parser diff --git a/spsdk/sbfile/sb2/sb_21_helper.py b/spsdk/sbfile/sb2/sb_21_helper.py index 3700cfda..641c31f5 100644 --- a/spsdk/sbfile/sb2/sb_21_helper.py +++ b/spsdk/sbfile/sb2/sb_21_helper.py @@ -69,6 +69,16 @@ def get_command(cmd_name: str) -> Callable[[Dict], CmdBaseClass]: def _fill_memory(cmd_args: dict) -> CmdFill: """Returns a CmdFill object initialized based on cmd_args. + Fill is a type of load command used for filling a region of memory with pattern. + + Example: + section(0) { + // pattern fill + load 0x55.b > 0x2000..0x3000; + // load two bytes at an address + load 0x1122.h > 0xf00; + } + :param cmd_args: dictionary holding address and pattern :return: CmdFill object """ @@ -83,6 +93,26 @@ def _fill_memory(cmd_args: dict) -> CmdFill: def _load(cmd_args: dict) -> Union[CmdLoad, CmdProg]: """Returns a CmdLoad object initialized based on cmd_args. + The load statement is used to store data into the memory. + The load command is also used to write to the flash memory. + When loading to the flash memory, the region being loaded to must be erased before to the load operation. + The most common form of a load statement is loading a source file by name. + + Example: + section (0) { + // load an entire binary file to an address + load myBinFile > 0x70000000; + // load an eight byte blob + load {{ ff 2e 90 07 77 5f 1d 20 }} > 0xa0000000; + // 4 byte load IFR statement + load ifr 0x1234567 > 0x30; + // Program fuse statement + load fuse {{00 00 00 01}} > 0x01000188; + // load to sdcard + load sdcard {{aa bb cc dd}} > 0x08000188; + load @288 {{aa bb cc dd}} > 0x08000188; + } + :param cmd_args: dictionary holding path to file or values and address :raises SPSDKError: If dict doesn't contain 'file' or 'values' key :return: CmdLoad object @@ -162,6 +192,26 @@ def _prog(cmd_args: dict, mem_id: int) -> CmdProg: def _erase_cmd_handler(cmd_args: dict) -> CmdErase: """Returns a CmdErase object initialized based on cmd_args. + The erase statement inserts a bootloader command to erase the flash memory. + There are two forms of the erase statement. The simplest form (erase all) + creates a command that erases the available flash memory. + The actual effect of this command depends on the runtime settings + of the bootloader and whether + the bootloader resides in the flash, ROM, or RAM. + + Example: + section (0){ + // Erase all + erase all; + // Erase unsecure all + erase unsecure all; + // erase statements specifying memory ID and range + erase @8 all; + erase @288 0x8001000..0x80074A4; + erase sdcard 0x8001000..0x80074A4; + erase mmccard 0x8001000..0x80074A4; + } + :param cmd_args: dictionary holding path to address, length and flags :return: CmdErase object """ @@ -180,6 +230,16 @@ def _erase_cmd_handler(cmd_args: dict) -> CmdErase: def _enable(cmd_args: dict) -> CmdMemEnable: """Returns a CmdEnable object initialized based on cmd_args. + Enable statement is used for initialization of external memories + using a parameter block that was previously loaded to RAM. + + Example: + section (0){ + # Load quadspi config block bin file to RAM, use it to enable QSPI. + load myBinFile > 0x20001000; + enable qspi 0x20001000; + } + :param cmd_args: dictionary holding address, size and memory type :return: CmdEnable object """ @@ -253,7 +313,7 @@ def _keywrap(cmd_args: dict) -> CmdLoad: Keywrap holds keyblob ID to be encoded by a value stored in load command and stored to address defined in the load command. - e.g. + Example: keywrap (0) { load {{ 00000000 }} > 0x08000000; } @@ -296,6 +356,7 @@ def _keystore_to_nv(cmd_args: dict) -> CmdKeyStoreRestore: The keystore_to_nv statement instructs the bootloader to load the backed up keystore values back into keystore memory region on non-volatile memory. + Example: section (0) { keystore_to_nv @9 0x8000800; @@ -313,6 +374,7 @@ def _keystore_from_nv(cmd_args: dict) -> CmdKeyStoreBackup: The keystore_to_nv statement instructs the bootloader to load the backed up keystore values back into keystore memory region on non-volatile memory. + Example: section (0) { keystore_to_nv @9 0x8000800; @@ -330,9 +392,11 @@ def _version_check(cmd_args: dict) -> CmdVersionCheck: Validates version of secure or non-secure firmware. The command fails if version is < expected. + Example: section (0) { version_check sec 0x2; version_check nsec 2; + } :param cmd_args: dictionary holding the version type and fw version. :return: CmdKeyStoreRestore object. @@ -378,6 +442,7 @@ def _jump(cmd_args: dict) -> CmdJump: See the boot image format design document for specific details about these commands, such as the function prototypes they expect. + Example: section (0) { # jump to the entrypoint jump mySRecFile; diff --git a/spsdk/sbfile/sb2/sly_bd_parser.py b/spsdk/sbfile/sb2/sly_bd_parser.py index d49f8970..2585a6cc 100644 --- a/spsdk/sbfile/sb2/sly_bd_parser.py +++ b/spsdk/sbfile/sb2/sly_bd_parser.py @@ -283,8 +283,10 @@ def sources_block(self, token: YaccProduction) -> Dict: # type: ignore :param token: object holding the content defined in decorator. :return: dictionary holding the definition of sources """ - dictionary: Dict = {} - return dictionary + sources = {} + for source in self._lexer._sources: + sources[source.name] = source.value + return {"sources": sources} @_("source_def IDENT ASSIGN source_value SEMI") # type: ignore def source_def(self, token: YaccProduction) -> None: # type: ignore diff --git a/spsdk/utils/crypto/iee.py b/spsdk/utils/crypto/iee.py index 2dea887b..ef0cec37 100644 --- a/spsdk/utils/crypto/iee.py +++ b/spsdk/utils/crypto/iee.py @@ -17,7 +17,7 @@ from spsdk import SPSDKError from spsdk import version as spsdk_version -from spsdk.apps.utils.utils import get_key +from spsdk.apps.utils.utils import filepath_from_config, get_key from spsdk.exceptions import SPSDKValueError from spsdk.utils.crypto import ( IEE_DATA_FOLDER, @@ -726,13 +726,14 @@ def generate_config_template(family: str) -> Dict[str, Any]: @staticmethod def load_from_config( - config: Dict[str, Any], search_paths: Optional[List[str]] = None + config: Dict[str, Any], config_dir: str, search_paths: Optional[List[str]] = None ) -> "IeeNxp": """Converts the configuration option into an IEE image object. "config" content array of containers configurations. :param config: array of IEE configuration dictionaries. + :param config_dir: directory where the config is located :param search_paths: List of paths where to search for the file, defaults to None :return: initialized IEE object. """ @@ -771,7 +772,9 @@ def load_from_config( start_address, ) binaries = BinaryImage( - config.get("encrypted_name", "encrypted_blobs.bin"), + filepath_from_config( + config, "encrypted_name", "encrypted_blobs", config_dir, config["output_folder"] + ), offset=start_address - keyblob_address, alignment=IeeKeyBlob._ENCRYPTION_BLOCK_SIZE, ) diff --git a/spsdk/utils/crypto/otfad.py b/spsdk/utils/crypto/otfad.py index 3dfc7fba..d9dc9b71 100644 --- a/spsdk/utils/crypto/otfad.py +++ b/spsdk/utils/crypto/otfad.py @@ -18,7 +18,7 @@ from spsdk import SPSDKError from spsdk import version as spsdk_version -from spsdk.apps.utils.utils import get_key +from spsdk.apps.utils.utils import filepath_from_config, get_key from spsdk.exceptions import SPSDKValueError from spsdk.utils.database import Database from spsdk.utils.exceptions import SPSDKRegsErrorBitfieldNotFound @@ -801,13 +801,14 @@ def generate_config_template(family: str) -> Dict[str, Any]: @staticmethod def load_from_config( - config: Dict[str, Any], search_paths: Optional[List[str]] = None + config: Dict[str, Any], config_dir: str, search_paths: Optional[List[str]] = None ) -> "OtfadNxp": """Converts the configuration option into an OTFAD image object. "config" content array of containers configurations. :param config: array of OTFAD configuration dictionaries. + :param config_dir: directory where the config is located :param search_paths: List of paths where to search for the file, defaults to None :return: initialized OTFAD object. """ @@ -834,7 +835,9 @@ def load_from_config( min([value_to_int(addr["address"]) for addr in data_blobs]), start_address ) binaries = BinaryImage( - config.get("encrypted_name", "encrypted_blobs"), + filepath_from_config( + config, "encrypted_name", "encrypted_blobs", config_dir, config["output_folder"] + ), offset=start_address - table_address, ) for data_blob in data_blobs: diff --git a/spsdk/utils/images.py b/spsdk/utils/images.py index 56d0cf31..7d70e351 100644 --- a/spsdk/utils/images.py +++ b/spsdk/utils/images.py @@ -22,7 +22,6 @@ align_block, find_file, format_value, - load_binary, size_fmt, write_file, ) @@ -114,6 +113,16 @@ def __init__( assert isinstance(parent, BinaryImage) self.sub_images: List["BinaryImage"] = [] + @property + def size(self) -> int: + """Size property.""" + return self._size + + @size.setter + def size(self, value: int) -> None: + """Size property setter.""" + self._size = align(value, self.alignment) + def add_image(self, image: "BinaryImage") -> None: """Add new sub image information. @@ -156,7 +165,7 @@ def aligned_start(self, alignment: int = 4) -> int: """Returns aligned start address. :param alignment: The alignment value, defaults to 4. - :returns: Floor alignment address. + :return: Floor alignment address. """ return math.floor(self.absolute_address / alignment) * alignment @@ -164,7 +173,7 @@ def aligned_length(self, alignment: int = 4) -> int: """Returns aligned length for erasing purposes. :param alignment: The alignment value, defaults to 4. - :returns: Ceil alignment length. + :return: Ceil alignment length. """ end_address = self.absolute_address + len(self) aligned_end = math.ceil(end_address / alignment) * alignment diff --git a/spsdk/utils/registers.py b/spsdk/utils/registers.py index 93ebfd6a..e9df638b 100644 --- a/spsdk/utils/registers.py +++ b/spsdk/utils/registers.py @@ -353,7 +353,7 @@ def set_value(self, new_val: Any, raw: bool = False) -> None: def _update_reset_value(self) -> None: """Updates the reset value of the bitfield in register.""" - reg_val = self.parent.get_value() + reg_val = self.parent.get_reset_value() mask = ((1 << self.width) - 1) << self.offset reg_val = reg_val & ~mask value = (self.reset_value << self.offset) & mask @@ -802,8 +802,8 @@ def find_bitfield(self, name: str) -> RegsBitField: """Returns the instance of the bitfield by its name. :param name: The name of the bitfield. - :return: The bitfield instance. - :raises SPSDKRegsErrorBitfieldNotFound: The register doesn't exists. + :return: Instance of the bitfield. + :raises SPSDKRegsErrorBitfieldNotFound: The bitfield doesn't exist. """ for bitfield in self._bitfields: if name == bitfield.name: @@ -856,8 +856,8 @@ def find_reg(self, name: str, include_group_regs: bool = False) -> RegsRegister: :param name: The name of the register. :param include_group_regs: The algorithm will check also group registers. - :return: The register instance. - :raises SPSDKRegsErrorRegisterNotFound: The register doesn't exists. + :return: Instance of the register. + :raises SPSDKRegsErrorRegisterNotFound: The register doesn't exist. """ for reg in self._registers: if name == reg.name: @@ -1178,7 +1178,6 @@ def load_yml_config( except SPSDKRegsErrorBitfieldNotFound: logger.error( f"The {bitfield_name} is not found in register {register.name}." - " Please update the PFR configuration data" ) continue if ( diff --git a/tests/elftosb/test_bd_compiler.py b/tests/elftosb/test_bd_compiler.py index ab135399..28721082 100644 --- a/tests/elftosb/test_bd_compiler.py +++ b/tests/elftosb/test_bd_compiler.py @@ -117,6 +117,11 @@ def test_parser(): "componentVersion": "1.00.00", "secureBinaryVersion": "2.1", }, + "sources": { + "myImage": "data/sb_sources/output_images/application_signed.bin", + "key_store": "data/sb_sources/key_store/key_store_rt5xx.bin", + "fcb_block": "data/sb_sources/input_images/rt500_oct_flash_fcb.bin", + }, "keyblobs": [ { "keyblob_id": 0, diff --git a/tests/image/segments/test_xmcd.py b/tests/image/segments/test_xmcd.py index 483b1856..bd651091 100644 --- a/tests/image/segments/test_xmcd.py +++ b/tests/image/segments/test_xmcd.py @@ -5,6 +5,9 @@ # # SPDX-License-Identifier: BSD-3-Clause +import pytest + +from spsdk.exceptions import SPSDKValueError from spsdk.image.images import BootImgRT from spsdk.image.segments import XMCDHeader @@ -36,3 +39,10 @@ def test_xmcd_header(): assert xmcd.version == 0 exported = xmcd.export() assert exported == data + + +def test_xmcd_header_invalid(): + with pytest.raises(SPSDKValueError): + XMCDHeader(interface=2) + with pytest.raises(SPSDKValueError): + XMCDHeader(block_type=2) diff --git a/tests/mboot/test_properties.py b/tests/mboot/test_properties.py index c7436757..b9c9d9d0 100644 --- a/tests/mboot/test_properties.py +++ b/tests/mboot/test_properties.py @@ -205,3 +205,7 @@ def test_fuse_locked_status(): assert "FUSE000: UNLOCKED" in value.to_str() assert "FUSE084: LOCKED" in value.to_str() assert "FUSE143: UNLOCKED" in value.to_str() + + fuses = value.get_fuses() + assert not fuses[0].locked + assert fuses[84].locked diff --git a/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/config.bd b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/config.bd new file mode 100644 index 00000000..bc12d36a --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/config.bd @@ -0,0 +1,86 @@ +options { + flags = 0x08; + startAddress = 0x60000000; + ivtOffset = 0x1000; + initialLoadSize = 0x2000; + entryPointAddress = 0x60003411; + signatureTimestamp = "04/05/2023 14:41:11"; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="DCP", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=1 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF2_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG2_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="DCP", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_SET_ENGINE; + SetEngine_HashAlgorithm = "sha256", + SetEngine_Engine = "DCP", + SetEngine_EngineConfiguration = "0") +{ +} + +section (SEC_UNLOCK; + Unlock_Engine = "SNVS", + Unlock_Features = "ZMK WRITE" + ) +{ +} \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/CSF2_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/CSF2_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..65df74fa --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/CSF2_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419900 (0x1234567c) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK2_sha256_2048_65537_v3_ca + Validity + Not Before: Aug 8 05:36:06 2019 GMT + Not After : Aug 7 05:36:06 2022 GMT + Subject: CN=CSF2_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c0:e7:70:30:49:39:3e:4d:c4:f5:fb:3a:f8:0c: + 1d:ce:85:34:9b:8a:90:b2:35:e5:c0:56:e3:72:6f: + a5:cf:71:8b:af:0f:1c:52:bd:e8:4e:f4:e3:61:63: + 38:ec:fa:60:57:e4:6e:15:1d:20:8a:cc:85:ab:fd: + 98:5d:f8:28:b6:bc:43:b5:70:38:3b:3a:9d:a7:1b: + e0:fe:0d:70:44:e9:e4:05:5d:0b:26:45:30:a0:3e: + e0:f1:56:ae:39:b4:96:ad:9b:90:71:e4:6d:4a:8c: + 59:43:bc:ce:bd:41:4f:6e:0b:d2:76:d9:aa:a2:00: + 90:e2:50:a9:66:29:fe:67:a8:4f:d0:b7:b6:bb:90: + c2:9d:9e:2b:78:05:ab:02:d0:0a:44:89:6d:87:23: + f8:31:af:f4:b9:ca:ca:df:a3:53:99:3f:37:f9:b7: + 9b:42:03:2c:87:ff:7b:2f:ec:c0:84:bc:f2:0c:55: + 2b:e0:72:18:5c:8d:1a:12:f1:cb:cb:24:76:5f:60: + e7:db:a8:1e:03:01:35:d1:5f:0a:86:25:88:f2:51: + c8:68:a1:e2:4f:ca:70:50:78:33:fd:37:62:8b:1d: + 5e:37:eb:a0:d6:d8:7d:01:90:72:2e:3e:40:62:38: + b7:1f:57:dc:1c:50:8a:e9:6d:dc:cd:01:ea:a8:b5: + 67:5b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 22:DA:85:A5:D7:52:14:AF:69:1B:E0:B8:14:33:C0:3B:FD:62:B6:E2 + X509v3 Authority Key Identifier: + keyid:8F:7C:C1:5B:0B:CC:91:31:A1:3B:F5:44:01:35:97:3D:50:95:4D:88 + + Signature Algorithm: sha256WithRSAEncryption + 3d:f3:c4:12:86:df:50:e3:b8:04:ca:25:ce:78:88:c9:f8:f5: + 15:0f:7a:21:31:42:a7:24:ab:fd:23:5d:44:23:e1:9b:62:74: + 95:8e:69:71:61:5b:64:3f:16:8d:d9:d9:29:ac:bf:eb:a9:89: + 71:45:58:05:b7:7a:2e:03:b1:13:dd:23:c3:45:a5:69:9b:3b: + 75:2a:12:ea:d4:63:0c:7b:8d:36:d1:ed:fc:0f:b0:c9:94:0c: + 07:0a:38:74:01:5a:02:a7:0b:52:0a:cd:e4:52:f9:3f:f4:7b: + 71:77:e9:4d:c0:33:23:77:b8:ac:86:aa:2d:c3:47:1b:83:30: + 53:b9:3c:1b:37:7d:52:1d:e8:6a:24:18:ff:b0:22:79:e5:ae: + d3:e4:48:2c:fa:6b:ef:31:b1:a2:2a:23:d4:2f:b5:57:e6:26: + 95:4f:28:d9:31:4c:d7:0c:8b:05:d1:9e:2f:fe:fa:2f:98:d8: + 2d:cd:5c:55:fd:09:c4:45:56:d3:9e:3b:8a:c3:3f:f1:31:46: + cd:bd:b3:7c:af:aa:37:1b:7f:4b:5e:50:c9:7d:fb:af:a0:b3: + f0:b7:4d:96:1b:ce:3e:e8:bc:c4:f6:bf:e6:63:91:fc:59:b8: + 16:cb:0a:16:6f:e1:f9:0a:9d:20:bd:97:1b:26:97:d7:6e:f9: + 06:e0:02:35 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWfDANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksyX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTE5MDgwODA1MzYwNloXDTIy +MDgwNzA1MzYwNlowKjEoMCYGA1UEAxQfQ1NGMl8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMDncDBJOT5N +xPX7OvgMHc6FNJuKkLI15cBW43Jvpc9xi68PHFK96E7042FjOOz6YFfkbhUdIIrM +hav9mF34KLa8Q7VwODs6nacb4P4NcETp5AVdCyZFMKA+4PFWrjm0lq2bkHHkbUqM +WUO8zr1BT24L0nbZqqIAkOJQqWYp/meoT9C3truQwp2eK3gFqwLQCkSJbYcj+DGv +9LnKyt+jU5k/N/m3m0IDLIf/ey/swIS88gxVK+ByGFyNGhLxy8skdl9g59uoHgMB +NdFfCoYliPJRyGih4k/KcFB4M/03YosdXjfroNbYfQGQci4+QGI4tx9X3BxQiult +3M0B6qi1Z1sCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFCLahaXXUhSvaRvg +uBQzwDv9YrbiMB8GA1UdIwQYMBaAFI98wVsLzJExoTv1RAE1lz1QlU2IMA0GCSqG +SIb3DQEBCwUAA4IBAQA988QSht9Q47gEyiXOeIjJ+PUVD3ohMUKnJKv9I11EI+Gb +YnSVjmlxYVtkPxaN2dkprL/rqYlxRVgFt3ouA7ET3SPDRaVpmzt1KhLq1GMMe402 +0e38D7DJlAwHCjh0AVoCpwtSCs3kUvk/9Htxd+lNwDMjd7ishqotw0cbgzBTuTwb +N31SHehqJBj/sCJ55a7T5Egs+mvvMbGiKiPUL7VX5iaVTyjZMUzXDIsF0Z4v/vov +mNgtzVxV/QnERVbTnjuKwz/xMUbNvbN8r6o3G39LXlDJffuvoLPwt02WG84+6LzE +9r/mY5H8WbgWywoWb+H5Cp0gvZcbJpfXbvkG4AI1 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/IMG2_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/IMG2_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..67d79423 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/crts/IMG2_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419901 (0x1234567d) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK2_sha256_2048_65537_v3_ca + Validity + Not Before: Aug 8 05:36:06 2019 GMT + Not After : Aug 7 05:36:06 2022 GMT + Subject: CN=IMG2_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:bb:8a:d1:e8:dd:62:da:9e:9f:7b:39:88:23:9d: + 8e:53:cc:98:6b:7f:f9:68:5e:7c:a8:e9:da:63:f4: + 04:13:ed:b3:8a:1f:83:6e:d9:cf:81:bb:78:c1:76: + a8:64:42:07:9f:56:5e:5a:f0:8b:7e:99:c4:1d:5d: + 5e:7b:f6:bc:df:85:b6:8b:c3:13:00:80:64:a3:e9: + db:dc:5a:36:59:da:f0:d3:f5:fe:03:63:9d:a3:c6: + 1f:8e:d0:03:5b:b7:12:04:ed:85:41:f6:4b:3c:42: + d2:66:80:43:5c:fa:43:81:9d:a3:c9:6c:9c:42:60: + b4:04:ca:9e:d0:16:d8:08:e2:8b:72:fb:00:20:6d: + 9a:8f:dc:25:7f:9c:28:34:dd:36:71:55:2f:ff:f2: + 19:81:1f:de:27:8a:6d:08:5e:ab:d1:20:17:40:ee: + 44:42:b9:6e:1e:81:fa:66:78:db:d7:83:f5:1d:85: + 85:be:f0:6f:08:40:00:fa:99:8e:95:74:75:8b:7b: + 9e:e4:72:c0:6e:53:9b:4b:da:60:fd:4b:fc:86:e1: + 0d:8f:26:d4:14:01:17:c3:86:a2:b1:9f:0b:c8:18: + ce:01:68:8e:ab:c7:80:1a:e8:7e:24:89:4e:8d:d8: + 62:3b:d9:77:c5:ba:b3:a5:4c:ed:f9:88:08:45:dd: + c8:d3 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 3C:35:A4:6F:51:D1:1F:49:C9:E5:F7:49:FA:D4:09:02:F3:CB:65:51 + X509v3 Authority Key Identifier: + keyid:8F:7C:C1:5B:0B:CC:91:31:A1:3B:F5:44:01:35:97:3D:50:95:4D:88 + + Signature Algorithm: sha256WithRSAEncryption + 1f:9b:bc:3e:21:bb:6d:41:fc:27:c8:24:92:bf:6b:25:d6:7b: + e9:70:ed:5c:39:cc:69:be:05:15:b7:80:ab:1e:ae:28:f1:47: + 70:11:13:66:d1:7c:71:82:40:9b:e3:c4:eb:b2:1b:be:cf:b5: + 34:37:88:c8:17:4f:72:43:8c:61:6a:aa:79:65:8e:ef:5a:d6: + e8:31:05:1b:c6:59:25:7d:98:cc:dc:6f:1a:dc:97:23:61:e5: + ed:6e:63:cf:ee:68:09:ff:29:05:53:f7:a9:33:38:0b:16:34: + 0e:86:e1:7f:8a:52:cd:d7:fb:6c:7e:f0:58:ce:5a:04:63:66: + e1:67:42:ef:81:37:6b:9d:57:b4:5a:72:b6:e6:12:c8:54:77: + ee:c2:7e:80:a4:42:66:a0:13:9c:21:76:23:2d:8f:15:d9:65: + c1:17:58:66:a4:8b:f6:a6:5b:e1:2d:31:17:18:8f:ff:20:8b: + c3:85:b4:15:01:b9:92:92:cb:a2:8e:5e:5d:51:3b:54:97:eb: + 2f:e6:71:33:45:77:0a:db:56:31:f9:75:ef:10:56:7b:87:22: + 7f:d5:14:b9:c9:af:a2:af:0f:81:07:c9:92:4e:09:c7:94:44: + 66:4e:8f:4f:43:a7:9a:c4:85:ae:fc:b3:5f:1b:67:1f:da:a9: + 06:18:45:34 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWfTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksyX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTE5MDgwODA1MzYwNloXDTIy +MDgwNzA1MzYwNlowKjEoMCYGA1UEAxQfSU1HMl8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALuK0ejdYtqe +n3s5iCOdjlPMmGt/+WhefKjp2mP0BBPts4ofg27Zz4G7eMF2qGRCB59WXlrwi36Z +xB1dXnv2vN+FtovDEwCAZKPp29xaNlna8NP1/gNjnaPGH47QA1u3EgTthUH2SzxC +0maAQ1z6Q4Gdo8lsnEJgtATKntAW2Ajii3L7ACBtmo/cJX+cKDTdNnFVL//yGYEf +3ieKbQheq9EgF0DuREK5bh6B+mZ429eD9R2Fhb7wbwhAAPqZjpV0dYt7nuRywG5T +m0vaYP1L/IbhDY8m1BQBF8OGorGfC8gYzgFojqvHgBrofiSJTo3YYjvZd8W6s6VM +7fmICEXdyNMCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDw1pG9R0R9JyeX3 +SfrUCQLzy2VRMB8GA1UdIwQYMBaAFI98wVsLzJExoTv1RAE1lz1QlU2IMA0GCSqG +SIb3DQEBCwUAA4IBAQAfm7w+IbttQfwnyCSSv2sl1nvpcO1cOcxpvgUVt4CrHq4o +8UdwERNm0XxxgkCb48Trshu+z7U0N4jIF09yQ4xhaqp5ZY7vWtboMQUbxlklfZjM +3G8a3JcjYeXtbmPP7mgJ/ykFU/epMzgLFjQOhuF/ilLN1/tsfvBYzloEY2bhZ0Lv +gTdrnVe0WnK25hLIVHfuwn6ApEJmoBOcIXYjLY8V2WXBF1hmpIv2plvhLTEXGI// +IIvDhbQVAbmSksuijl5dUTtUl+sv5nEzRXcK21Yx+XXvEFZ7hyJ/1RS5ya+irw+B +B8mSTgnHlERmTo9PQ6eaxIWu/LNfG2cf2qkGGEU0 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/gen_hab_certs/SRK_hash.bin b/tests/nxpimage/data/hab/export/rt1050_xip_image_iar_authenticated/gen_hab_certs/SRK_hash.bin new file mode 100644 index 0000000000000000000000000000000000000000..a144262d4d2b071337de397d274e766b10a4cb34 GIT binary patch literal 546 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 G0RRDuHVHTY literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/nonce.bin b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/nonce.bin new file mode 100644 index 00000000..e9d8d5c8 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/nonce.bin @@ -0,0 +1 @@ +�/=�3�]��b \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/validationboard_imxrt1160_iled_blinky_cm7_int_RAM_hab_dek.bin b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/validationboard_imxrt1160_iled_blinky_cm7_int_RAM_hab_dek.bin new file mode 100644 index 00000000..d6425f65 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/gen_hab_encrypt/validationboard_imxrt1160_iled_blinky_cm7_int_RAM_hab_dek.bin @@ -0,0 +1 @@ +���}��F��a��^��/��$k�%/-E,K��� \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..09113349 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIrJaQIDGB3+gCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECNJmIIWKafgGBIIEyCxp6ox0Wmul +J5jBd4yB83LMDwRLNRayqUhCr/JkQpFEmWdvj8mioPoROeeW2vp4YAZaS6VAWqyB +hP7BlHqdkHbDkWgdHb+ClgQaJhyF95+KxTGQQDFqmhvEpUQw5vwS7bmO5fZYWHJt +hUQ9d4fcWxsuY2PFD/HY/i2cAgrdxFHT7LfN+QKIfleXbBDxtJo1bKY3HSFyCeKw +j8diQRaU7cxPMwAuev5xEP9E0XTJQwI3ZK4noRn2K4MTQOExhmHzBi0qG406Cvg2 +5SdCVvFe3TH2qnvW5JAcwQeiXmSpVRLH2Gfo/pophlzCJhYYa8kPjzvvR8pYlnOi +kpA5VgDB9VNtUe8lAUO/V8dnHUB+Ve+ZjJyy6HzQYruunZQo8YqDvyVM3hE/kXZj +aH7dyKGIPZzP95QPUi1AMdSw8/yL98pWjtf4gogvejJ+1t1oDoelZguYcsmJwc53 +yQvBdSnOg9X5VeD8vgyLE4GQg5qNbS8lQLvyZPkWekwzFoMGqr5mrAEPw2zcPvXR +rP8DiN3aUZ5LuaxL8I65O93hMIC7sE2J5n1ZGePIVDOX9X+V+UDOwCPs6tG0P787 +itdVSp4HfYHZsjZY4srJcQdsSkQ6EFJ1VuEkFwdl5r1dnms9PUZ0TUMzJcvdRxjQ +GXBKLdsq3w2B9s1p+WV7wXAxxruIFRAYwfeU4cT5rFBHrrPJfCpi/siq9SFfHvRB +nsQIAf/KSAAP3IfaDM24xsD9E7MuLd/12xpKMVTa2PKJYso279hYCs8Ugyfuoa96 +MasTewS3NjRbe5K0E/Y/f0QR4Rql7RMQmbEI0j9kkbkyaIblEnx+hJdh9FydSa14 +g0+rb2UMbMZFNHEzBqepvq6lAJYbfDCC4aSi7NAGe6N2edEUkZJgMUsl3p/fJdbT +ZybKJS+Fn73skLrp0aADxgBFrbbOw7ZHEzrHfdGAnVX8cpoHIckxOLZQCUmjLLLo ++9Jfu2ibNeVoc4u0A1vTMBQ7Zz6/Sb52SAyF2hv0pKlU458013GU0+bv420zizHq +gXz919KHBSRJg7UjfqlnD/Oq5PPd25LfecMn8w0/05pg0a0NiTzeXPgTWW6dcn80 +JYXMI7jgNRkdyMceIGBziljSckZqQb/nRnZafqkFbGuX/VI/wPtBVT0Fe29pyRZ1 +isl3oWQU60qwkO79jXtKLrfwhNPQT8yx2oCvHuGAciYb9TIJUwTMrYHJLHxxvSWk +x6ykG3MGF9WDk74vF6GEMZxr55VMoGF25cp5OwffOiuCSH3cQ6hWKpFtRTQ0/XVk ++toUjDQU288BcbHCT3OucBt1j3TFxeW7HAuFWPIZrL3b2YA21HT0LoMAItuciuC0 +W20iETMpxGN+UzhRjievitB+n0Zr+ShNfby3lTCXpvGt7IAiZLBHhkcQCumZdn90 +rjadorXeGpL8EOKMm+NzwxBRzM/lyyE77CGUZe+FpbSvJDAl3ycC9X2D1DQ2B0Ib +zGU1FFD+Ap6BafrsMig+fHOmsG25K+geLLPZ9QjGPx5ggPWfk2SUexLEfHKBblFn +YfzeRWpwrGIizhC7+XaftvSNA1LFajogKnqXumVuuPR4d2AfmO3dFVRnl+nFZJ5a +ZNtNUz5u+DcJAbL7/VulNg== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..6ff9ede6 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIovg1hOt73SECAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECB/Qad0wNnaXBIIEyLFrlLLj0/wF +M/2HCczyhkyw50CwGikShqSRz36NIFqBP16lBBEwddlZ2JRVYmprTwBBvN7z9sk2 +2zNxAaDaV6YzGxqDOEDp6YYg8va59CrhgOqQwkprG31FgOhrpIy0bBmsWjXknV38 +jDDLJAzcXdxgoWdDXTOdAALoIlWEUSUCPPIg3+rAmh0OQ6FKmVDfpiV/uplcSGCg +lCwg3aPdrRTW4uiyYeYxz2oGQ4te3k7JDXIoQ+QylygqOtBeKmDuvU7XBY4tg4zP +72JLFjBnkiRXouXMKM5Zq/loaCquH9SMpikhEjB4YIfOK9HhNHApDOrUIuqAwPWQ +Em28YYBkZ5iibGvuEg8WOT7qA/qOwJ5hRI9ExMa5NcxrDSWlt48wxi/2rmNbNd7M +zBTwZxrx8Sg0K/MvHiO/MBZw4yrSN5ULbRsyfdmjautHNlKr2tEorxaZ7/gpAVta +gU0bljI/UV9j9JUWf3Rku4VT1svtcStt/M0HhHpPhCr3LTYL6+3jN2EtZpFhSeHH +4csHhb66eW1vZec7SJ6HhL/PDGbbEmG2pZgdJ6bKcRxTonGR6uaqFYSz/BlrxwOf +B6vw8cBKScgenMmDUESXaS/6sIBKOIwftEF74GDyRgCaYNnzAwm2cYiJeDPVT4k2 +14q6oDrKijvAsAN6mEbIeURkRT2g865Bbh6hbzCi0NamiLUbVHqPNIRRFQLEZWHK +ZvIbwiDAce/6azpmHvnPh0k8N09HTkaieeAirR5Eg2fiYZ2au2rU2Fcrv265TNFB +1qW1L4arwZABCaVGf+HlWHpTCk+Q8n5sBQJ6R8HXTq5dkZYTgT4V7ch2gH4i1gIk +nT29Nkamd664x9E6v3STQeEwOP5Ks3jPbDr+qavfec83ih91Uk/cyxxc72HOwZuy +kJggXUwB+NeRiDx6vMfRymrJR+3YOLAI5xlVf/kzbfxB50My6dNOzZ4ibHY/hjHe +HXUpGJ4XOJBRWTz2G04y9l/KGrjkFUc8nyKtbrxLD5zMSr9a/WlrOKBGjHQxx20w +3NOyyAvkVLgNhBGxnItramsonZyAQr7EKBjIyyc4vs1+ZP2nmL7IBobUNiq1gvJO +AXvyTrR2ScqP7YgXIyV4IOp2HDRQdRCHXzHP1+aVxBhvVavLgcTNSxaatsGHkarU +Gv+aGsyZEaOynPvnQpCVPOPk/dMYUyPzdgXzpiIzKoBkXMiTWQ3qetKKLeK28AON +bkXWPKvugSQmKMw/3E8Q5XmnAllldlcyaPjHFDKEnfJwAHy/D/yep/dL4uhz04cj +KizNEiMuiNIzN5mwFPBJFOgHS9TZUpJw+frseLOb/BqTjgdiTN5MJ084tJbmmpa6 +ZS16xLHwmT6zohrMA6NODSF60YottzAk4qjVA4KtjJD6H/3HMKs5pkVd0OlxbDLz +3TDKmpdLGo28OHrh62XTmnqW/ifm2twAPCtgMFNTRpBtEAbDn5AXEENLTIhXxdmD +vwDAarcYMg8pdDnAh2XP6suQxKOon+DpRLCo7lber1cFVQkiqS+wiOOsGpU0TieN +GcWNQ//e+deaCBm/y0iRyB+pIir8U1PW6zfrgD/aTUDIpaFd4ox7rycay27ET1gz +PKPOGnNs0eBz4T+fTFxOzQ== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/key_pass.txt b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/key_pass.txt new file mode 100644 index 00000000..be878540 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/keys/key_pass.txt @@ -0,0 +1,2 @@ +SWTestTeam +SWTestTeam \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/output.bin b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/output.bin new file mode 100644 index 0000000000000000000000000000000000000000..3291d9777ca6b091b49e749e19465794104ebfe0 GIT binary patch literal 32768 zcmeF%L$5Gg6DI0y+qP|6&$eybwr$(CZQHhO8|UjY=>O2kTgkmrlQp?URY@%X5D0Xz z0Q}z~AoySVf8zhY{GUSjUlRZS?!V_hf&T>l6ZlWyKY{-Q{uB65;6H)?1pX8FPvAd+ z{{;RY6|kkU;MB~Fx(M<^zyZW6n0Ud*w$OyD6xeGH@4S@DwijsZumo)NIx<}MAqTXR zPN4(FOJM)1p?J%AlqncvaaXjwMRY%+#yG~FLBwRF9Mzeqwm56LN=rBxXLDmgD4o}b zRStBM!G2-`d@gpCHLIkW{PgjdxZ!l8adDby!X6R-M}SV7lAypD5^T!1KkDen(o4^xMfMB6nNod~{l zSsc#K!4hs-om^?$UZ)0v7uFb(*-j%alp%?7aDguA(3gDW8H+h^;Fr16KMy4$jDEsl z^JQZa3Ed$ritAVEAm0>Um>6(+TDnOCcNF=6y0U*xOmWSufEx*cMZP`Dy?O0VS*=w! zO=Ty-oTB%|q`ROjrwU(c3OYaZkMcWxg%`4`-n&5{{7vY^{Ebm(gcgq9vO0{Jk1qD0 zQAiQMQPhjcwg4HhOnkyeu6+!~{SvX}*km-d>nqgPz@wbxA6Yq~i4|T#Q@GuC z(_hT-08O|Aw7F@Cd`U)|*T}Q=!O7f z$RrO!#qJ86Dq2v1(b~F31+y%RAH!I$9HdH%EAX{9zJ?y-LS;V8EHHF#w9matv$sKo zP{|#93tsuvR}y93a>RO*pVL2`n+%c{B5z6F=b6UakWU$jT5JCs+p&li^xL%r)w#

>8>wsUR@7)GcnjnhdSdW3YEpO`vqV|g$}-de2mc0V6MH@ zwBj2o?|Pnpx+3bNgsPGglWi_LpT=+rU^_jQOjwir=L*q!PU}T0p-Q^~3IfxCx-c$N zUSVJ0>g`(CJ7@ev0|Uv3eUJWxl2xz3*Z)#C?O*qxWe`5a5ztJUZqxw<)aJhI!WeLc zb;U){dfdiTa|Z|p%M{J&a{^V;2mIUf#QLyALt&*=1UiVZBd>ipPbnCf z1%|^nh%XNVN;V3EWr5z8T!%S@fhs{n@T?pR=Ss)j5Z^9<#zn|pv7N02O(_|^7El%U zOEHaip!pcSy%Oiym%FC9pJBqghBYf-2q$?vjM z+6h;YFZ4-fme+?_gl2k4eSjFXks`_rZ*Y&o~wf(aNmX4!e*v;Q2<+ryKV8@dvoJWEYAkk9zBp2uE|k|A&`X zy_5`hfB$U65-tvK9}+^e^lS73Ql!U%Q4C8*9n*yovJ(2d84&NP`YwdgZ|qZy47h+b z4&p8cgK#{pna&$V(ZS^qri5?3#n+k1X2qe!Ctvy3Cqd<-uB#*gQOuj5jZFjDWrLA9 zuUqMh2$OuCpAg+K5b=X`J3dSV4c3W5(jRI5%ZE?2*PQXW6;T)@udZE3YHo)2u7ou8 z{$~*-03-r3UDpgzjT4QJ*{Hv;*Y7xEq1{GRMHJ5lC!-}3xGl#UZ zxc6`HV0PcS$HFs)WwGdsbFLW(ohiIh2q&B4FW9Pi^GIbcjh_E_dZL#OGd?7@EH*G$ z9Ejla^R3uhF5~I}u08*c#Yn&o_Ag<_m#)}6=r(ctBIXL&e`aOK%4`<+*F`63u{q*T z?1uzeHU1iXlUC~O<_B*u>scG_*R{>d3xHa*eg&pOMtu7 zTisooJKf$``(~D9SCfGbZPe=uAQx+sTn)1KSj{64l5yDZ0mU9W?gR=f7X!Y;T`qENcDsCqZmCoJCh~hU|n0ADiXeS;h;~Oᰚh+iQiDRpF-FLwx;Wcoh(E2X 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 BARYh! literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/validationboard_imxrt1160_iled_blinky_cm7_int_RAM.s19 b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/validationboard_imxrt1160_iled_blinky_cm7_int_RAM.s19 new file mode 100644 index 00000000..5bd87885 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1160_RAM_encrypted/validationboard_imxrt1160_iled_blinky_cm7_int_RAM.s19 @@ -0,0 +1,1221 @@ +S02B000065766B6D696D787274313136305F696C65645F626C696E6B795F636D375F696E745F52414D5F4556F7 +S113300000000400B934000011350000B76300006B +S113301015350000173500001935000000000000C8 +S11330200000000000000000000000001B3500004C +S11330301D350000000000001F3500003937000076 +S1133040CF5C0000D75C0000DF5C0000E75C0000A0 +S1133050EF5C0000F75C0000FF5C0000075D00000F +S11330600F5D0000175D00001F5D0000275D00007C +S11330702F5D0000375D00003F5D0000475D0000EC +S11330804F5D0000575D00005F5D0000675D00005C +S11330906F5D0000775D00007F5D0000875D0000CC +S11330A08F5D0000975D00009F5D0000A75D00003C +S11330B0AF5D0000B75D0000BF5D0000C75D0000AC +S11330C0CF5D0000D75D0000DF5D0000E75D00001C +S11330D0EF5D0000F75D0000FF5D0000075E00008B +S11330E00F5E0000175E00001F5E0000275E0000F8 +S11330F02F5E0000375E00003F5E0000475E000068 +S11331004F5E0000575E00005F5E0000675E0000D7 +S11331106F5E0000775E00007F5E0000875E000047 +S11331208F5E0000975E00009F5E0000A75E0000B7 +S1133130AF5E0000B75E0000BF5E0000C75E000027 +S1133140CF5E0000D75E0000DF5E0000E75E000097 +S1133150EF5E0000F75E0000FF5E0000075F000006 +S11331600F5F0000175F00001F5F0000275F000073 +S11331702F5F0000375F00003F5F0000475F0000E3 +S11331804F5F0000575F00005F5F0000675F000053 +S11331906F5F0000775F00007F5F0000875F0000C3 +S11331A08F5F0000975F00009F5F0000A75F000033 +S11331B0AF5F0000B75F0000BF5F0000C75F0000A3 +S11331C0CF5F0000D75F0000DF5F0000E75F000013 +S11331D0EF5F0000F75F0000FF5F00000760000082 +S11331E00F600000176000001F60000027600000EF +S11331F02F600000376000003F600000476000005F +S11332004F600000576000005F60000067600000CE +S11332106F600000776000007F600000876000003E +S11332208F600000976000009F600000A7600000AE +S1133230AF600000B7600000BF600000C76000001E +S1133240CF600000D7600000DF600000E76000008E +S1133250EF600000F7600000FF60000007610000FD +S11332600F610000176100001F610000276100006A +S11332702F610000376100003F61000047610000DA +S11332804F610000576100005F610000676100004A +S11332906F610000776100007F61000087610000BA +S11332A08F610000976100009F610000A76100002A +S11332B0AF610000B7610000BF610000C76100009A +S11332C0CF610000D7610000DF610000E76100000A +S11332D0EF610000F7610000FF6100000762000079 +S11332E00F620000176200001F62000027620000E6 +S11332F02F620000376200003F6200004762000056 +S11333004F620000576200005F62000067620000C5 +S11333106F620000776200007F6200008762000035 +S11333208F620000976200009F620000A7620000A5 +S1133330AF620000B7620000BF620000C762000015 +S1133340CF620000D7620000DF620000E762000085 +S1133350EF620000F7620000FF62000007630000F4 +S11333600F630000176300001F6300002763000061 +S11333702F630000376300003F63000047630000D1 +S11333804F630000576300005F6300006763000041 +S11333906F630000776300007F63000087630000B1 +S11333A0147C0000147C000004000000147C000065 +S11333B00000002000000000147C00000000242015 +S11333C000000000147C000000002C20000000001D +S11333D0147C000000802C2000000000147C0000FD +S11333E00000008000000000187C00001C010000A8 +S11333F00000002000000000000024200000000065 +S113340000002C200000000000802C2000000000A0 +S1133410000000800000000010B40B464FF0000CC8 +S113342005E050F8044B43F8044B0CF1040C9445AC +S1133430F7D30D4B5B6913F4803F11D0002A0FDDE5 +S113344001F01F031A44BFF34F8F074BC3F86812F0 +S11334502031203A002AF8DCBFF34F8FBFF36F8F7F +S11334605DF8044B704700BF00ED00E010B4034664 +S1133470002203E0002443F8044B04328A42F9D3C7 +S11334800C4B5B6913F4803F11D000290FDD00F071 +S11334901F031944BFF34F8F064BC3F86802203053 +S11334A020390029F8DCBFF34F8FBFF36F8F5DF82D +S11334B0044B704700ED00E010B572B6104B83F377 +S11334C0088801F057FB0F4B07E003F10C049A68DE +S11334D059681868FFF7A0FF23460B4A9342F4D3B8 +S11334E006E01C46596854F8080BFFF7BFFF234653 +S11334F0064A9342F5D362B603F06FF9FEE700BFC4 +S113350000000400A0330000E83300001834000079 +S1133510FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE77F +S1133520FEE7FEE7FFFFFFFF70B52DED028B031FE3 +S1133530DBB2012B35D8042836D0032500212846D8 +S113354002F056FFC0F3426600F07F0430212846A3 +S113355002F04EFF08EE100AB8EE488B20212846F0 +S113356002F046FF06EE100AB8EE466B07EE904AEC +S1133570B8EE677B86EE085B37EE057B9FED0C6B40 +S113358027EE067B0123B34006EE903AB8EE666B55 +S113359087EE065BFCEEC57B17EE900ABDEC028B52 +S11335A070BD054800F00AF80225C7E7AFF30080B4 +S11335B00000000060E376418870000008B5014611 +S11335C0024800F06DF800BEFDE700BF186C000073 +S11335D010B50C460028FDD0002CFDD0074B1B680D +S11335E03BB122460146064803F083F818B9204649 +S11335F010BD0020FCE74FF0FF30F9E7387C0000F5 +S1133600307C000010B588B00093019100238DF840 +S113361008308DF8093001218DF80A108DF80B104F +S11336208DF80C308DF80D308DF80E008DF81820C3 +S113363048F64173ADF81A308A4203D043F2215060 +S113364008B010BDCDF81CD0104C2022002120461B +S113365003F0CAF8201D206004A902F0FFFF00282F +S1133660FDD10B4B1B780B4951F8180C03F00FF8E4 +S11336700028FDD1084951F81C0C03F01EF800285D +S1133680FDD1024B1A68054B1A60D9E7187C00007B +S1133690307D0000307C0000347C0000387C000069 +S11336A00FB400B5A3B0002101917C2202A803F05D +S11336B09BF80A4B1B687BB125A92191084B01AAF1 +S11336C0249802F039FA014601A8FFF781FF23B0DC +S11336D05DF804EB04B070470020F8E7387C000084 +S11336E04159000080B483B000AF03463960FB80C9 +S11336F0B7F90630002B0ADB3B68DAB20C49B7F99C +S113370006301201D2B20B4483F800230AE03B686E +S1133710DAB20849FB8803F00F03043B1201D2B26A +S11337200B441A7600BF0C37BD465DF8047B704726 +S113373000E100E000ED00E0034B1B681BB1024A0E +S11337401368013B136070473C7C0000034B186016 +S1133750024B1B68002BFBD1704700BF3C7C000070 +S113376008B501F067FF01F015FC02F0DFFF02F07D +S113377049FF114B1868114BA3FB0030800902F07C +S113378006FE40B1FEE7002202210D4800F026FFAC +S11337900C4B00221A704FF47A70FFF7D7FF094BD5 +S11337A01B78002BEFD101220221054800F016FFFF +S11337B0044B01221A70EEE7147C0000D34D621012 +S11337C00040C640317D000010B4062800F2C981D3 +S11337D0DFE810F0070039008000CE001C0164010E +S11337E09401C9B1D249D1F8200820F48030C1F83D +S11337F02008D1F8200820F0FF000243C1F8202857 +S1133800C1F83038D1F8003583F48033C1F800357D +S113381000205DF8044B7047C54BD3F8201841F4E1 +S11338208031C3F82018D3F8201821F0FF010A438F +S1133830C3F82028D3F8002582F48032C3F8002589 +S1133840D3F84008E5E711B3B948D0F8501801F4AB +S11338500071D0F8504824F48034C0F85048D0F8AF +S1133860504824F0FF042243C0F85028C0F86038C0 +S1133870D0F8503883F48073C0F85038AC4BD3F888 +S1133880503803F400739942F8D00020C1E7A84BE4 +S1133890D3F8501801F40071D3F8500840F4803084 +S11338A0C3F85008D3F8500820F0FF000243C3F8CF +S11338B05028D3F8502882F48072C3F850289C4BC7 +S11338C0D3F8503803F400739942F8D0984BD3F8E6 +S11338D070089EE749B39648D0F8801801F4007147 +S11338E0D0F8804824F48034C0F88048D0F8804868 +S11338F024F0FF042243C0F88028C0F89038D0F8A0 +S1133900803883F48073C0F88038894BD3F88038CA +S113391003F400739942F8D0854AD2F8803823F42E +S11339208033C2F88038002073E7814BD3F88018C5 +S113393001F40071D3F8800840F48030C3F88008A3 +S1133940D3F8800820F0FF000243C3F88028D3F89E +S1133950802882F48072C3F88028754BD3F88038AD +S113396003F400739942F8D0714BD3F8A00850E7E0 +S113397049B36F48D0F8B01801F40071D0F8B048DA +S113398024F48034C0F8B048D0F8B04824F0FF04E0 +S11339902243C0F8B028C0F8C038D0F8B03883F457 +S11339A08073C0F8B038624BD3F8B03803F40073B6 +S11339B09942F8D05E4AD2F8B03823F48033C2F882 +S11339C0B038002025E75A4BD3F8B01801F4007141 +S11339D0D3F8B00840F48030C3F8B008D3F8B00886 +S11339E020F0FF000243C3F8B028D3F8B02882F4D3 +S11339F08072C3F8B0284E4BD3F8B03803F4007388 +S1133A009942F8D04A4BD3F8D00802E719B3484892 +S1133A10D0F8201901F40071D0F8204924F480343E +S1133A20C0F82049D0F8204924F0FF0C42EA0C02E7 +S1133A30C0F82029C0F83039D0F8203983F48073D5 +S1133A40C0F820393A4BD3F8203903F40073994273 +S1133A50F8D00020DDE6364BD3F8201901F40071CC +S1133A60D3F8200940F48030C3F82009D3F82009A2 +S1133A7020F0FF000243C3F82029D3F8202982F460 +S1133A808072C3F820292A4BD3F8203903F4007339 +S1133A909942F8D0264BD3F84009BAE6B9B1244983 +S1133AA0D1F8E00820F48030C1F8E008D1F8E0084B +S1133AB020F0FF000243C1F8E028C1F8F038D1F843 +S1133AC0003483F40043C1F800340020A1E6184B0D +S1133AD0D3F8E01841F48031C3F8E018D3F8E018C3 +S1133AE021F0FF010A43C3F8E028D3F8002482F44C +S1133AF00042C3F80024D3F810098AE6D1B10C4976 +S1133B00D1F8E00820F48030C1F8E008D1F8E008EA +S1133B1020F0FF000243C1F8E028C1F8F038D1F8E2 +S1133B20703583F00103C1F87035002071E600BFE1 +S1133B300040C8400C4BD3F8E01841F48031C3F87E +S1133B40E018D3F8E01821F0FF010A43C3F8E02895 +S1133B50D3F8702582F00102C3F87025D3F8000968 +S1133B6057E6002055E600BF0040C840C001024BA4 +S1133B701858C0F3022070470000CC40C001024B2B +S1133B801858C0B2013070470000CC4038B5054623 +S1133B90FFF7ECFF094B03EBC503185C00F00AFCCC +S1133BA004462846FFF7EAFF0346B4FBF0F09C42C4 +S1133BB000D338BD0248FFF701FD00BF2C6C0000A4 +S1133BC0A46E000038B54368A3F16802682A4DD892 +S1133BD00546354AD2F8002212F4005F11D0324A69 +S1133BE0D2F8002223EA020313F0FF0F09D12E4B6F +S1133BF0D3F800320278DB4303EAC23313F4C03F44 +S1133C0037D0294C204600F009FFD4F8002222F0D6 +S1133C10005312F4C04F05D0244B134043F08043AB +S1133C20C4F80032224A1A402C792B78DB0303F4BF +S1133C30C0331C4314431F4B23431B4AC2F80032B6 +S1133C40BFF34F8FBFF36F8F1B491E2000F050FC52 +S1133C50154BD3F8003213F0005FF9D024F0804400 +S1133C6044F4C044104BC3F8004238BD1348FFF776 +S1133C70A5FC0D4BD3F8003213F4804F06D10A4A49 +S1133C80D2F8003243F48043C2F80032064BD3F832 +S1133C90003213F0804FE8D0034AD2F8003223F008 +S1133CA08043C2F80032E0E70040C840FF9FFFDFD6 +S1133CB0007FFEDF002000400046C323C06E0000EA +S1133CC038B50446474BD3F8403213F4000F1AD0EA +S1133CD000286BD0434BD3F8603213F4004F02D169 +S1133CE0037A002B62D0237ADB039BB262681188CB +S1133CF043EA01435288C2F30E021343394AD2F80D +S1133D006022934252D0374D284600F087FED5F802 +S1133D10703243F08033C5F87032D5F84022324B0C +S1133D201A4205D0314B134043F08043C5F840326A +S1133D30A4B1237A93B1636883B1236823F0404329 +S1133D40284AC2F8A032616808884B88C3F30E037E +S1133D5043EA004343F40043C2F86032214C244B4D +S1133D60C4F84032234D29461E2000F0C1FB224BEB +S1133D70C4F840322946FA2000F0BAFB1F4BC4F8BD +S1133D804032184BD3F8403213F0005FF9D0154B92 +S1133D901B4AC3F8402202F14042C3F84022D3F840 +S1133DA0702202F07F32C3F8702238BD0D4BD3F875 +S1133DB0403213F4005F06D10A4AD2F8403243F489 +S1133DC00053C2F84032074BD3F8403213F0804F0F +S1133DD0EBD0044AD2F8403223F08043C2F8403298 +S1133DE0E3E700BF0040C84000208000FFDF7FFF02 +S1133DF0080000400046C3230808804008008040B3 +S1133E0008208040F0B583B0A2F10C03DBB2172B7D +S1133E1048D802284CD0032847D1274E27480368A6 +S1133E20CC003F25A5402B40E340DBB207684FF0B0 +S1133E30800E0EFA04FE07EA0E0C0827CF403CFA67 +S1133E4007F70CBF012700279A4214BF002707F089 +S1133E5001072FBB03684FF0400C0CFA04FC03EA83 +S1133E600C03019303684EEA03030360036823EA27 +S1133E7005050560036802F03F02A2401A43026090 +S1133E803368022202FA01F159403160036823EADF +S1133E900E03036003680CEA0303019A9342F9D00A +S1133EA003B0F0BD0648FFF789FB0648FFF786FB21 +S1133EB0054E0648B3E700BF2042C8403042C84020 +S1133EC0446F0000986F00005042C8407042C840E0 +S1133ED008B5831EDBB2012B0CD802280DD00328B1 +S1133EE020D1134BD3F83002CA003F23934018402B +S1133EF0104B0AE01048FFF761FB0D4BD3F870023A +S1133F00CA003F23934018400C4BC900C840A0F19D +S1133F100C02172A09D820B1B3FBF0F000EBC00063 +S1133F20400008BD0648FFF749FB0648FFF746FB7B +S1133F300040C84000389C1CB46F000000A4781FE7 +S1133F40FC6F00001870000038B5264BD3F810320F +S1133F5013F4001F1AD0234BD3F8103213F4005F6C +S1133F6006D1204AD2F8103243F40053C2F810327A +S1133F701C4BD3F8103213F0804F31D0194AD2F8C9 +S1133F80103223F08043C2F8103229E0154C204649 +S1133F9000F044FDD4F8303243F08033C4F83032BA +S1133FA0114BC4F81032114D29461E2000F0A0FA1E +S1133FB00F4BC4F8103229461E2000F099FA0D4B1D +S1133FC0C4F81032074BD3F8103213F0005FF9D065 +S1133FD0044B094AC3F8102202F14042C3F81022EC +S1133FE038BD00BF0040C840100000400046C32355 +S1133FF010082040100020401820204008B5052853 +S113400040D8DFE800F003131727373B41B11F4BBB +S1134010D3F8003243F400331C4AC2F8003208BD1E +S11340201A4BD3F8003223F40033F5E7012002F0F1 +S11340300CFAF4E741B1154BD3F8403243F4803322 +S1134040124AC2F84032EAE7104BD3F8403223F464 +S11340508033F5E741B10D4BD3F8103243F480338C +S11340600A4AC2F81032DAE7084BD3F8103223F4C4 +S11340708033F5E7022002F0E8F9D0E7032002F0EC +S1134080E4F9CCE70248FFF799FA00BF0040C840C2 +S11340907070000038B504460D46012102F0E9F9BC +S11340A00449284600F024FA0021204602F0E1F9F0 +S11340B038BD00BF0046C3232DE9F04182B0044659 +S11340C00D4616461F46DDF82480012832D1B8F18A +S11340D0000F0DD0B8F80220C2F30E02B8F8003079 +S11340E042EA034242F400421021204602F079F9E8 +S11340F0089A3021204602F074F9324620212046E5 +S113410002F06FF9002100917F232A46204602F035 +S113411076F9012C12D10121204602F0A0F90C49B4 +S1134120642000F0E5F90121204602F07FF902B095 +S1134130BDE8F081002102F079F9C8E71923009362 +S11341404FF060633A460021204602F058F9E2E756 +S11341500046C32338B9084AD2F8003323F4804315 +S1134160C2F800337047044AD2F8003343F4804362 +S1134170C2F80033704700BF0040C84038B9084A4D +S1134180D2F8003323F40053C2F800337047044AD2 +S1134190D2F8003343F40053C2F80033704700BF31 +S11341A00040C84038B9084AD2F8503323F4804359 +S11341B0C2F850337047044AD2F8503343F4804372 +S11341C0C2F85033704700BF0040C84038B9084AAD +S11341D0D2F8503323F40053C2F850337047044AE2 +S11341E0D2F8503343F40053C2F85033704700BF41 +S11341F00040C84030B583B00446274D284600F03F +S11342000DFCD5F8503303F02023B3F1202F2BD02D +S113421000250121032002F018F93DBB0120FFF71E +S1134220D5FF217862686378A068257C8DB3E46843 +S1134230019400900320FFF73FFFE1210320FFF7E3 +S113424029FF154BD3F8503313F0005FF9D0012147 +S1134250032002F022F90020FFF7A4FF002103202D +S113426002F0F3F803B030BD0125D2E70020FFF7D8 +S1134270ADFF0120FFF796FF0021032002F00DF9A6 +S11342800021032002F0D2F80021032002F0E7F815 +S1134290C4E70024CCE700BF0040C84038B9084A4E +S11342A0D2F8C03223F48043C2F8C0327047044AC3 +S11342B0D2F8C03243F48043C2F8C032704700BF22 +S11342C00040C84038B9084AD2F8C03223F000731D +S11342D0C2F8C0327047044AD2F8C03243F00073C7 +S11342E0C2F8C032704700BF0040C84038B9084A1D +S11342F0D2F8C03223F08063C2F8C0327047044A57 +S1134300D2F8C03243F08063C2F8C032704700BFB5 +S11343100040C84038B9084AD2F8C03223F40053E8 +S1134320C2F8C0327047044AD2F8C03243F4005392 +S1134330C2F8C032704700BF0040C84008B5052825 +S11343401ED8DFE800F0032725201519124BD3F8F7 +S11343500002C0B2D3F80032C3F3C13301330222E6 +S11343609A400E4BB3FBF2F303FB00F068B108BDB7 +S11343700420FFF7D9F8F9E70520FFF7D5F8F5E7AA +S11343800748FFF71BF90748F1E70748FFF716F955 +S11343900648ECE70648EAE70040C84000366E01EC +S11343A0D470000000389C1CF070000000A4781F3A +S11343B000CA9A3B08B5FF2813D01E286BD8DFE843 +S11343C000F07876716F6D6D131319191D22272C67 +S11343D03131353A3F44494E4E52575F5F6363670C +S11343E067003548FFF7EAF80020FFF7A7FF002829 +S11343F05AD008BD0220FFF7A1FFF8E700210220F0 +S1134400FFF766FDF3E701210220FFF761FDEEE708 +S113441002210846FFF75CFDE9E703210220FFF7CC +S113442057FDE4E70320FFF789FFE0E70320FFF7E8 +S113443085FF4008DBE700210320FFF749FDD6E7AD +S113444001210320FFF744FDD1E702210320FFF7F8 +S11344503FFDCCE703210846FFF73AFDC7E70120FB +S1134460FFF76CFFC3E70120FFF768FF4008BEE7D2 +S11344700120FFF763FF114BA3FB00308008B6E770 +S11344800420FFF75BFFB2E70520FFF757FFAEE715 +S113449001F0C7FFABE70A48FFF790F80948A8E71F +S11344A00948A6E70748A4E70848FFF787F808483B +S11344B09FE708489DE700BF0C710000CDCCCCCC31 +S11344C03871000000366E010084D7175471000063 +S11344D0006CDC020024F400044B1A6D22F001028B +S11344E01A651A6E42F001021A6670470040C8400D +S11344F098B108B5A1FB00014FF0FF338342074B8D +S11345008B4107D3064A002302F09EFA400002F0D2 +S113451019F808BD0348FFF751F870473F420F00F0 +S1134520C0C62D0070710000C9B200F540735B0174 +S1134530084AD3584B4013F0010F09D001F0010190 +S113454000F5407040011150BFF34F8FBFF36F8FE0 +S1134550704700BF0000CC4008B5024600200F2879 +S113456006D8064B53F82030934201D00130F6E7C9 +S11345700F2800D808BD0248FFF720F89C710000FE +S1134580EC710000F8B504460E461746FFF7E4FF49 +S11345900D2803D8104B185C8A2811D163690125B2 +S11345A0B540EA4323EA050363613B785BB963687A +S11345B01A406260BA783146204601F0CEFFF8BD59 +S11345C001F0C6FFEAE77A783146204600F006F8A3 +S11345D063681D436560EDE7DC71000008B51F29C1 +S11345E006D842B9012303FA01F1C0F8881008BDC6 +S11345F00448FEF7E3FF012303FA01F1C0F8841035 +S1134600F5E700BF20720000C9B200F540735B01FA +S1134610084AD3584B4013F0010F09D001F00101AF +S113462000F5407040011150BFF34F8FBFF36F8FFF +S1134630704700BF0000CC4008B5024600200C289B +S113464006D8064B53F82030934201D00130F6E7E8 +S11346500C2800D808BD0248FEF7B0FF3C720000E9 +S1134660807200002DE9784779B106469446884661 +S11346700A686AB10B7A042B0DD84B7A042B0DD837 +S1134680964604200024A2460FE06548FEF796FFF4 +S11346906448FEF793FF6448FEF790FF6348FEF713 +S11346A08DFF511A1AE00130C0B220281CD80CEB3F +S11346B08C035B00014600FB02F9B3FBF9F30533FD +S11346C05B4DA5FB0353C3F3CF0303B9012303FBE2 +S11346D001F1BCFBF1F18A42E3D2891A8E45E2D39F +S11346E08E4604469A46DEE7524BA3FB0232520939 +S11346F002EB4202724503D240F22150BDE87887B2 +S11347003046FFF799FF4C4B185C01F06DFF3046C3 +S113471001F06FFF3369221FD2B2032A01D843F498 +S1134720003323F0F852631E1B0603F0F8531343BF +S1134730424A1A40CAF30C0313433361336923F02A +S113474000533361B3693E49194098F8040098F85E +S11347500F301B0203F4E063034398F80E20920029 +S113476002F0040213430B4398F80520012A4DD0AC +S113477008B143F01003B361326922F4005298F88F +S113478007305B0303F400531343336198F80920A3 +S113479098F8083043EA0243F362B36A43F08803AB +S11347A0B362B36A43F44043B362716A98F80D305C +S11347B01B0103F0100398F80C20520102F02002B0 +S11347C013430B43736298F80A301BB1736A43F0C6 +S11347D00803736298F80B301BB1736A43F001034A +S11347E0736298F80630C3B1164A73691343736150 +S11347F0B36998F810200AB143F4002398F8112003 +S11348000AB143F48023B361002077E710B123F4A5 +S11348100063B0E743F40063ADE70B4AE5E700BF8C +S1134820BC720000E0720000107300006C730000A2 +S1134830CDCCCCCC1F85EB517072000000E0FFFFA3 +S1134840E8F8FFFF00C01FE000C01FC010B5B8B1FA +S113485004461422002101F0C7FF4FF4E133236022 +S1134860002323716371A371E37123726372A372D2 +S1134870E37263732373A373E3732374637410BDCC +S11348800148FEF79BFE00BFC873000008B58C46C4 +S113489051B90948FEF792FE436913F4000FFBD0A7 +S11348A01CF8013BC361013A002AF5D1436913F4B2 +S11348B0800FFBD0002008BDEC73000008B5044B4A +S11348C01B68044A516804489847BFF34F8F08BDDA +S11348D0747C0000407C000000C0074008B5044B15 +S11348E01B68044A916804489847BFF34F8F08BD7A +S11348F0747C0000407C00000000084008B5044BB4 +S11349001B68044AD16804489847BFF34F8F08BD19 +S1134910747C0000407C00000040084008B5044B53 +S11349201B68044A116904489847BFF34F8F08BDB8 +S1134930747C0000407C00000080084008B5044BF3 +S11349401B68044A516904489847BFF34F8F08BD58 +S1134950747C0000407C000000C0084008B5044B93 +S11349601B68044A916904489847BFF34F8F08BDF8 +S1134970747C0000407C00000000094008B5044B32 +S11349801B68044AD16904489847BFF34F8F08BD98 +S1134990747C0000407C00000040094008B5044BD2 +S11349A01B68044A116A04489847BFF34F8F08BD37 +S11349B0747C0000407C00000080094008B5044B72 +S11349C01B68044A516A04489847BFF34F8F08BDD7 +S11349D0747C0000407C000000C0094008B5044B12 +S11349E01B68044A916A04489847BFF34F8F08BD77 +S11349F0747C0000407C000000000A4008B5044BB1 +S1134A001B68044AD16A04489847BFF34F8F08BD16 +S1134A10747C0000407C00000040C24010B5044695 +S1134A200021084601F0E4FC40F20513984200D14D +S1134A3010BD1A460021084601F0D3FC05490120A7 +S1134A40FFF756FDD4F8703543F01003C4F8703501 +S1134A50EEE700BF0046C32338B50446E9B9D0F8F1 +S1134A60103523F00503C0F81035204D29464FF4C6 +S1134A707A70FFF73DFDD4F8103523F02003C4F815 +S1134A80103529464FF47A70FFF732FDD4F810350B +S1134A9023F40023C4F8103538BDD0F8103523F0C2 +S1134AA00103C0F81035114D29464FF47A70FFF711 +S1134AB01FFDD4F8103543F40023C4F810352946FB +S1134AC04FF47A70FFF714FDD4F8103543F0200347 +S1134AD0C4F8103529464FF47A70FFF709FDD4F86D +S1134AE0103543F00403C4F81035D5E70046C3235A +S1134AF038B50446E9B1D0F8303543F40033C0F892 +S1134B0030351B4D29464FF47A70FFF7F1FCD4F889 +S1134B10303543F48023C4F8303529464FF47A7095 +S1134B20FFF7E6FCD4F8303523F00403C4F830353D +S1134B3038BDD0F8303543F00403C0F830350C4D9F +S1134B4029464FF47A70FFF7D3FCD4F8303523F4B8 +S1134B508023C4F8303529464FF47A70FFF7C8FC37 +S1134B60D4F8303523F40033C4F83035E0E700BF1F +S1134B700046C32310B5614BD3F8882042F4700279 +S1134B80C3F888205E4A9A605E4B1B8813F0040FBA +S1134B9006D05C4A13889BB223F004039BB21380B3 +S1134BA0594B1B8813F0040F06D0574A13889BB245 +S1134BB023F004039BB21380544B1B6813F4005F6F +S1134BC05DD0524B524A5A60504A4FF6FF7393607D +S1134BD0136823F0A00343F0200313604D4B1B68BC +S1134BE013F4005F53D04B4B494A5A60494A4FF67D +S1134BF0FF739360136823F0A00343F02003136052 +S1134C004FF0E0231B6913F0010F05D04FF0E022B1 +S1134C10136923F001031361384B5B6913F4003FFC +S1134C2018D1364B5B6913F4003F13D1BFF34F8F98 +S1134C30BFF36F8F314B0022C3F85022BFF34F8F65 +S1134C40BFF36F8F5A6942F400325A61BFF34F8F3A +S1134C50BFF36F8F294B5B6913F4803F3CD1274B23 +S1134C605B6913F4803F37D1244B0022C3F88420BE +S1134C70BFF34F8FD3F88040C4F34E3010E0234B82 +S1134C804CF220525A604DF628125A609CE7214B90 +S1134C904CF220525A604DF628125A60A6E7184684 +S1134CA0C4F3C90243F6E07303EA401343EA827390 +S1134CB01249C1F860321346013A002BF2D1431E67 +S1134CC00028ECD1BFF34F8F4B6943F480334B6121 +S1134CD0BFF34F8FBFF36F8F0F4A136F23F400534B +S1134CE01367064A536943F010035361BFF34F8FB0 +S1134CF0BFF36F8F01F087FC10BD00BF00ED00E033 +S1134D0000300000000003400040034000800340E6 +S1134D1020C528D90000C14000400E4010B586B01F +S1134D200C4601A8FFF792FD63680193237A8DF87E +S1134D300830637A8DF80B30A37A003B18BF012347 +S1134D408DF81530E37A003B18BF01238DF8143039 +S1134D50237B003B18BF01238DF80E30637B003B9F +S1134D6018BF01238DF80F3001238DF812308DF810 +S1134D701330A07B226801A9054B53F82000FFF7EC +S1134D8071FC18B101F040FC06B010BD0020FBE737 +S1134D901074000038B578B10C46054679B18B7BA8 +S1134DA00C2B0FD80A4A52F8233073B1FFF7B6FF21 +S1134DB008B9A37B2B7038BD0648FEF7FFFB0648F5 +S1134DC0FEF7FCFB0548FEF7F9FB0548FEF7F6FB8A +S1134DD01074000044740000707400009C7400009F +S1134DE00475000008B548B159B16AB10078084BA0 +S1134DF053F82000FFF74AFD002008BD0548FEF7E0 +S1134E00DDFB0548FEF7DAFB0448FEF7D7FB00BFDD +S1134E1010740000507500007C750000A875000037 +S1134E20C001024B1858C0F3022070470000CC4068 +S1134E30C001024B1858C0B2013070470000CC408A +S1134E4038B50546FFF7ECFF094B03EBC503185CC7 +S1134E50FFF7B0FA04462846FFF7EAFF0346B4FB1F +S1134E60F0F09C4200D338BD0248FEF7A7FB00BF18 +S1134E70D075000048780000C001024B1858C0F3F8 +S1134E80022070470000CC40C001024B1858C0B249 +S1134E90013070470000CC4008B569B14B781B0263 +S1134EA003F4E0638A78013AD2B213430A7832B148 +S1134EB0120602F0807203E00648FEF77FFB002230 +S1134EC01343C001044A1350BFF34F8FBFF36F8FD6 +S1134ED008BD00BF507B00000000CC4038B505463B +S1134EE0FFF7CAFF094B03EBC503185CFFF762FA2F +S1134EF004462846FFF7C8FF0346B4FBF0F09C4283 +S1134F0000D338BD0248FEF759FB00BFD878000033 +S1134F104878000028B1064A136943F0020313617C +S1134F207047034A136923F002031361704700BFFB +S1134F300040C84028B1064A136943F080731361E6 +S1134F407047034A136923F080731361704700BFED +S1134F500040C84028B1064A136D43F002031365AC +S1134F607047034A136D23F002031365704700BFB3 +S1134F700040C84010B4C468054B2340890201F4C2 +S1134F80806119431143C1605DF8044B704700BF51 +S1134F9000FBFFFF2DE9F04782B00023ADF8043099 +S1134FA08DF80630ED4C01212046FFF755FD012117 +S1134FB02046FFF79DFD022001F0AFFAD4F8C0307F +S1134FC043F00203C4F8C030FFF786FA0120FFF76C +S1134FD0C1FF0120FFF79EFF0120FFF7ABFF236A0B +S1134FE043F014032362DD4B1B6A13F0804FFAD0A5 +S1134FF000248DF8054001258DF8065001A92046AE +S1135000FFF74AFF01A90820FFF746FFD448FEF73F +S1135010D9FD29462846FEF7F1FF01F060FAD14890 +S1135020FEF74EFE1B2221460220FEF7EBFE102265 +S113503029460220FEF7E6FE182202210846FEF762 +S1135040E1FE182203210220FEF7DCFEFEF77CFFBE +S11350500D2221460320FEF7D5FE11222946032006 +S1135060FEF7D0FE202202210320FEF7CBFE1622FB +S113507003210846FEF7C6FE29460420FEF7BEFFBC +S113508001F015FAB848FFF7B5F84FF0040A8DF8A7 +S113509005A08DF806500DEB0A012046FFF7FCFE33 +S11350A04FF007098DF805904FF002088DF806803F +S11350B00DEB0A014046FFF7EFFE06268DF805606A +S11350C003278DF806700DEB0A015046FFF7E4FE46 +S11350D08DF805408DF806500DEB0A010520FFF709 +S11350E0DBFE8DF805908DF806A00DEB0A01304625 +S11350F0FFF7D2FE8DF80540F0238DF806300DEB56 +S11351000A010820FFF7C8FE8DF805408DF8065007 +S11351100DEB0A010920FFF7BFFE8DF805408DF85D +S113512006500DEB0A010A20FFF7B6FE8DF8054084 +S11351308DF806500DEB0A010B20FFF7ADFE8DF83C +S113514005408DF806500DEB0A010C20FFF7A4FE74 +S11351508DF805408DF806500DEB0A010D20FFF780 +S11351609BFE8DF805408DF806500DEB0A010E20CC +S1135170FFF792FE8DF805408DF806500DEB0A01FD +S11351800F20FFF789FE8DF805408DF806500DEBD2 +S11351900A011020FFF780FE8DF805408DF80650B7 +S11351A00DEB0A011120FFF777FE8DF805408DF80D +S11351B006500DEB0A011220FFF76EFE8DF8054034 +S11351C08DF806500DEB0A011320FFF765FE8DF8EC +S11351D005408DF806500DEB0A011520FFF75CFE23 +S11351E08DF805408DF806500DEB0A011620FFF7E7 +S11351F053FE8DF805408DF806500DEB0A0117207B +S1135200FFF74AFE8DF805408DF806500DEB0A01B4 +S11352101820FFF741FE8DF805604FF0160A8DF84F +S113522006A001A91920FFF737FE8DF805608DF857 +S113523006A001A91A20FFF72FFE8DF805408DF86E +S1135240065001A91B20FFF727FE8DF805408DF8B5 +S1135250065001A91C20FFF71FFE8DF805408DF8AC +S1135260065001A91D20FFF717FE8DF805408DF8A3 +S1135270065001A91E20FFF70FFE8DF805408DF89A +S1135280065001A91F20FFF707FE8DF805408DF891 +S1135290065001A92020FFF7FFFD8DF805408DF889 +S11352A0065001A92120FFF7F7FD8DF805408DF880 +S11352B0065001A92220FFF7EFFD8DF805408DF877 +S11352C0065001A92320FFF7E7FD8DF805408DF86E +S11352D0065001A92420FFF7DFFD8DF805408DF865 +S11352E0065001A92520FFF7D7FD8DF805408DF85C +S11352F0065001A92620FFF7CFFD8DF805408DF853 +S1135300065001A92720FFF7C7FD8DF805408DF849 +S1135310065001A92820FFF7BFFD8DF805408DF840 +S1135320065001A92920FFF7B7FD8DF805408DF837 +S1135330065001A92A20FFF7AFFD8DF805408DF82E +S1135340065001A92B20FFF7A7FD8DF805408DF825 +S1135350065001A92C20FFF79FFD07E00040C8403C +S1135360E47B0000EC7B0000F87B00008DF8054036 +S11353708DF8065001A92D20FFF78EFD8DF805400C +S11353808DF8065001A92E20FFF786FD8DF8054003 +S11353908DF8065001A92F20FFF77EFD8DF80540FA +S11353A08DF8065001A93020FFF776FD8DF80540F1 +S11353B08DF8065001A93120FFF76EFD8DF80540E8 +S11353C08DF8065001A93220FFF766FD8DF80540DF +S11353D08DF8065001A93320FFF75EFD8DF80540D6 +S11353E08DF8065001A93420FFF756FD8DF80540CD +S11353F08DF8065001A93620FFF74EFD8DF80540C3 +S11354008DF8065001A93720FFF746FD8DF80540B9 +S11354108DF8065001A93820FFF73EFD8DF80540B0 +S11354208DF8065001A93A20FFF736FD8DF80540A6 +S11354308DF8065001A93B20FFF72EFD8DF805409D +S11354408DF8065001A93C20FFF726FD8DF8054094 +S11354508DF8065001A93D20FFF71EFD8DF805408B +S11354608DF8065001A93E20FFF716FD8DF8054082 +S11354708DF8065001A93F20FFF70EFD8DF8054079 +S11354808DF8065001A94020FFF706FD8DF8054070 +S11354908DF8065001A94120FFF7FEFC8DF8054068 +S11354A08DF8065001A94220FFF7F6FC8DF805405F +S11354B08DF8065001A94320FFF7EEFC8DF8059006 +S11354C08DF8068001A94420FFF7E6FC8DF805401D +S11354D08DF8065001A94520FFF7DEFC8DF8054044 +S11354E08DF8065001A94620FFF7D6FC8DF805403B +S11354F08DF8065001A94720FFF7CEFC8DF8054032 +S11355008DF8065001A94820FFF7C6FC8DF8054028 +S11355108DF8065001A94920FFF7BEFC8DF805401F +S11355208DF8065001A94A20FFF7B6FC8DF8054016 +S11355308DF8065001A94B20FFF7AEFC8DF805400D +S11355408DF8065001A94C20FFF7A6FC8DF8054004 +S11355508DF8065001A94D20FFF79EFC8DF80540FB +S11355608DF8065001A94E20FFF796FC234D2246E4 +S11355702146284601F0E5F83A463946284601F026 +S1135580E0F822463146284601F0DBF8224608219D +S1135590284601F0D6F822460A21284601F0D1F81F +S11355A0224621462846FFF7E5FC2B6923F0010338 +S11355B02B616B6923F001036B61AB6D23F0010375 +S11355C0AB65EB6D23F00103EB652B6E23F0010358 +S11355D02B666B6E23F001036B66AB6E23F0010345 +S11355E0AB66EB6E23F00103EB662046FFF776FC17 +S11355F0034B186002B0BDE8F08700BF00400E40C6 +S1135600147C0000C9B200F540735B01084AD3580A +S11356104B4013F0010F09D001F0010100F5407077 +S113562040011150BFF34F8FBFF36F8F704700BF1E +S11356300000CC4070B584B0312001F0B4F80126EC +S11356408DF80C6000248DF80D408DF80E401C4D33 +S113565003AA02212846FEF795FF8DF808608DF80D +S113566009408DF80A4002AA03212846FEF78AFF62 +S11356700194144B0093234622460A21124801F058 +S113568097F80194114B0093234622460A211048AF +S113569001F08EF80F4D01940F4E009623462246DA +S11356A00321284601F084F802230193009623463F +S11356B022460321284601F08BF804B070BD00BFD8 +S11356C00040C6405C830E4018810E4060830E404B +S11356D01C810E4030820E4074840E4010B5174A6F +S11356E00020174901F0FDF84FF480734FF48062F5 +S11356F00021124801F092F8124A1349012001F0E6 +S1135700F0F84FF480734FF4806200210D4801F0EB +S113571085F80E4B1B68022B0EDD0D4A02200A4948 +S113572001F0DFF84FF480734FF4806200210848E1 +S1135730BDE8104001F072B810BD00BF7C7C0000D1 +S1135740107C0000B87C0000127C00000C7C00007F +S1135750F47C00002DE9F041D56880460E461446DD +S1135760EB02576905D545F01005384601F043FAB8 +S1135770A061124B2B408BB1A169384601F044FA69 +S1135780002806DAE3684FF0FF3043F08003E3605B +S113579011E025F4003525F01005E5603246414658 +S11357A0384601F037FA20F00041761AA1690E4418 +S11357B0A6610028E6D1BDE8F08100BF1000020018 +S11357C0F8B5044638B90B4B05460B4E1F68A74283 +S11357D005DC2846F8BDBDE8F84001F015B93046AF +S11357E0013401F011F9002806F13C0618BF4FF00E +S11357F0FF35ECE70C7C00007C7C00002DE9F843CD +S1135800C66804463C4B0D46904633401BB90227FC +S11358103846BDE8F883D0F81490484601F0EEF914 +S113582007460028F3D1B8F1010F2CD0B8F1020FCC +S11358302ED0B8F1000FEAD1002DE8DBB00404D576 +S11358402368E26A9A4238BFE362A169A9420EDC86 +S11358502368E26A934238BF134622695818801AB3 +S1135860A84204DB206B01EB000CAC4534DC0023C4 +S113587046F02006A562C4E9013326F4032626F087 +S11358804006E660C4E7204600F038F80544D3E754 +S1135890484601F0B0F9B0F1000CE26804DA42F0D5 +S11358A080020127E260B3E723681846A36919461A +S11358B0E36A98422CBF0918C91892060B4621695D +S11358C0A3EB010303D5A26A9342B8BF1346634511 +S11358D0ACBFED186544AFE76D1AB10744BF281A91 +S11358E0A060F10726F0200644BF9B1AEB1A15446A +S11358F048BF63602560C0E703001000C3689A07CF +S113590005D10E4B21224FF0FF301A60704703F08F +S113591020021B0309D512B1806A0138704703685D +S1135920826900691344181AF7E70AB1806A70475C +S11359300368826900691344181A7047787C000070 +S11359402DE9F04106460C4690461F46002506E028 +S1135950236806F803802168013121600135BD42C6 +S113596009DA21684B1C7F2BF2D93046FDF730FE53 +S113597000232360ECE7BDE8F0818446002004E0C6 +S113598000EB800003EB40003038DCF800104B1CC7 +S1135990CCF800304B78A3F13002D2B2092AEFD907 +S11359A0CCF80010704710B5864603685A782E2A42 +S11359B003D00620CEF8003010BD591C0024204628 +S11359C000E001247CB901F1010C4B78A3F1300211 +S11359D0D2B2092AF5D800EB800003EB4003A3F10F +S11359E030006146EEE70B46E4E7622818BF6F28F3 +S11359F008D0752814BF00230123702804D01BB9D4 +S1135A00002070470120704701207047692818BFA3 +S1135A10642801D00020704701207047F8B5069C27 +S1135A20079D089E099F8B1A202239463046A847B5 +S1135A3004E0013C012339463046A8472278002A75 +S1135A40F7D1F8BDF8B5069C079D089E099F8B1AEF +S1135A50202239463046A84704E0013C0123394658 +S1135A603046A8472278002AF7D1F8BD462818BF47 +S1135A70662801D00020704701207047582818BFBD +S1135A80782801D000207047012070470368194628 +S1135A9013F8012F6C2A18BF682AF8D001607047E8 +S1135AA06F2807D0622807D0702801D00A207047D9 +S1135AB010207047082070470220704710B58646B2 +S1135AC09DF80840844600200CF8010BC2B10A6816 +S1135AD00AB100200AE030238EF80130012010BD05 +S1135AE0C2F130020CF8012B01300A46002AF6D02C +S1135AF092FBF3F103FB1122002AF1DB3032F1E7D0 +S1135B0010460A6862B930238EF801300120E6E7B6 +S1135B1084B141210A440A3A0CF8012B013072463F +S1135B20002ADCD0B2FBF3FE0EFB1322092AEFD8C5 +S1135B303032F1E76121EDE7F0B595B005911546F6 +S1135B401E46002309930793139051E005A913A857 +S1135B50FFF713FF0746002205A913A8FFF723FF49 +S1135B6013A8FFF793FF139B5A1C13925C782046EB +S1135B70FFF74CFF012818D02046FFF777FF0128D4 +S1135B802DD02046FFF77AFF01283FD02046FFF7AB +S1135B902CFF012859D0632C75D0732C7CD00123A1 +S1135BA0224609A92846B0471FE0059B1A1D059205 +S1135BB01B680893012200920A2308A90AA8FFF788 +S1135BC07DFF02460AAB034409A90391029501969D +S1135BD00093002339461846FFF720FF05E0059B94 +S1135BE0073323F007030833059313990131139105 +S1135BF013990A78002A67D0252AA7D0012309A976 +S1135C002846B047139901311391F1E7782C1AD043 +S1135C100124059B1A1D05921B6807930094102309 +S1135C20002207A90AA8FFF749FF02460AAB03446A +S1135C3009A9039102950196009323463946002051 +S1135C40FFF700FFD1E70024E3E7059B1A1D059247 +S1135C501B6807932046FFF723FF034601220092A7 +S1135C60002207A90AA8FFF729FF02460AAB03444A +S1135C7009A9039102950196009300233946184619 +S1135C80FFF7CCFEB1E7059A131D059301231278A3 +S1135C9009A92846B047A8E7059B1A1D05921C6868 +S1135CA0002CA2D0204600F0D8FD3B1A202209A9DE +S1135CB02846B04704E00134012309A92846B04727 +S1135CC02278002AF7D190E7099815B0F0BD08B5FD +S1135CD0FDF727FC08BD08B5FDF723FC08BD08B592 +S1135CE0FDF71FFC08BD08B5FDF71BFC08BD08B592 +S1135CF0FDF717FC08BD08B5FDF713FC08BD08B592 +S1135D00FDF70FFC08BD08B5FDF70BFC08BD08B591 +S1135D10FDF707FC08BD08B5FDF703FC08BD08B591 +S1135D20FDF7FFFB08BD08B5FDF7FBFB08BD08B593 +S1135D30FDF7F7FB08BD08B5FDF7F3FB08BD08B593 +S1135D40FDF7EFFB08BD08B5FDF7EBFB08BD08B593 +S1135D50FDF7E7FB08BD08B5FDF7E3FB08BD08B593 +S1135D60FDF7DFFB08BD08B5FDF7DBFB08BD08B593 +S1135D70FEF7A4FD08BD08B5FEF7B0FD08BD08B5E3 +S1135D80FEF7BCFD08BD08B5FEF7C8FD08BD08B5A3 +S1135D90FEF7D4FD08BD08B5FEF7E0FD08BD08B563 +S1135DA0FEF7ECFD08BD08B5FEF7F8FD08BD08B523 +S1135DB0FEF704FE08BD08B5FEF710FE08BD08B5E1 +S1135DC0FEF71CFE08BD08B5FDF7ABFB08BD08B522 +S1135DD0FDF7A7FB08BD08B5FDF7A3FB08BD08B593 +S1135DE0FDF79FFB08BD08B5FDF79BFB08BD08B593 +S1135DF0FDF797FB08BD08B5FDF793FB08BD08B593 +S1135E00FDF78FFB08BD08B5FDF78BFB08BD08B592 +S1135E10FDF787FB08BD08B5FDF783FB08BD08B592 +S1135E20FDF77FFB08BD08B5FDF77BFB08BD08B592 +S1135E30FDF777FB08BD08B5FDF773FB08BD08B592 +S1135E40FDF76FFB08BD08B5FDF76BFB08BD08B592 +S1135E50FDF767FB08BD08B5FDF763FB08BD08B592 +S1135E60FDF75FFB08BD08B5FDF75BFB08BD08B592 +S1135E70FDF757FB08BD08B5FDF753FB08BD08B592 +S1135E80FDF74FFB08BD08B5FDF74BFB08BD08B592 +S1135E90FDF747FB08BD08B5FDF743FB08BD08B592 +S1135EA0FDF73FFB08BD08B5FDF73BFB08BD08B592 +S1135EB0FDF737FB08BD08B5FDF733FB08BD08B592 +S1135EC0FDF72FFB08BD08B5FDF72BFB08BD08B592 +S1135ED0FDF727FB08BD08B5FDF723FB08BD08B592 +S1135EE0FDF71FFB08BD08B5FDF71BFB08BD08B592 +S1135EF0FDF717FB08BD08B5FDF713FB08BD08B592 +S1135F00FDF70FFB08BD08B5FDF70BFB08BD08B591 +S1135F10FDF707FB08BD08B5FDF703FB08BD08B591 +S1135F20FDF7FFFA08BD08B5FDF7FBFA08BD08B593 +S1135F30FDF7F7FA08BD08B5FDF7F3FA08BD08B593 +S1135F40FDF7EFFA08BD08B5FDF7EBFA08BD08B593 +S1135F50FDF7E7FA08BD08B5FDF7E3FA08BD08B593 +S1135F60FDF7DFFA08BD08B5FDF7DBFA08BD08B593 +S1135F70FDF7D7FA08BD08B5FDF7D3FA08BD08B593 +S1135F80FDF7CFFA08BD08B5FDF7CBFA08BD08B593 +S1135F90FDF7C7FA08BD08B5FDF7C3FA08BD08B593 +S1135FA0FDF7BFFA08BD08B5FDF7BBFA08BD08B593 +S1135FB0FDF7B7FA08BD08B5FDF7B3FA08BD08B593 +S1135FC0FDF7AFFA08BD08B5FDF7ABFA08BD08B593 +S1135FD0FDF7A7FA08BD08B5FDF7A3FA08BD08B593 +S1135FE0FDF79FFA08BD08B5FDF79BFA08BD08B593 +S1135FF0FDF797FA08BD08B5FDF793FA08BD08B593 +S1136000FDF78FFA08BD08B5FDF78BFA08BD08B592 +S1136010FDF787FA08BD08B5FDF783FA08BD08B592 +S1136020FDF77FFA08BD08B5FDF77BFA08BD08B592 +S1136030FDF777FA08BD08B5FDF773FA08BD08B592 +S1136040FDF76FFA08BD08B5FDF76BFA08BD08B592 +S1136050FDF767FA08BD08B5FDF763FA08BD08B592 +S1136060FDF75FFA08BD08B5FDF75BFA08BD08B592 +S1136070FDF757FA08BD08B5FDF753FA08BD08B592 +S1136080FDF74FFA08BD08B5FDF74BFA08BD08B592 +S1136090FDF747FA08BD08B5FDF743FA08BD08B592 +S11360A0FDF73FFA08BD08B5FDF73BFA08BD08B592 +S11360B0FDF737FA08BD08B5FDF733FA08BD08B592 +S11360C0FDF72FFA08BD08B5FDF72BFA08BD08B592 +S11360D0FDF727FA08BD08B5FDF723FA08BD08B592 +S11360E0FDF71FFA08BD08B5FDF71BFA08BD08B592 +S11360F0FDF717FA08BD08B5FDF713FA08BD08B592 +S1136100FDF70FFA08BD08B5FDF70BFA08BD08B591 +S1136110FDF707FA08BD08B5FDF703FA08BD08B591 +S1136120FDF7FFF908BD08B5FDF7FBF908BD08B593 +S1136130FDF7F7F908BD08B5FDF7F3F908BD08B593 +S1136140FDF7EFF908BD08B5FDF7EBF908BD08B593 +S1136150FDF7E7F908BD08B5FDF7E3F908BD08B593 +S1136160FDF7DFF908BD08B5FDF7DBF908BD08B593 +S1136170FDF7D7F908BD08B5FDF7D3F908BD08B593 +S1136180FDF7CFF908BD08B5FDF7CBF908BD08B593 +S1136190FDF7C7F908BD08B5FDF7C3F908BD08B593 +S11361A0FDF7BFF908BD08B5FDF7BBF908BD08B593 +S11361B0FDF7B7F908BD08B5FDF7B3F908BD08B593 +S11361C0FDF7AFF908BD08B5FDF7ABF908BD08B593 +S11361D0FDF7A7F908BD08B5FDF7A3F908BD08B593 +S11361E0FDF79FF908BD08B5FDF79BF908BD08B593 +S11361F0FDF797F908BD08B5FDF793F908BD08B593 +S1136200FDF78FF908BD08B5FDF78BF908BD08B592 +S1136210FDF787F908BD08B5FDF783F908BD08B592 +S1136220FDF77FF908BD08B5FDF77BF908BD08B592 +S1136230FDF777F908BD08B5FDF773F908BD08B592 +S1136240FDF76FF908BD08B5FDF76BF908BD08B592 +S1136250FDF767F908BD08B5FDF763F908BD08B592 +S1136260FDF75FF908BD08B5FDF75BF908BD08B592 +S1136270FDF757F908BD08B5FDF753F908BD08B592 +S1136280FDF74FF908BD08B5FDF74BF908BD08B592 +S1136290FDF747F908BD08B5FDF743F908BD08B592 +S11362A0FDF73FF908BD08B5FDF73BF908BD08B592 +S11362B0FDF737F908BD08B5FDF733F908BD08B592 +S11362C0FDF72FF908BD08B5FDF72BF908BD08B592 +S11362D0FDF727F908BD08B5FDF723F908BD08B592 +S11362E0FDF71FF908BD08B5FDF71BF908BD08B592 +S11362F0FDF717F908BD08B5FDF713F908BD08B592 +S1136300FDF70FF908BD08B5FDF70BF908BD08B591 +S1136310FDF707F908BD08B5FDF703F908BD08B591 +S1136320FDF7FFF808BD08B5FDF7FBF808BD08B593 +S1136330FDF7F7F808BD08B5FDF7F3F808BD08B593 +S1136340FDF7EFF808BD08B5FDF7EBF808BD08B593 +S1136350FDF7E7F808BD08B5FDF7E3F808BD08B593 +S1136360FDF7DFF808BD08B5FDF7DBF808BD08B593 +S1136370FDF7D7F808BD08B5FDF7D3F808BD08B593 +S1136380FDF7CFF808BD08B5FDF7CBF808BD013817 +S1136390B0F1807F01D30120704710B54FF0E024A5 +S11363A060610F214FF0FF30FDF79CF90020A061E0 +S11363B00723236110BD04207146084202D0EFF385 +S11363C0098001E0EFF3088081690A884BF6AB632A +S11363D09A4200D0FEE702318161202101607047BA +S11363E000BF08B513460A460121FDF7EDF908BDC3 +S11363F008B50A4600231946FDF7E6F908BDF8B5C5 +S113640005460E4614461F46FFF7F2FF069B9C40C6 +S1136410444004EA0702424031462846FFF7E1FFC0 +S1136420F8BD08B50020FDF7B1FB08BD08B50B4663 +S113643031B1042133B14FF4C042FFF7D2FF08BD9C +S11364400821F7E74FF48042F7E708B529B10421A2 +S11364504FF48032FFF7C5FF08BD0821F8E708B5FF +S113646029B104214FF48002FFF7BBFF08BD0821C6 +S1136470F8E708B529B104214FF40052FFF7B1FF42 +S113648008BD0821F8E708B529B104214FF40042FA +S1136490FFF7A7FF08BD0821F8E708B529B10421D3 +S11364A04FF40042FFF79DFF08BD0821F8E708B547 +S11364B00020FDF763FE0120FDF74CFE00210220C1 +S11364C0FFF7EBFF00210220FFF7B0FF00210220BD +S11364D0FFF7D9FF00210220FFF7C1FF08BD08B56F +S11364E00020FDF717FF0020FDF7ECFE0020FDF76C +S11364F0FDFE0120FDF7D2FE00210120FFF7CDFFB4 +S113650000210120FFF792FF00210120FFF7BBFFCC +S113651000210120FFF7A3FF08BD10B50446302178 +S11365200420FFF765FF20F4A06234B942F48072BE +S113653030210420FFF755FF10BD012CF8D142F49F +S11365408062F5E70046A0F101000028FBD1704706 +S113655008B50121FDF7E8FF08BD08B500F001F812 +S113656008BD10B4C46901238B4024EA0304C46148 +S11365700F2909D800F10C04013A042A0FD8DFE8E6 +S113658002F007111C272F0000F110041039F3E763 +S113659023684A000321914023EA010121605DF848 +S11365A0044B7047236848000322824023EA020315 +S11365B00121814019432160F1E723684800032247 +S11365C0824023EA02030221814019432160E6E765 +S11365D023684900032202FA01F119432160DEE72E +S11365E0C2691343C361DAE708B50121FEF70CF869 +S11365F008BD836843F002038360836823F00203C9 +S1136600836070477047704700B9704742F6AF70B7 +S1136610FBE7EFF3108072B6704780F31088704781 +S113662011460278012A02D043F22150704708B57E +S11366301A460C3000F06BF808BD10B5044613463A +S1136640002CFDD00029FDD0002BFDD020680028AF +S1136650FDD00A462146FFF7E3FF10BD38B50446D6 +S11366600D46002DFDD0002CFDD014220021204623 +S113667000F0BAF82B7A2370012B02D043F2215098 +S113668038BDE96804F10C0000F037F8F8E738B5D4 +S113669004460D46002CFDD0002DFDD0FFF7B9FFB8 +S11366A0A3680133A360FFF7B8FF04220021284642 +S11366B000F09AF82C60002038BD70B504460D46F1 +S11366C0002CFDD0002DFDD0FFF7A3FF0646636824 +S11366D033B143F222543046FFF79FFF204670BD8A +S11366E0656004220021284600F07EF82C60002416 +S11366F0F1E708B5FFF7A1FF08BD08B50029FDD0F3 +S11367000028FDD0FEF746FB0028FDD108BD08B5E2 +S11367100028FDD00029FDD0002AFDD0FEF762FB41 +S113672008BD08B51920FEF78BFB08BD08B5FFF7B7 +S1136730F8FF034601224FF4E1311046FCF762FFF3 +S113674008BD082907D9836823F0030302F0030274 +S11367501A4382607047062907D9436823F003036C +S113676002F003021A434260704703290DD90368FB +S11367704FF0030C0CFA01FC23EA0C0302F00302B1 +S113678002FA01F119430160704703684FF0070CE6 +S11367900CFA01FC23EA0C0302F0070202FA01F1ED +S11367A019430160704708B50121FEF72BFF08BDAE +S11367B010B401F00F01029C4FEA041C0CF0100C01 +S11367C041EA0C01016002B113605DF8044B7047AB +S11367D0009B0BB1019A1A60704708B5FEF77EFF63 +S11367E0BDE80840FCF7BCBF00F0E9B9A8B14FF020 +S11367F0805340F80C3C50F8042C72B11368B3F188 +S1136800805F0AD150F8083C516803330B4440F8C8 +S1136810083C936840F8043CEDE7704770B5C468E1 +S1136820A50708D0B2F5007F11D0B2F5806F04D06F +S1136830B2F5807F0BD0012008E000F12401012390 +S1136840224301610160C361C260002070BD5E1E0D +S11368506FF07F45AE42F3D3EDE7431C10B58207DA +S1136860044614D1204654F8042BA2F1013121EA44 +S1136870020111F0803FF5D0D1B281B112F47F4F03 +S11368800BD012F47F0F14BF2046033003E010F83E +S1136890012B002AE3D1C01A10BD0230FBE70130FE +S11368A0F9E7C368826923F0200310B5C360044686 +S11368B0836A9A420ED000F048F8E36823F4405308 +S11368C023F0100343F01003E360A36AA361236978 +S11368D0E3622360E36823F4804323F04003E3602E +S11368E010BD70B50D4606461046144600F056F825 +S11368F02B78722B17D0772B18D0612B23D1082338 +S113690048F2020215F8011F2B2912D0622915D072 +S11369101B07E260666104D5022200212046FEF7CF +S11369206DFF204670BD00230122EBE70423022201 +S1136930E8E742F0030243F00203E3E742F0040213 +S113694043F00103DEE70024EBE738B501680446B1 +S11369500569C36AC06820F40022E26000F0820284 +S1136960022A02D04FF0FF3038BD10F48030FBD043 +S1136970994238BF19468D4208D1E3680020E56288 +S113698023F480332560A060E360EDE72246491BD1 +S11369902846FEF7DFFE0028EFD0E3E7F0B5C46831 +S11369A089B00546A10722D0220718D4D0E904678C +S11369B0FEF706FF384600F01BF9230502D53046E2 +S11369C0FFF714FFA40DA40514F1A54F07D120224D +S11369D0296A684600F01BF9684600F00BF83C226F +S11369E000212846FFF700FF002009B0F0BD4FF05A +S11369F0FF30FAE710B50446FFF72FFF01462046A3 +S1136A00BDE8104000F0FDB8C36870B513F003068C +S1136A10044611D09B0611D5856AFFF742FFE3684F +S1136A20204623F44053E360FFF78FFF002206461D +S1136A3029462046FEF7E2FE304670BD81690568AE +S1136A400D4401696D1AEAE75FF0000C30B51C00D3 +S1136A5022D112006FD0914206D305460846002188 +S1136A6000F06FF80446284600F06BF80A46214609 +S1136A70BDE830401CF0404F08BF704703D5494281 +S1136A80404261F100015FEA8C0C38BF70475B4201 +S1136A90524263F10003704742D41C0C04BF1B0430 +S1136AA00CF1100C13F07F4F04BF1B020CF1080C07 +S1136AB013F0704F04BF1B010CF1040C13F0404F92 +S1136AC004BF0CF1020C5FEA83035CBF0CF1010C00 +S1136AD05B00CCF1200E22FA0EF4234302FA0CF2EE +S1136AE000FA0CF520FA0EF001FA0CF4204321FA16 +S1136AF00EF114461A4600F024F8A4FB0023AA1A47 +S1136B0071EB03033CBF1B190138CCF1200E22FAB0 +S1136B100CF203FA0EF4224323FA0CF30021A7E744 +S1136B20821A71EB03033CBF02460B464FF000018F +S1136B3041F100009CE700200021BDE8304000F056 +S1136B403DB80423B1EB122F09D2090241EA1061C6 +S1136B500002013B08BF7047B1EB122FF5D30018B8 +S1136B60494134BF9142891A4041494134BF91425D +S1136B70891A4041494134BF9142891A40414941EF +S1136B8034BF9142891A4041494134BF9142891A24 +S1136B904041494134BF9142891A4041494134BF7F +S1136BA09142891A4041494134BF9142891A404176 +S1136BB0A3F1010313F00F0FD2D1704770470346BE +S1136BC013F0030F0ED101F0FF0141EA012141EA64 +S1136BD00141043A24BF43F8041BB2F10402F9D280 +S1136BE002F10402013A24BF03F8011BFAE77047DB +S1136BF04FF0FF3070474FF0FF3070474FF0FF30D9 +S1136C0070474FF0FF3070474FF0FF3070474FF040 +S1136C10FF30704710467047415353455254204546 +S1136C2052524F522022202573200A0002050300ED +S1136C3007FF0FFF02050300140F091802050300E4 +S1136C400F18090D02050300140F091802050300AB +S1136C5018090B11020503001018090D02050300A1 +S1136C6010180B0902050300140F0A18020503008B +S1136C700910180A020503001018090D0205030083 +S1136C801018090D020503000F181A0D0205030060 +S1136C901018090D020503001018090D0205030060 +S1136CA0101813140205030010181A1C020503001F +S1136CB010181A1C0205030010181314020503000F +S1136CC0101813140205030010181314020503000E +S1136CD011090C0F0205030011090C0F0205030032 +S1136CE01018090D020503001018090D0205030010 +S1136CF0140F0D18020503001018090D02050300F6 +S1136D001018090D020503001018090D02050300EF +S1136D101018090D020503001018090D02050300DF +S1136D201018090D020503001018090D02050300CF +S1136D301018090D020503001018090D02050300BF +S1136D401018090D02050300140F0D1802050300A5 +S1136D50140F0D18020503001018090D0205030095 +S1136D601018090D020503001018090D020503008F +S1136D701018090D02050300140F0D180205030075 +S1136D80140F0D18020503001318090D0205030062 +S1136D901318090D020503001318090D0205030059 +S1136DA01318090D02050300140F1318020503003C +S1136DB0140F1318020503001018090D020503002F +S1136DC01018090D02050300171A180B0205030019 +S1136DD0171A180BFFFFFFFFFFFFFFFF0205030059 +S1136DE0171A180B02050300171A180B02050300E3 +S1136DF0171A180BFFFFFFFFFFFFFFFF0205030039 +S1136E000C0A1807020503000C0A18070205030000 +S1136E1018101A0D0205030018101A0D02050300BC +S1136E20140F1A18020503001A0F130D02050300AC +S1136E301A13180D020503001A13180D0205030096 +S1136E401A13180D02050300140F1A180205030083 +S1136E50090B0F1C02050300090C111C0205030099 +S1136E60090C111C02050300090A111C0205030088 +S1136E70090A111C020503000C0F0A1C0205030079 +S1136E800C0F0A1C020503000C0F0A1C0205030068 +S1136E900C0F121C020503000C0912180205030052 +S1136EA00D01121A2E66736C5F636C6F636B2E6830 +S1136EB03A32313933203A206672657100FFFFFFA0 +S1136EC02E66736C5F636C6F636B2E633A3131397A +S1136ED0203A2028636F6E6669672D3E6C6F6F7071 +S1136EE044697669646572203C3D202875696E7436 +S1136EF033325F742941524D5F504C4C5F444956C4 +S1136F005F53454C5F4D4158292026262028636F46 +S1136F106E6669672D3E6C6F6F704469766964654F +S1136F2072203E3D202875696E7433325F742941A6 +S1136F30524D5F504C4C5F4449565F53454C5F4D36 +S1136F40494E29002E66736C5F636C6F636B2E630E +S1136F503A323933203A2066726163203C3D20285E +S1136F6075696E74385F74295046445F46524143D4 +S1136F705F4D41582026262066726163203E3D20E5 +S1136F802875696E74385F74295046445F465241CF +S1136F90435F4D494E0000002E66736C5F636C6F57 +S1136FA0636B2E633A333036203A2066616C736526 +S1136FB000FFFFFF2E66736C5F636C6F636B2E6361 +S1136FC03A333338203A2028706C6C203D3D206BD6 +S1136FD0434C4F434B5F506C6C5379733229207C84 +S1136FE07C2028706C6C203D3D206B434C4F434B00 +S1136FF05F506C6C53797333290000002E66736CF8 +S11370005F636C6F636B2E633A333533203A2066CB +S1137010616C7365000000002E66736C5F636C6FB7 +S1137020636B2E633A333538203A202866726163E5 +S1137030203E3D202875696E7433325F74295046B2 +S1137040445F465241435F4D494E2920262620285D +S113705066726163203C3D202875696E7433325F2B +S113706074295046445F465241435F4D41582900BC +S11370702E66736C5F636C6F636B2E633A343830C7 +S1137080203A203000FFFFFF2E66736C5F636C6F45 +S1137090636B2E633A31333431203A2028706C6CA0 +S11370A0203D3D206B434C4F434B5F506C6C41750E +S11370B064696F29207C7C2028706C6C203D3D2005 +S11370C06B434C4F434B5F506C6C566964656F293E +S11370D000FFFFFF2E66736C5F636C6F636B2E6340 +S11370E03A31343134203A2066616C736500000013 +S11370F02E66736C5F636C6F636B2E633A3134314D +S113710037203A206672657100FFFFFF2E66736CAC +S11371105F636C6F636B2E633A31343235203A20EF +S11371206E616D6520213D206B434C4F434B5F5294 +S113713065736572766564002E66736C5F636C6F4D +S1137140636B2E633A31353237203A2066616C73B3 +S1137150650000002E66736C5F636C6F636B2E6357 +S11371603A31353330203A206672657100FFFFFFF3 +S11371702E66736C5F636F6D6D6F6E5F61726D2EE3 +S1137180633A313934203A20636F756E74203C3D84 +S11371902055494E5433325F4D41580000000000E1 +S11371A000C0124000001340004013400080134010 +S11371B000C013400000144000C0C5400000C64099 +S11371C00040C6400080C64000C0C6400000C74022 +S11371D00000CA400080004200C000428A333333BA +S11371E033333333333333333333FFFF2E66736C2C +S11371F05F6770696F2E633A3537203A20696E7382 +S113720074616E6365203C2041525241595F534979 +S11372105A4528735F6770696F426173657329000B +S11372202E66736C5F6770696F2E633A3131332059 +S11372303A2070696E203C20333255000000000073 +S113724000C007400000084000400840008008409B +S113725000C0084000000940004009400080094087 +S113726000C0094000000A400040C2400080C24003 +S11372708A565758595A5B5C5D5E5F6061FFFFFF39 +S11372802E66736C5F6C70756172742E633A313262 +S113729033203A20696E7374616E6365203C20412B +S11372A0525241595F53495A4528735F6C70756156 +S11372B0727442617365732900FFFFFF2E66736C5D +S11372C05F6C70756172742E633A323432203A20E6 +S11372D04E554C4C20213D20636F6E66696700005B +S11372E02E66736C5F6C70756172742E633A3234FF +S11372F033203A203055203C20636F6E6669672D39 +S11373003E62617564526174655F4270730000008F +S11373102E66736C5F6C70756172742E633A3234CE +S113732035203A202875696E74385F742946534CA9 +S11373305F464541545552455F4C50554152545F48 +S11373404649464F5F53495A456E28626173652921 +S1137350203E3D20636F6E6669672D3E74784669F2 +S1137360666F57617465726D61726B002E66736C23 +S11373705F6C70756172742E633A323436203A2031 +S11373802875696E74385F742946534C5F464541CD +S1137390545552455F4C50554152545F4649464FEF +S11373A05F53495A456E286261736529203E3D202A +S11373B0636F6E6669672D3E72784669666F5761C2 +S11373C07465726D61726B002E66736C5F6C7075A0 +S11373D06172742E633A353138203A204E554C4C44 +S11373E020213D20636F6E66696700FF2E66736C13 +S11373F05F6C70756172742E633A393137203A20AC +S11374004E554C4C20213D206461746100FFFFFF08 +S11374100000000000C00740000008400040084091 +S11374200080084000C008400000094000400940B6 +S11374300080094000C0094000000A400040C240EA +S11374400080C2402E66736C5F6164617074657203 +S11374505F6C70756172742E633A353332203A2052 +S11374604E554C4C20213D2068616E646C650000D3 +S11374702E66736C5F616461707465725F6C7075A5 +S11374806172742E633A353333203A204E554C4C96 +S113749020213D20636F6E66696700002E66736C61 +S11374A05F616461707465725F6C70756172742E73 +S11374B0633A353334203A20636F6E6669672D3E34 +S11374C0696E7374616E6365203C202873697A6504 +S11374D06F6628735F4C7075617274416461707477 +S11374E065724261736529202F2073697A656F661E +S11374F0284C50554152545F54797065202A2929EB +S1137500000000002E66736C5F61646170746572C4 +S11375105F6C70756172742E633A353335203A208E +S11375204E554C4C20213D20735F4C707561727434 +S113753041646170746572426173655B636F6E660A +S113754069672D3E696E7374616E63655D00FFFF4C +S11375502E66736C5F616461707465725F6C7075C4 +S11375606172742E633A363233203A204E554C4CB5 +S113757020213D2068616E646C6500002E66736C8A +S11375805F616461707465725F6C70756172742E92 +S1137590633A363234203A204E554C4C20213D205B +S11375A064617461000000002E66736C5F61646145 +S11375B0707465725F6C70756172742E633A3632E2 +S11375C035203A206C656E677468203E2030550083 +S11375D00205030007FF0FFF02050300140F09183B +S11375E0020503000F18090D02050300140F091802 +S11375F00205030018090B11020503001018090DF8 +S11376000205030010180B0902050300140F0A18E1 +S1137610020503000910180A020503001018090DD9 +S1137620020503001018090D020503000F181A0DB6 +S1137630020503001018090D020503001018090DB6 +S113764002050300101813140205030010181A1C75 +S11376500205030010181A1C020503001018131465 +S11376600205030010181314020503001018131464 +S11376700205030011090C0F0205030011090C0F88 +S1137680020503001018090D020503001018090D66 +S113769002050300140F0D18020503001018090D4C +S11376A0020503001018090D020503001018090D46 +S11376B0020503001018090D020503001018090D36 +S11376C0020503001018090D020503001018090D26 +S11376D0020503001018090D020503001018090D16 +S11376E0020503001018090D02050300140F0D18FC +S11376F002050300140F0D18020503001018090DEC +S1137700020503001018090D020503001018090DE5 +S1137710020503001018090D02050300140F0D18CB +S113772002050300140F0D18020503001318090DB8 +S1137730020503001318090D020503001318090DAF +S1137740020503001318090D02050300140F131892 +S113775002050300140F1318020503001018090D85 +S1137760020503001018090D02050300171A180B6F +S113777002050300171A180BFFFFFFFFFFFFFFFFAF +S113778002050300171A180B02050300171A180B39 +S113779002050300171A180BFFFFFFFFFFFFFFFF8F +S11377A0020503000C0A1807020503000C0A180757 +S11377B00205030018101A0D0205030018101A0D13 +S11377C002050300140F1A18020503001A0F130D03 +S11377D0020503001A13180D020503001A13180DED +S11377E0020503001A13180D02050300140F1A18DA +S11377F002050300090B0F1C02050300090C111CF0 +S113780002050300090C111C02050300090A111CDE +S113781002050300090A111C020503000C0F0A1CCF +S1137820020503000C0F0A1C020503000C0F0A1CBE +S1137830020503000C0F121C020503000C091218A8 +S1137840020503000D01121A433A5C557365727305 +S11378505C6E786130363534385C446F63756D65C1 +S11378606E74735C4D43555870726573736F4944FD +S1137870455F31312E342E305F363135375F7072CB +S113788063315C776F726B73706163655C65766B93 +S11378906D696D787274313136305F696C65645F1F +S11378A0626C696E6B795F636D375F696E745F528A +S11378B0414D5F4556425C647269766572732F660A +S11378C0736C5F636C6F636B2E683A3231393320AB +S11378D03A206672657100FF0205030007FF0FFF7F +S11378E002050300140F0918020503000F18090DFF +S11378F002050300140F09180205030018090B11EF +S1137900020503001018090D0205030010180B09E5 +S113791002050300140F0A18020503000910180ACF +S1137920020503001018090D020503001018090DC3 +S1137930020503000F181A0D020503001018090DA3 +S1137940020503001018090D020503001018131492 +S11379500205030010181A1C0205030010181A1C53 +S11379600205030010181314020503001018131461 +S113797002050300101813140205030011090C0F6B +S11379800205030011090C0F020503001018090D6C +S1137990020503001018090D02050300140F0D1849 +S11379A0020503001018090D020503001018090D43 +S11379B0020503001018090D020503001018090D33 +S11379C0020503001018090D020503001018090D23 +S11379D0020503001018090D020503001018090D13 +S11379E0020503001018090D020503001018090D03 +S11379F002050300140F0D1802050300140F0D18DF +S1137A00020503001018090D020503001018090DE2 +S1137A10020503001018090D020503001018090DD2 +S1137A2002050300140F0D1802050300140F0D18AE +S1137A30020503001318090D020503001318090DAC +S1137A40020503001318090D020503001318090D9C +S1137A5002050300140F131802050300140F131872 +S1137A60020503001018090D020503001018090D82 +S1137A7002050300171A180B02050300171A180B46 +S1137A80FFFFFFFFFFFFFFFF02050300171A180B9C +S1137A9002050300171A180B02050300171A180B26 +S1137AA0FFFFFFFFFFFFFFFF020503000C0A18079B +S1137AB0020503000C0A18070205030018101A0D2A +S1137AC00205030018101A0D02050300140F1A18FA +S1137AD0020503001A0F130D020503001A13180DF3 +S1137AE0020503001A13180D020503001A13180DDA +S1137AF002050300140F1A1802050300090B0F1CDA +S1137B0002050300090C111C02050300090C111CD9 +S1137B1002050300090A111C02050300090A111CCD +S1137B20020503000C0F0A1C020503000C0F0A1CBB +S1137B30020503000C0F0A1C020503000C0F121CA3 +S1137B40020503000C091218020503000D01121AA4 +S1137B50433A5C55736572735C6E786130363534C4 +S1137B60385C446F63756D656E74735C4D43555832 +S1137B7070726573736F4944455F31312E342E3012 +S1137B805F363135375F707263315C776F726B7358 +S1137B90706163655C65766B6D696D7872743131A3 +S1137BA036305F696C65645F626C696E6B795F63C4 +S1137BB06D375F696E745F52414D5F4556425C6438 +S1137BC07269766572732F66736C5F636C6F636B37 +S1137BD02E683A32313038203A20636F6E66696716 +S1137BE000FFFFFF01000000C8000000FFFFFF0FBF +S1137BF00000000000000000290000000100000057 +S1137C0000A60E00000000000000000003000000B9 +S1077C107200770083 +S1077C1400A4781F2D +S90334B90F diff --git a/tests/nxpimage/data/hab/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bd b/tests/nxpimage/data/hab/export/rt1160_xip_mdk_unsigned/config.bd similarity index 100% rename from tests/nxpimage/data/hab/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bd rename to tests/nxpimage/data/hab/export/rt1160_xip_mdk_unsigned/config.bd diff --git a/tests/nxpimage/data/hab/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec b/tests/nxpimage/data/hab/export/rt1160_xip_mdk_unsigned/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec similarity index 100% rename from tests/nxpimage/data/hab/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec rename to tests/nxpimage/data/hab/export/rt1160_xip_mdk_unsigned/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec diff --git a/tests/nxpimage/data/hab/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bin b/tests/nxpimage/data/hab/export/rt1160_xip_mdk_unsigned/output.bin similarity index 100% rename from tests/nxpimage/data/hab/evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bin rename to tests/nxpimage/data/hab/export/rt1160_xip_mdk_unsigned/output.bin diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/config.bd b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/config.bd new file mode 100644 index 00000000..493a4b0b --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/config.bd @@ -0,0 +1,86 @@ +options { + flags = 0x08; + startAddress = 0x20200000; + ivtOffset = 0x0; + initialLoadSize = 0x2000; + entryPointAddress = 0x20202401; + signatureTimestamp = "04/05/2023 22:21:20"; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_SET_ENGINE; + SetEngine_HashAlgorithm = "sha256", + SetEngine_Engine = "ANY", + SetEngine_EngineConfiguration = "0") +{ +} + +section (SEC_UNLOCK; + Unlock_Engine = "SNVS", + Unlock_features = "ZMK WRITE" + ) +{ +} \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d7f75092 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419897 (0x12345679) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:42 2023 GMT + Not After : May 1 22:08:42 2033 GMT + Subject: CN=CSF1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:bb:3f:d1:a8:e4:c8:53:99:62:e9:83:ab:03:b8: + d1:20:f8:c1:ca:8a:91:a9:85:bc:c7:f1:6f:83:bd: + b3:3e:79:39:52:f5:64:0a:6a:a3:46:90:f5:fb:e7: + 84:80:e8:d5:a7:47:e9:8e:20:42:0c:5c:c4:90:03: + 60:c3:22:d5:96:9c:39:b2:41:36:fd:99:24:4d:52: + 77:63:39:b2:9d:a6:87:c2:60:a3:1a:79:c4:ab:17: + af:b6:88:a7:0a:27:78:2a:39:0b:33:38:24:6c:f8: + b2:6d:2a:50:33:3e:bd:3b:5f:b1:d7:84:43:a7:87: + 95:15:bd:7d:1a:6d:f3:43:df:a6:28:ad:5d:11:aa: + a4:a1:67:e0:70:3f:06:8e:f4:58:6e:45:92:fe:3b: + 66:71:b9:49:2b:74:12:20:2c:2c:1c:84:0d:fe:bc: + 76:a9:58:af:04:d6:2a:34:45:8a:25:04:fe:b9:0f: + 83:2f:76:5f:32:27:a1:29:ca:ac:b4:69:b4:11:75: + c2:4c:fc:13:a3:f0:b8:59:16:6a:5f:9c:99:6e:3b: + 01:c4:7c:da:ad:46:80:de:d6:68:0c:7c:6d:e1:92: + 96:73:01:ab:4b:51:3b:8c:17:6f:ea:ba:58:3c:d3: + dd:c5:29:64:59:70:25:26:24:48:79:cc:b9:a2:ba: + 73:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + C0:37:D2:B0:28:92:CD:2B:8C:29:E9:E0:30:19:29:C3:B5:8A:6E:E5 + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + 08:93:8f:bb:9c:0e:21:70:97:75:2e:c3:c3:f8:a2:95:2f:bf: + 67:35:67:68:7e:c5:ef:7d:b7:6f:fc:ca:61:b9:60:b5:18:9f: + 44:40:ef:01:d7:f6:9d:41:0c:9a:17:8f:d6:aa:ca:01:76:80: + 8f:b4:fd:ef:8a:8e:bb:7c:64:24:32:87:d5:03:e5:8b:1e:ed: + 31:51:48:10:7a:77:81:82:c7:37:ec:0c:b1:97:25:cb:0e:65: + c9:54:6e:90:99:db:06:10:d1:cc:c1:a5:0f:55:4c:53:0b:a4: + 59:ba:64:02:ee:e1:15:ff:34:94:fb:d7:1e:16:44:eb:3b:fc: + af:31:9d:62:d7:08:69:2f:20:50:f6:21:e7:8f:ff:f1:da:e6: + 82:da:36:bc:27:cc:a4:06:db:b1:40:a7:05:ce:7c:fd:21:ef: + 7d:c0:99:79:a4:cb:18:89:ae:bb:ff:e1:82:ad:be:fc:17:b0: + ce:91:8b:7b:9f:56:35:84:a9:48:d7:85:d8:f1:88:ad:49:66: + d8:07:a4:e6:df:d7:3c:bc:1b:19:a3:9e:d3:85:1c:40:48:36: + 74:97:27:5b:5f:7a:8d:e8:47:46:30:6f:4d:5f:27:c6:e1:de: + 1b:27:4a:3e:a6:f5:9d:a3:33:20:e4:60:4d:03:c1:a8:b0:eb: + bf:73:a4:35 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWeTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0MloXDTMz +MDUwMTIyMDg0MlowKjEoMCYGA1UEAxQfQ1NGMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALs/0ajkyFOZ +YumDqwO40SD4wcqKkamFvMfxb4O9sz55OVL1ZApqo0aQ9fvnhIDo1adH6Y4gQgxc +xJADYMMi1ZacObJBNv2ZJE1Sd2M5sp2mh8Jgoxp5xKsXr7aIpwoneCo5CzM4JGz4 +sm0qUDM+vTtfsdeEQ6eHlRW9fRpt80PfpiitXRGqpKFn4HA/Bo70WG5Fkv47ZnG5 +SSt0EiAsLByEDf68dqlYrwTWKjRFiiUE/rkPgy92XzInoSnKrLRptBF1wkz8E6Pw +uFkWal+cmW47AcR82q1GgN7WaAx8beGSlnMBq0tRO4wXb+q6WDzT3cUpZFlwJSYk +SHnMuaK6c58CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFMA30rAoks0rjCnp +4DAZKcO1im7lMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQAIk4+7nA4hcJd1LsPD+KKVL79nNWdofsXvfbdv/MphuWC1 +GJ9EQO8B1/adQQyaF4/WqsoBdoCPtP3vio67fGQkMofVA+WLHu0xUUgQeneBgsc3 +7AyxlyXLDmXJVG6QmdsGENHMwaUPVUxTC6RZumQC7uEV/zSU+9ceFkTrO/yvMZ1i +1whpLyBQ9iHnj//x2uaC2ja8J8ykBtuxQKcFznz9Ie99wJl5pMsYia67/+GCrb78 +F7DOkYt7n1Y1hKlI14XY8YitSWbYB6Tm39c8vBsZo57ThRxASDZ0lydbX3qN6EdG +MG9NXyfG4d4bJ0o+pvWdozMg5GBNA8GosOu/c6Q1 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d487da3f --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419898 (0x1234567a) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:43 2023 GMT + Not After : May 1 22:08:43 2033 GMT + Subject: CN=IMG1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:ba:27:0e:03:0a:53:4f:cb:d3:04:6c:a9:b9:c5: + aa:38:13:b5:b4:c4:e5:9d:60:e3:68:8a:80:c2:d5: + b5:0b:b7:44:2d:82:f5:de:07:c9:f5:d6:05:52:1b: + 16:b7:92:52:83:e8:60:df:eb:bc:22:78:f9:66:73: + 24:26:09:b7:54:51:f0:ff:fa:7f:36:da:d6:21:1d: + ff:2e:eb:f3:94:16:65:97:94:4d:7f:8e:a6:98:93: + 6c:dc:c1:2e:92:8c:d8:de:95:7b:72:93:a7:e9:76: + 38:97:62:dd:1d:83:ff:61:21:db:16:c9:d4:22:aa: + 25:86:75:93:09:2c:3e:b7:f5:21:14:e4:a0:8e:53: + 1e:a3:9b:4c:d2:46:b1:92:9b:84:6c:73:99:d8:cb: + 6d:b6:f2:d5:51:d0:ee:b0:2e:79:48:07:6e:87:6c: + 47:0d:a2:7e:05:46:64:7f:18:16:bb:86:48:e5:84: + 16:c8:5f:15:b7:86:8f:ad:5d:70:59:64:0d:24:17: + c0:a9:4b:cd:08:3e:76:96:67:93:60:46:e3:12:96: + bf:87:7b:34:3b:e4:9c:09:75:1d:c8:67:97:9e:08: + bd:25:59:e3:6a:62:b2:16:62:49:d0:de:99:9c:c7: + 8f:40:9f:ac:fa:7e:ed:38:95:a5:d2:3b:7d:17:d0: + 6e:3d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 33:50:6A:02:FA:C4:D4:4A:0B:DE:0A:9E:45:2A:05:80:BE:FE:DC:CC + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + a8:a6:13:36:28:a2:01:8f:16:58:48:2e:fd:59:86:bf:f0:94: + 90:17:98:a7:39:d8:df:74:a0:46:8d:61:e6:d1:45:60:84:5e: + a9:d0:1d:03:3d:a5:47:85:80:f9:86:a0:80:a6:bf:ce:80:f4: + bc:e7:2d:c3:bd:c6:ae:ef:fc:ae:90:e0:28:dd:b5:85:b7:9d: + 97:b0:93:d6:da:29:c0:21:0a:30:6e:6d:75:50:ff:05:5c:56: + 63:5e:17:aa:fc:56:8c:61:f1:e6:ba:10:d2:06:4a:49:5b:c0: + 78:37:c6:3c:08:6f:3d:f2:c5:2a:04:f6:d7:8a:9c:7f:80:dd: + 1a:29:60:09:97:85:41:d9:e6:c1:72:17:4c:08:48:f4:a0:96: + aa:7b:54:da:d4:91:fe:be:3d:8d:54:20:17:f8:b8:95:1d:cc: + cb:b4:c1:1a:2d:0a:5f:54:7e:db:90:ab:e3:cf:0e:00:00:30: + aa:00:3a:c5:b5:b5:f9:3e:de:0e:04:e6:f8:f0:d3:b5:5a:6a: + 8d:7c:7b:5d:37:da:4e:70:10:1f:eb:f1:93:f1:32:da:99:c1: + 38:fc:f0:52:8b:4c:51:cf:ad:e7:23:af:11:d7:e4:ac:f5:3f: + 18:b9:35:ae:20:d0:65:bc:d8:ad:34:87:f8:0b:93:02:db:a4: + 57:fc:c3:a9 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWejANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0M1oXDTMz +MDUwMTIyMDg0M1owKjEoMCYGA1UEAxQfSU1HMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALonDgMKU0/L +0wRsqbnFqjgTtbTE5Z1g42iKgMLVtQu3RC2C9d4HyfXWBVIbFreSUoPoYN/rvCJ4 ++WZzJCYJt1RR8P/6fzba1iEd/y7r85QWZZeUTX+OppiTbNzBLpKM2N6Ve3KTp+l2 +OJdi3R2D/2Eh2xbJ1CKqJYZ1kwksPrf1IRTkoI5THqObTNJGsZKbhGxzmdjLbbby +1VHQ7rAueUgHbodsRw2ifgVGZH8YFruGSOWEFshfFbeGj61dcFlkDSQXwKlLzQg+ +dpZnk2BG4xKWv4d7NDvknAl1Hchnl54IvSVZ42pishZiSdDemZzHj0CfrPp+7TiV +pdI7fRfQbj0CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDNQagL6xNRKC94K +nkUqBYC+/tzMMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQCophM2KKIBjxZYSC79WYa/8JSQF5inOdjfdKBGjWHm0UVg +hF6p0B0DPaVHhYD5hqCApr/OgPS85y3Dvcau7/yukOAo3bWFt52XsJPW2inAIQow +bm11UP8FXFZjXheq/FaMYfHmuhDSBkpJW8B4N8Y8CG898sUqBPbXipx/gN0aKWAJ +l4VB2ebBchdMCEj0oJaqe1Ta1JH+vj2NVCAX+LiVHczLtMEaLQpfVH7bkKvjzw4A +ADCqADrFtbX5Pt4OBOb48NO1WmqNfHtdN9pOcBAf6/GT8TLamcE4/PBSi0xRz63n +I68R1+Ss9T8YuTWuINBlvNitNIf4C5MC26RX/MOp +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/flashloader.srec b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/flashloader.srec new file mode 100644 index 00000000..4d492907 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/flashloader.srec @@ -0,0 +1,5253 @@ +S02A000065766B6D696D787274313136305F666C6173686C6F616465725F636D375F6F7269672E73726563F1 +S3152020200000D8222001242020B524202019DB2020BE +S31520202010B1242020B1242020B1242020000000003B +S31520202020000000000000000000000000BD24202049 +S31520202030B124202000000000C1242020C5242020F7 +S31520202040C9242020CD242020D1242020D52420207E +S31520202050D9242020DD242020E1242020E52420202E +S31520202060E9242020ED242020F1242020F5242020DE +S31520202070F9242020FD24202001252020052520208C +S3152020208009252020B1242020B1242020B12420205D +S31520202090BDDD2020112520201525202019252020B2 +S315202020A01D252020212520202525202029252020CA +S315202020B02D2520203125202035252020392520207A +S315202020C03D2520204125202045252020492520202A +S315202020D04D252020512520205525202059252020DA +S315202020E05D2520206125202065252020692520208A +S315202020F06D2520207125202075252020792520203A +S315202021007D25202081252020B1242020B124202097 +S31520202110B1242020B1242020B1242020B124202025 +S31520202120B1242020B1242020B1242020B124202015 +S31520202130B1242020B1242020B1242020B124202005 +S31520202140B1242020B1242020B1242020B1242020F5 +S31520202150B1242020B1242020B1242020B1242020E5 +S31520202160B1242020B1242020B1242020B1242020D5 +S3152020217085252020892520208D2520209125202059 +S3152020218095252020992520209D252020B1242020FA +S31520202190B1242020B1242020B1242020B1242020A5 +S315202021A0B1242020B1242020B1242020B124202095 +S315202021B0B1242020B1242020B1242020B124202085 +S315202021C0B1242020A1252020B1242020B124202084 +S315202021D0B1242020B1242020B1242020B124202065 +S315202021E0B124202075022120B1242020B1242020B2 +S315202021F0B1242020B1242020A5252020A925202057 +S31520202200B1242020B1242020B1242020B124202034 +S31520202210B1242020B1242020B1242020B124202024 +S31520202220B1242020B1242020B1242020B124202014 +S31520202230B1242020B1242020B1242020B124202004 +S31520202240B1242020B1242020AD252020B1252020F6 +S31520202250B1242020B5252020B9252020B1242020D6 +S31520202260A9E12020BD252020C1252020C5252020EC +S31520202270C9252020CD252020D1252020B12420206D +S31520202280B1242020B1242020B1242020B1242020B4 +S31520202290B1242020B1242020B1242020B1242020A4 +S315202022A0B1242020B1242020B1242020B124202094 +S315202022B0B1242020B1242020B1242020B124202084 +S315202022C0B1242020B1242020B1242020B124202074 +S315202022D0B1242020B1242020B1242020B124202064 +S315202022E0B1242020B1242020B1242020B124202054 +S315202022F0B1242020B1242020B1242020B124202044 +S31520202300B1242020B1242020B1242020B124202033 +S31520202310B1242020B1242020B1242020B124202023 +S31520202320B1242020B1242020B1242020B124202013 +S31520202330B1242020B1242020B1242020B124202003 +S31520202340B1242020B1242020B1242020B1242020F3 +S31520202350B1242020B1242020B1242020B1242020E3 +S31520202360B1242020B1242020D5252020D925202085 +S31520202370B1242020B1242020B1242020B1242020C3 +S31520202380B1242020B1242020DD252020E125202055 +S31520202390E5252020E9252020B1242020B124202035 +S315202023A0ED252020F1252020B1242020B124202015 +S315202023B0B1242020B1242020B1242020B124202083 +S315202023C0B1242020B1242020B1242020B124202073 +S315202023D0B1242020B1242020B1242020B124202063 +S315202023E0B1242020B1242020B1242020B124202053 +S315202023F0B1242020B1242020B1242020FFFFFFFF5C +S3152020240072B61248124988604FF000024FF000033E +S315202024104FF000044FF000054FF000064FF0000764 +S31520202420B846B946BA46BB46BC460A4885460A48F7 +S3152020243080470A4880470A48804762B64FF0000006 +S315202024404FF00001074A9047FEE700000020202099 +S3152020245000ED00E000D82220B1F32020B53720203F +S31520202460213820209DDB202072B60A480A490160A7 +S315202024700A6882F30888094880470949094A0A4B8D +S315202024809A42BEBF51F8040B42F8040BF8E762B615 +S315202024900648804708ED00E000202020B1F32020C8 +S315202024A02C5C212000002220F00B22209DDB2020E6 +S315202024B0FFF7FEBF4F4800474F4800474F48004789 +S315202024C04F4800474F4800474F4800474F4800474E +S315202024D04F4800474F4800474F4800474F4800473E +S315202024E04F4800474F4800474F4800474F4800472E +S315202024F04F4800474F4800474F4800474F4800471E +S315202025004F4800474F4800474F4800474F4800470D +S315202025104F4800474F4800474F4800474F480047FD +S315202025204F4800474F4800474F4800474F480047ED +S315202025304F4800474F4800474F4800474F480047DD +S315202025404F4800474F4800474F4800474F480047CD +S315202025504F4800474F4800474F4800474F480047BD +S315202025604F4800474F4800474F4800474F480047AD +S315202025704F4800474F4800474F4800474F4800479D +S315202025804F4800474F4800474F4800474F4800478D +S315202025904F4800474F4800474F4800474F4800477D +S315202025A04F4800474F4800474F4800474F4800476D +S315202025B04F4800474F4800474F4800474F4800475D +S315202025C04F4800474F4800474F4800474F4800474D +S315202025D04F4800474F4800474F4800474F4800473D +S315202025E04F4800474F4800474F4800474F4800472D +S315202025F04F480047B524202019DB2020BD24202049 +S31520202600C1242020C5242020B1242020B12420200C +S31520202610B1242020B1242020B1242020B124202020 +S31520202620B1242020B1242020B1242020B124202010 +S31520202630B1242020B1242020B1242020B124202000 +S31520202640B1242020B1242020B124202005F22020CE +S3152020265025F2202045F2202065F2202085F2202018 +S31520202660A5F22020C5F22020E5F2202005F3202007 +S3152020267025F3202045F32020B1242020B12420201A +S31520202680B1242020B1242020B1242020B1242020B0 +S31520202690B124202075EF202089EF20209DEF2020B7 +S315202026A0B1EF2020C5EF2020B1242020B1242020E6 +S315202026B0B1242020B1242020B1242020B124202080 +S315202026C0B1242020B1242020B1242020B124202070 +S315202026D0B1242020B1242020B1242020B124202060 +S315202026E0B1242020B1242020B1242020B124202050 +S315202026F0B1242020558120206D812020B124202026 +S31520202700B1242020B1242020B1242020B12420202F +S31520202710B1242020B1242020B1242020B12420201F +S31520202720B1242020B1242020B1242020B12420200F +S31520202730B1242020002A01D101207047F0B41F4661 +S31520202740034603242340002B09D00424E31A0170D6 +S3152020275001300824E141013A26D0013BF7D1042A51 +S315202027601ADB13D0002F11D00C460D460E46102A08 +S3152020277002DB72C0103AFAE70C2A02DB32C00C3A8E +S31520202780FAE7082A02DB12C0083AFAE7042A03DB12 +S3152020279001600430043AF9E7002A05D0017001309F +S315202027A00824E141013AF7D1F0BC00207047C04609 +S315202027B053B94AB9002908BF00281CBF4FF0FF3162 +S315202027C04FF0FF3000F074B9ADF1080C6DE904CE5E +S315202027D000F006F8DDF804E0DDE9022304B07047B6 +S315202027E02DE9F047089D04468E46002B4DD18A427E +S315202027F0944669D9B2FA82F252B101FA02F3C2F1B1 +S31520202800200120FA01F10CFA02FC41EA030E944041 +S315202028104FEA1C48210CBEFBF8F61FFA8CF708FB62 +S3152020282016E341EA034306FB07F199420AD91CEB3A +S31520202830030306F1FF3080F01F81994240F21C816C +S31520202840023E63445B1AA4B2B3FBF8F008FB1033B4 +S3152020285044EA034400FB07F7A7420AD91CEB0404E9 +S3152020286000F1FF3380F00A81A74240F207816444B9 +S31520202870023840EA0640E41B00261DB1D44000233E +S31520202880C5E900433146BDE8F0878B4209D9002DA2 +S3152020289000F0EF800026C5E9000130463146BDE82C +S315202028A0F087B3FA83F6002E4AD18B4202D3824296 +S315202028B000F2F980841A61EB030301209E46002D45 +S315202028C0E0D0C5E9004EDDE702B9FFDEB2FA82F29A +S315202028D0002A40F09280A1EB0C014FEA1C471FFAF8 +S315202028E08CFE0126200CB1FBF7F307FB131140EADF +S315202028F001410EFB03F0884208D91CEB010103F1AC +S31520202900FF3802D2884200F2CB804346091AA4B26D +S31520202910B1FBF7F007FB101144EA01440EFB00FE41 +S31520202920A64508D91CEB040400F1FF3102D2A645A6 +S3152020293000F2BB800846A4EB0E0440EA03409CE745 +S31520202940C6F12007B34022FA07FC4CEA030C20FAF2 +S3152020295007F401FA06F31C43F9404FEA1C4900FA12 +S3152020296006F3B1FBF9F8200C1FFA8CFE09FB18118F +S3152020297040EA014108FB0EF0884202FA06F20BD902 +S315202029801CEB010108F1FF3A80F08880884240F252 +S315202029908580A8F102086144091AA4B2B1FBF9F096 +S315202029A009FB101144EA014100FB0EFE8E4508D991 +S315202029B01CEB010100F1FF346CD28E456AD9023816 +S315202029C0614440EA0840A0FB0294A1EB0E01A142FB +S315202029D0C846A64656D353D05DB1B3EB080261EB69 +S315202029E00E0101FA07F722FA06F3F1401F43C5E943 +S315202029F0007100263146BDE8F087C2F12003D84079 +S31520202A000CFA02FC21FA03F3914001434FEA1C47BA +S31520202A101FFA8CFEB3FBF7F007FB10360B0C43EAAC +S31520202A20064300FB0EF69E4204FA02F408D91CEB5C +S31520202A30030300F1FF382FD29E422DD9023863445A +S31520202A409B1B89B2B3FBF7F607FB163341EA0341FA +S31520202A5006FB0EF38B4208D91CEB010106F1FF3849 +S31520202A6016D28B4214D9023E6144C91A46EA004640 +S31520202A7038E72E46284605E70646E3E61846F8E6D2 +S31520202A804B45A9D2B9EB020864EB0C0E0138A3E71B +S31520202A904646EAE7204694E74046D1E7D0467BE7FC +S31520202AA0023B614432E7304609E76444023842E774 +S31520202AB0704700BF000000000238002138B5C4B29C +S31520202AC02DED028B204611F0CCFD302105462046E7 +S31520202AD011F0C7FD202108EE100A204611F0C1FD75 +S31520202AE007EE900AB8EE488B05F07F03B8EE675BB9 +S31520202AF0012006EE103AC5F3426585EE087B00FAE2 +S31520202B0005F5B8EEC66BBDEC028B37EE066B9FED56 +S31520202B10087B26EE076B07EE905AB8EEE77B86EE0B +S31520202B20075BFCEEC57B17EE900A38BDAFF300801D +S31520202B300000000060E376412DE9F04F0F46016E3C +S31520202B4016463B4AC1F3C26185B0032E0546515C29 +S31520202B50B3FBF1F24FF00003019244D101242EA1C0 +S31520202B60D1E90001FFF724FE019A804689460023F9 +S31520202B702BA1D1E90001FFF71BFE8346B845019A18 +S31520202B8079F100033FD22B4B0134FF214FF0FF393F +S31520202B90A4FB034A4FF0000801910293002320460C +S31520202BA051460392FFF704FEB842039A71F10003BF +S31520202BB006D3C31B994582BF99468346CDF8048008 +S31520202BC008F10108B8F5807F06D0029BE4184AF167 +S31520202BD0000AB9F1000FE1D128463246019911F0B9 +S31520202BE0E4FD584615E010A1D1E90001FFF7E0FDEC +S31520202BF0019A8046894600230F483B210024FFF76F +S31520202C00D7FD8346BAE728463246002111F0CDFD6E +S31520202C10404605B0BDE8F08F0094357700000000CF +S31520202C2000CA64D63B00000000CA9A3B0000000080 +S31520202C30DF5B212000CA9A3B0000CA9A2DE9F04F7B +S31520202C400D461F46CB0989B049000446059201F05E +S31520202C501E01039341EAD51A002800F0FA808368E2 +S31520202C604FEA8A1803EB8A1393F8386016F0010688 +S31520202C7000F0F18090F89630A3B907F57F5307A886 +S31520202C803F33B3F5804F2CBF4FEA93394FF00109DC +S31520202C9011F01EFE94F894C0CC4507D20226079840 +S31520202CA011F01BFE304609B0BDE8F08F4FF0000929 +S31520202CB0D4F810E004EB8A01CB46DEF80020B7F5E5 +S31520202CC0804F02983B460192724628BF4FF480439C +S31520202CD00497BBF1000F08BF1046DDF804E00CF185 +S31520202CE0FF3CFF1A02904FF001005FFA8CFC106027 +S31520202CF04FF000005060059858449060906800F589 +S31520202D00805020F47F6020F00F00D060D06800F53E +S31520202D1080501061106900F580505061506900F58F +S31520202D2080509061506863F31E405060D069D2F87D +S31520202D3008A063F31E30CAF30B0AD06120F00040AE +S31520202D4020F47F6020F00F0040EA0A00D06103D1F2 +S31520202D50506840F40040506050684FF0800A9B44F1 +S31520202D606AF307005060486D00283BD002604A6510 +S31520202D70002FA2D1019A84F894C0226115F00F0267 +S31520202D801CD10399D1B1A16801EB080090F8380035 +S31520202D90800713D5049888B1C88E98420ED951F849 +S31520202DA00800C0F30A40B3FBF0FC00FB1C332BB910 +S31520202DB051F8083067F35D7341F80830ED08012398 +S31520202DC005F01005154303FA05F5B9F1000F21D1B9 +S31520202DD06368D3F8B0212A4208D00798002611F03C +S31520202DE07CFD5FE7B1464A614A65C1E7D3F84021B9 +S31520202DF042F48042C3F84021D3F8B811D3F84021B9 +S31520202E005204F3D5D3F840210D4222F48042C3F850 +S31520202E104021E2D1A3689844029BC8F808300023B9 +S31520202E20C8F80C30BFF34F8F0C4A6368C3F8B051F3 +S31520202E30D3F8B8112942D0D1013A03D1079811F0FD +S31520202E404CFD2FE7D3F8BC112942C6D1C3F8B05187 +S31520202E50EEE7032626E7012624E700BF8096980082 +S31520202E602DE9FF4702EB4109002641EAC21105461A +S31520202E7000EB8908DFF8B4A04FEA8919D8F8144066 +S31520202E80CFB224F01F04CDE9016614B904B0BDE801 +S31520202E90F087019B3BB9A368A28B03EA0A03C2F3FE +S31520202EA00B021343019363681A0638D4E2696168DA +S31520202EB0C2F31233029AC1F30E415B1A1344D8F897 +S31520202EC054200293D8F8143093422BD1C8F814609A +S31520202ED00122C8F85460AB684B449A60DE60636870 +S31520202EE01B0404D4D8F8143033F01F0309D101A9C8 +S31520202EF028688DF80C708DF80D600EF000FBCDE95A +S31520202F0001662B696660236095F894302C61013325 +S31520202F1085F89430D8F8144024F01F04B5E74FF0F4 +S31520202F20FF33CCE71B68C8F81430D8E700F0FFFF42 +S31520202F302E4BF7B5861E0093A3F5804317460193A3 +S31520202F40F3B2012B4BD82A4A15781DB15378002B82 +S31520202F5047D101250124DFF8A0C02B4654559C24B7 +S31520202F60244A0CEB452C04FB0524C4F80CC084F819 +S31520202F70970002A8DFF884C000EB86060CEBC52557 +S31520202F80A56056F8085CD5F84001656040F002003F +S31520202F90C5F84001D5F8404114F00204FAD19C200E +S31520202FA0D5F82461434306F01F0C16F0180F02EBC8 +S31520202FB0030080F895C016D0D150D5F8A83123F03B +S31520202FC00303C5F8A831D5F8A83143F00203C5F884 +S31520202FD0A8310DF027FC3860204603B0F0BD06202E +S31520202FE0FBE70320F9E70120F7E700BF0000434075 +S31520202FF030C4222028242220002022200010222013 +S31520203000E8B1104B984213D10F4B00221A70436817 +S315202030100020C3F84801D3F8402122F00102C3F84A +S315202030204021D3F8402142F00202C3F840217047C4 +S315202030309C33984202BF044B00225A70E7E70320B4 +S31520203040704700BF2824222030C422202DE9FF47A4 +S315202030504FEAD10801F00F034C000F4608F0100864 +S31520203060054604F01E0448EA03034FF0010844EA0B +S31520203070D11408FA03F8002800F085806846002637 +S3152020308011F026FC4FF0FF330FFA84FE05EB840463 +S31520203090626922F01F02CDE9016313468BB91946D6 +S315202030A01E46DFF8E8909C469AB901B10193AB6899 +S315202030B003EB8E1E0123CEF808300023CEF80C30E9 +S315202030C050E0D97F41F08001D9771B6823F01F0378 +S315202030D0E4E792F91F00002842DA5068000627D438 +S315202030E03BB99168938B01EA0901C3F30B030B4388 +S315202030F00121D4F814A0606D82452BD1C4F814C0C8 +S31520203100C4F854C05068000428D4606930F01F00E9 +S3152020311008BF01262869C2F804C010602A6195F8E4 +S315202031209420013285F89420626922F01F02BBE7A1 +S315202031306868D0F8B4A14AEA080AC0F8B4A1D0F841 +S31520203140B4A11AEA080FFAD1D0F8B8A11AEA080FC2 +S31520203150EFD1C5E7DAF800006061D3E70126D9E789 +S3152020316001B10193009811F0B8FB46B1002601A9C0 +S3152020317028688DF80C708DF80D600EF0C0F9304659 +S3152020318004B0BDE8F0870326F9E700BF00F0FFFF73 +S315202031904B682DE9F04101338AB04FF000080546EF +S315202031A00E4617468DF80F80CDE9048803D10520D9 +S315202031B00AB0BDE8F081002AF9D0946806210DF1E5 +S315202031C00F020EF071FA317A002900F08F80736891 +S315202031D0082BECD13268002AE9D053886380938863 +S315202031E0A380D388E38050786070127812F01C0F69 +S315202031F0227008D0802128460EF038FA41462846EB +S315202032000EF034FAD3E712F060011CD10C280FD926 +S315202032100520059B1BB1049B002B08BF052005AB71 +S31520203220024621462846009304AB0EF0C4F8BFE799 +S315202032304D4B53F82060002EEAD005AB04AA214638 +S315202032403846B047E5E7002B2FD012062DD420296B +S315202032501CD10022012128460694079206AA8DF821 +S31520203260241008930EF051FC089B0593079B04938A +S315202032700028CDD1E3880021059A2846934238BFDD +S315202032800593DDE904230EF0AFF991E74029BFD15C +S3152020329000221321284606940792012208938DF8AE +S315202032A0242006AA0EF060FCDEE720290FD100227A +S315202032B0012128460694079206AA8DF82410089301 +S315202032C00EF023FC089B0593079B0493A1E7402936 +S315202032D09ED1002213212846069407920122089384 +S315202032E08DF8242006AA0EF03FFCEBE79DF80F3040 +S315202032F0032B0AD16378052B7FF459AF05AB04AA9B +S31520203300214638460DF0D0FF52E77268002A3FF456 +S315202033104EAFE388002B3FF44AAF94F90000237880 +S315202033200028FFF644AF03F06003202B0BD133682F +S3152020333028468DF824100121089206AA0793069480 +S315202033400EF0E3FB6BE7402B0BD1336828468DF834 +S3152020335024101321089206AA079306940EF004FC43 +S315202033605DE705205BE700BF504C212070B5124B4E +S3152020337086B08026054603AAADF80660CDE903313E +S31520203380402301A9ADF804300123ADF808300EF012 +S315202033902FF9044660B98DF8060003AA01A928460C +S315202033A00EF026F9044618B1314628460EF03FF98C +S315202033B0204606B070BD00BF913120202DE9F7436D +S315202033C0064689469046002A62D0354F01A811F03C +S315202033D07FFA3D681DB197F8CD30B34207D0D7F894 +S315202033E0D03001985BB197F89D31B34252D1012656 +S315202033F0019811F072FA304603B0BDE8F083003D03 +S3152020340018BF0125D02404FB057484F8CD6011F063 +S3152020341064FA0023C4F808902246994684F8CD60A1 +S3152020342084F8CC3084F8CF30013382F81490102BD6 +S31520203430C2E9039902F10C02F6D1B31E012B0ED953 +S3152020344001A8062611F044FAD02301985D437B1962 +S3152020345047F8059083F8CD9011F03FFACBE7114B32 +S315202034603046224621466360D023C8F8004003FB1D +S3152020347005756B681B689847064628B120460EF0CE +S3152020348094F8C8F80090B6E7022385F8CE30B2E744 +S315202034900326B0E7002DB5D0022611F01EFAAAE7A2 +S315202034A060252220844C21202DE9F043037F87B0FC +S315202034B004461BB9012007B0BDE8F0834268926814 +S315202034C051799942F6D31268002AF3D003F100539A +S315202034D00C27013B02EBC30612F8335000239D42F2 +S315202034E0E8D907FB03F270688118825C032A49D148 +S315202034F00D7A00239D423BD80026CB786377002E79 +S31520203500D8D000250120DFF880802F46DFF87C9058 +S31520203510A6603379AB42CED90623B1688DF80870E0 +S315202035206B430135CA1810798DF80900CB5C2068C9 +S315202035308DF80630DB0951886FF00103ADF80410B1 +S3152020354001A9527818BFE3608DF8072003AA19BF76 +S3152020355084F823702761636184F824700ABFA761E9 +S31520203560CDF80C90CDF80C8004940EF041F8D0E7DD +S315202035701A01486800EB0316805CA27F9042BCD0DB +S315202035800133B7E70133AAE76D1721204D172120F4 +S3152020359070B50A4C0E46154623685BB9214600F0C5 +S315202035A075F830B923683BB1FF2366602077A3776F +S315202035B02C6070BD0220FCE70320FAE7002722209A +S315202035C037B5044601A80D4611F082F90B4B1A682F +S315202035D0944208D01A69019894420DD011F07DF9B1 +S315202035E0042003B030BD002203EB021301982B6088 +S315202035F011F073F90020F4E70122F5E7282722208D +S3152020360037B5044601A80D4611F062F90D4B1A680C +S3152020361012B19A7BA2420AD01A6912B19A7FA2428B +S315202036200ED0019811F059F9042003B030BD0022A4 +S3152020363003EB021301982B6011F04FF90020F4E7D9 +S315202036400122F5E72827222013B5044601A811F0E8 +S315202036503FF90D4A136813B1937BA34209D013690E +S3152020366013B1937FA3420DD0019811F036F902B001 +S3152020367010BD00230021180102EB031311505960BD +S315202036809973F1E70123F5E72827222037B5044649 +S3152020369001A80D4611F01CF90B4A136813B1917B32 +S315202036A0A1420AD0136913B1927FA24205D0019874 +S315202036B011F013F9042003B030BD01982B6011F0CE +S315202036C00CF90020F7E700BF282722202DE9F34711 +S315202036D005460C469046002A5ED000295CD04B68D1 +S315202036E0002B59D0304F01A811F0F2F83B6813B1C6 +S315202036F0BA7BAA4205D03A69019852B1BA7FAA422A +S315202037004CD10124019811F0E8F8204602B0BDE8FA +S31520203710F087003B18BF0123244A07EB03164FEA04 +S31520203720031902EBC303B573B36011F0D6F87460A6 +S3152020373032461F492846FFF741FE044638B157F83E +S3152020374009000DF032FF2846FFF77EFFDDE782468F +S315202037504FF00C0973685FFA8AF11A7A8A4217D9D0 +S3152020376009FB01F7196839448B681B79012B03D192 +S315202037700A1D2846FFF70CFF7368196839448B68A1 +S315202037801B7913B90A1D284698470AF1010AE1E751 +S315202037903368C8F80030B8E70424B6E7002BBBD03E +S315202037A0022411F09AF8B0E7282722204827222041 +S315202037B0691B2120114B124A12499A60124B9942B9 +S315202037C009D1124A0021124B9B1A73B91149124A68 +S315202037D0521A72B97047114AD21A002AF1D013F818 +S315202037E0010B013A01F8010BF7E7013B02F8011B17 +S315202037F0EBE7013A01F8013BEBE700BF00ED00E0E3 +S3152020380000202020000022202C5C212000102220B5 +S31520203810C4C6222000C8222000C822201C682120BD +S31520203820114B4FF0FF32C3F88020C3F88420C3F811 +S315202038308820C3F88C20C3F89020C3F89420C3F89E +S315202038409820C3F89C20C3F88021C3F88421C3F88C +S315202038508821C3F88C21C3F89021C3F89421C3F87A +S315202038609821C3F89C21704700E100E038B5084D27 +S315202038700446284611F02CF8236801332360286853 +S3152020388011F02BF82368002BFCD1012038BD00BF76 +S315202038905827222038B5064D0446284611F018F818 +S315202038A02368013B23602868BDE8384011F015B80D +S315202038B058272220014811F00BB800BF5827222074 +S315202038C0014B186811F009B858272220013910B564 +S315202038D007292FD8DFE801F004162E22222E2214C3 +S315202038E05368013B03330BD8134B18688369002B8D +S315202038F006DD90F81A34012B02D11830FFF7CAFFC3 +S31520203900002018E053685A1E0332F9D80A4A106854 +S31520203910C3610123143000F8083CEFE7064C002150 +S31520203920206814300EF079F92068002118300EF026 +S3152020393074F9E5E7052010BD5C272220012938B53A +S315202039400C460FD1084D4FF47E73286880F81A1440 +S3152020395000F12002022180680EF0BCF82B6883F843 +S315202039601B4438BD0020FCE75C27222059B9074B91 +S31520203970022118684FF47E7380F81C2400F120025F +S3152020398080680EF0A7B80020704700BF5C27222051 +S31520203990014B1860002070475C272220024B1860BC +S315202039A000238360184670475C272220087A20B996 +S315202039B0034B0B604C234B6070470520704700BF9C +S315202039C0EB0A2220024B00200B6012234B6070470B +S315202039D0D90A2220087A20B9034B0B6029234B6071 +S315202039E070470520704700BFB00A2220887A0E4BE8 +S315202039F010B520B91A685B680A604B6010BD9B68B9 +S31520203A000C891A8994420CD103280AD81A6800B244 +S31520203A105B6852F8202053F8203000200A604B6043 +S31520203A20ECE70520EAE700BF440022200229174BB5 +S31520203A301748184930B516D10322F82483F82020B8 +S31520203A40DC7783F8212083F8272083F8264083F803 +S31520203A5028204FF47E73438003814FF400734B80DC +S31520203A600B81002030BD40220025012483F82050E0 +S31520203A70DA7783F8214083F8275083F8262083F8A5 +S31520203A802840428002814A800A81EAE7B00A222021 +S31520203A90980A2220A40A2220F8B5044608B9042030 +S31520203AA0F8BDC07800F0F003B02BF8D110F00F0647 +S31520203AB0F5D123782F2B4FEA1315F0D860680AF01A +S31520203AC03DF80028EBD0AB016068803300EBD300B3 +S31520203AD0DF080AF033F80028E1D0084D20233A46A3 +S31520203AE0616805F10C00AB6010F07EFF63783046EC +S31520203AF02F6003F003036B60D2E700BF64272220E8 +S31520203B00F7B50D460446A0B199B10B4F5822002196 +S31520203B1007F12C06304610F075FF384600953346BF +S31520203B207A6850F80C1B00F033F900B9266003B0F0 +S31520203B30F0BD0420FBE700BF64272220194BD3F8D1 +S31520203B40D82F03F58033C2F30332F0B50132D3F8F0 +S31520203B50BC4F00256B0024FA03F313F0030304D093 +S31520203B6001359542F6D30120F0BD0E4A841C05EB83 +S31520203B700030012652F83470000107F00F0700F1BB +S31520203B8080441044BE40FF2200F5853004F58A0487 +S31520203B90C4F8043AC66083601846C4F8042A0D6027 +S31520203BA0E2E700BF00004440120200EB014102F48C +S31520203BB070622DE9F04142EA0343069A01F58534E5 +S31520203BC01343C4F8E43107F02FFB054612480E466E +S31520203BD007F038FB07468846D4F8EC31C3F3813307 +S31520203BE0012B08D0D4F8EC3113F4704F14BF0120E8 +S31520203BF00020BDE8F08107F017FB0A4657EA0801A6 +S31520203C000346E9D05B1B62EB0602BB4272EB08033C +S31520203C10E2D30520EDE700BFA08601002DE9F3477A +S31520203C20DFF87C8005460E461746D8F8D84F4FF049 +S31520203C30000A08EB0049C4F30904013405230022B5 +S31520203C402946174800935346FFF7AEFFE8B909F5F2 +S31520203C508532D2F8EC31C3F38113032B08D1D2F865 +S31520203C60EC3103F00F03B34215D00AF1010A09E023 +S31520203C7073B9012332462946404600935346FFF71F +S31520203C8093FF10B95445D9D8012002B0BDE8F0875A +S31520203C90012BEAD1F6E75445F6D9C7F800A0F4E778 +S31520203CA0000044402DE9F843054607F0BDFA0646B4 +S31520203CB035480F46354C07F0C5FA80468946D5F853 +S31520203CC0D43F9A0703D5D5F8D43FDB0709D5A36877 +S31520203CD005EB034303F580335B69C3F30903002B0C +S31520203CE03FD1D4E904324FF00008C3E90088E368C5 +S31520203CF01A60BFF34F8FBFF36F8FA368012205EBA6 +S31520203D00034303F58033DA6107F08EFA06464046F0 +S31520203D100F4607F097FA81468846A36805EB0343AA +S31520203D2003F58033DB6BC3F309035BB907F07CFA19 +S31520203D3059EA0802F1D0831B61EB07014B4571EB51 +S31520203D400803EAD3236962691968914217D00120B2 +S31520203D50A36805EB0345012305F580356B63BDE894 +S31520203D60F88307F061FA58EA0902A8D0831B61EB91 +S31520203D700701434571EB0903A1D30520E8E75868DD +S31520203D80003818BF0120E3E7A0860100E82722207B +S31520203D902DE9F04F87B0AE4D91461F46109A00234D +S31520203DA0AC4E884613608246AB60AB4BC5E90063B8 +S31520203DB0002800F09781002F00F0948121F008033D +S31520203DC0102B02D0202940F08D81B9F1030F00F26B +S31520203DD0898148F210033361BFF36F8FBFF34F8F72 +S31520203DE09E49A868FFF7AAFE044600287BD10A1D13 +S31520203DF0A868296AFFF712FF0446002873D198493C +S31520203E00A868FFF79BFE044600286CD10A1DA868E7 +S31520203E10A96AFFF703FF0446002864D1D6F8DC1FE1 +S31520203E204FF480636A6AC1F3024103FA01F15143D8 +S31520203E3001F5201101F5007C01F5807001F11002B9 +S31520203E40E960C5F81CC06861D6F8DC6F2A61C6F324 +S31520203E50024603FA06F6EB6A73432E6803F520130F +S31520203E60AB617368AD6813F4002F05F1010C4FEA9E +S31520203E700545CDE90414CDE9022438D022460B4647 +S31520203E8006EB0C4C7419CCE9002304F58034029BF4 +S31520203E90C4E908233544012305F58035EB60EB6220 +S31520203EA06B6D43F001036B65D6F8C036DA0731D443 +S31520203EB06C4B01F59271884227D1D6F800363046D0 +S31520203EC043F48053C6F80036FFF7ECFE044650B97B +S31520203ED0D6F8C036DB0703D5D6F8C0365D0019D410 +S31520203EE0D6F8C0360124204607B0BDE8F08F06EB71 +S31520203EF00C4CDDE90434CCE900347319DDE902BC2D +S31520203F0003F58033C3E908BCC4E753F8042B40F8F3 +S31520203F10042BD0E74E4D6B685A69120A02F00B012A +S31520203F200B2903D002F00F020D2ADBD1A9F10202C0 +S31520203F30012A66D95A6812F4005240F0A48091458D +S31520203F4011D01A689105CDD45A6B9205CAD45A68D5 +S31520203F5009F0030942F400525A60DA6B22F0030278 +S31520203F6042EA0902DA6342465146A869002410F043 +S31520203F703BFDA9682E688B1C56F83320AB6A03EBD1 +S31520203F80013302F00F01012206EB03138A4021465A +S31520203F9003F5803003F58533C0F8044ADA6008F14A +S31520203FA030029C604BF208030292C0F8043AE8697A +S31520203FB010F028FD6B692C49029A51F8040B1851F0 +S31520203FC00434242CF9D118691FFA88F1274C83F858 +S31520203FD00A80204002920843996918612140A869E5 +S31520203FE0586190B2014330469961E969D961FFF75A +S31520203FF059FE029A0446002849D00023109A1360BD +S3152020400071E7DA6B140795D41A68D0073FF56AAFA3 +S315202040105A6BD1073FF566AFDA6C120728D4DA6BD4 +S3152020402042F00402DA63BFF34F8FBFF36F8F5A68D3 +S3152020403042F480525A60DA6B1407FCD5DA6B42F0D0 +S315202040401002DA63DA6B10077FF54CAF72E700BFF8 +S31520204050E8272220000044400000C94008282220CA +S3152020406010282220C04C21209C4C21200000FFFF1C +S315202040701D4A5A66DA6C42F00802DA64DA6C1607B0 +S315202040803FF530AFCBE7DA6B02F0030257E7812307 +S3152020409008F13806F87107F108003B704123BE70FD +S315202040A0FB70662387F806803B7155237B71330A84 +S315202040B07B700327E96910F097FC109B1E6023462E +S315202040C02E68009730462A6AA968FFF76DFD0028DA +S315202040D07FF409AF00972346AA6A3046A968FFF7DE +S315202040E063FD00E70424FEE666617341014B03600D +S315202040F000207047F9402020436A5A8959688282D5 +S31520204100DA68023A4260064A914206D11B7A012B8E +S3152020411003D8044B03600020704742F27570704725 +S3152020412053544D50291C21207FB5B0F85A200446DF +S31520204130144E1301316803F470638D6843EA122309 +S31520204140426AD0E91701A8470546B8B933681B69E2 +S315202041509847054690B904F11C001022616A019007 +S3152020416009F03EF803A9019809F050F8039B626EE6 +S315202041709A420ABF044B42F27A752360284604B03D +S3152020418070BD00BF70092220BD1C2120F7B500F18B +S315202041901C060446416A102230461A4F09F020F8A0 +S315202041A0B4F85A2039681301E06D8D68102103F484 +S315202041B0706343EA1223626AA847054648B9E36D2D +S315202041C01033E365236E103B102B236604D90E4B48 +S315202041D02360284603B0F0BD0BB10C4BF8E73B68B3 +S315202041E01B69984705460028F3D101A9304609F0D6 +S315202041F00DF8626E019B9A4201D1054BE8E742F207 +S315202042007A75E6E7700922208D4120202941202039 +S31520204210BD1C2120D0E90132934208D99B1A8266FF +S315202042204360044B0360012383600020704742F2E1 +S3152020423078707047BD1C212010B504461C3010F024 +S31520204240ACF9044A216E0020034B102998BF13464F +S31520204250236010BD294120208D412020034B1B683F +S31520204260D0E91812DB68C06D184700BF70092220DC +S31520204270B0F85A301A0113F0010F02F4706242EAA4 +S31520204280132214BF08230423042A05D100F1600237 +S31520204290C16D024806F002BE0420704700C0CA4005 +S315202042A0B0F85A309A071BD41A0102F4706242EAF7 +S315202042B01322DB070ED5B2F5807F09D040F20113F9 +S315202042C09A4203D0092A0BD100F0BEBE03F0BABC15 +S315202042D002F0C0BB034B1B68D0E917019B69184726 +S315202042E0042070477009222013B50446B0F85A00DE +S315202042F0030103F4706343EA1020092805D1E06DF9 +S3152020430002B0BDE810400DF074BD030A012B0FD179 +S3152020431001A900F075FF48B9064B1421019A9B6824 +S31520204320E06D01FB02331B691B69984702B010BD63 +S315202043300420FBE77009222010B5054C70220021AD +S31520204340204610F05FFB034B0020236010BD00BFEA +S315202043502C282220ED40202009480A4BC26843629F +S3152020436032B103699A4208D00133036103681847A2 +S31520204370836E002BFAD0013B83660020704700BF56 +S315202043802C282220182822202DE9F0410024074617 +S315202043900E46104DA046B44201D1002009E02B69DB +S315202043A0C3F110032344A3420CD0A64203D142F2E8 +S315202043B07D70BDE8F0812A69511C2961395D01345F +S315202043C0A954F0E7C5F81080FFF7C6FF0028E2D0F1 +S315202043D0EFE700BF182822202DE9F041DFF894804E +S315202043E0D8F800301B699847044618BB1E4D95F80F +S315202043F05960042E21D1EF6D384609F09FFBB8B1C4 +S31520204400204609F033FCB5F85A309B070ED52B6E83 +S3152020441063B1D8F8042011688B4220D35268013228 +S3152020442093421CD883F3088883F30988686EB8479B +S3152020443042F27E742046BDE8F081082E11D102205A +S3152020444009F014FCBFF34F8F0849094BCA6802F4C0 +S31520204450E0621343CB60BFF34F8F00BFFDE73446A6 +S31520204460E8E742F27B74E5E72C28222000ED00E0E5 +S315202044700400FA057009222038B50B4BDB681D692C +S3152020448005F1800420460DF07AFC20B9D5F880204D +S31520204490064B9A4204D03422FF21204610F0B2FA4D +S315202044A010F032FA002038BD700922206B6366672F +S315202044B070B5244EFFF7E0FF234A0025F3681C69D8 +S315202044C0224B6572C4E9002345F201436381204BC8 +S315202044D043F0010398471F4B012101307269207256 +S315202044E0E560C4E911131C4B23671C4B63671C4BE7 +S315202044F0A3671C4BE36752F82500D0B91A4BD3F893 +S315202045000029E264D3F81039236573685A6819683C +S315202045100132A162521A596962639A69E1620132B3 +S31520204520521AA2639A6ADB6A226301339B1AE363D7 +S3152020453070BD94F89030063503421EBFE3681843B9 +S31520204540E060D8E7700922200008024B00020150C3 +S31520204550F84C2120DFEF1500002020201C68212088 +S3152020456000002220FFD7222000C0CA402DE9F04398 +S31520204570884689B01B4E74681CB9042009B0BDE852 +S31520204580F0833368834220D00836F4E7012502AF32 +S315202045900294A946736801A928460194984790B9A0 +S315202045A0019B7B606B1E09FA03F2029B1343029345 +S315202045B001350437062DEDD1182202A9404610F0E8 +S315202045C013FA0020DAE77C60F2E71822002102A8FD +S315202045D010F018FA69460020A047009C002CD5D060 +S315202045E02046CBE7DC542120F8B51F462B4B164618 +S315202045F00138DA680D461469182849D8DFE800F012 +S315202046000E0D484848481E4848202229481018465A +S31520204610313848484848483B3D000C3404211AE0AC +S31520204620022901D92834F9E70A3504EB8504F5E770 +S31520204630022901D93434F1E70D35F6E74834EDE780 +S315202046404434EBE7D869164C43695B699847206068 +S31520204650E4E77034102107B13960E6B100203460D8 +S31520204660F8BD0BF06DFD00380D4C18BF0120EEE78C +S315202046704C340821EFE70834D0E7B43428462146C5 +S31520204680FFF774FF0028EBD11821E4E7054CC5E796 +S3152020469042F63C00E4E73046E2E700BF70092220DC +S315202046A06C29222088002220074BD3F84824511C2D +S315202046B01A44C3F8481482F80002D3F8482402F09A +S315202046C03F02C3F84824704770292220034B012239 +S315202046D083F85224002283F8502470477029222000 +S315202046E0054B0A46DB69196910B44C680146184601 +S315202046F023465DF8044B1847700922202DE9F04FF8 +S3152020470089B004460D46164606F08EFDCDE90401F5 +S31520204710BFF36F8F4FF47A70704306F093FD834674 +S315202047208A46DDE90423CDE906236319224D039326 +S31520204730039B9C4203D1002009B0BDE8F08F06F0F0 +S3152020474073FDCDE90601DDE90601DDE90423DDE976 +S315202047500689DDE90467CDE90023B04579EB070317 +S3152020476020D3009BC21A019B61EB03035BEA0A015B +S3152020477003D05A4573EB0A031CD2D5F84C34D5F80E +S3152020478048249342D4D05A1C2B4493F80032C5F89F +S315202047904C2404F8013BD5F84C3403F03F03C5F8EC +S315202047A04C34C5E7DDE90601DDE90467821B61EBB0 +S315202047B00703DBE70520BFE7702922205A2307B508 +S315202047C001228DF804300221054B8DF8050001A821 +S315202047D083F85124FFF784FF03B05DF804FB00BF64 +S315202047E070292220084B93F850242AB10022A12098 +S315202047F083F85024FFF7E2BF93F8520418B1A32080 +S3152020480083F85224F6E77047702922202DE9F341B8 +S31520204810164698460F46002951D0B2F5007F4ED82D +S31520204820FFF7E0FF044600283ED1264D95F8513467 +S315202048300BB185F851045A2385F84032B8F1000F80 +S3152020484036D1A42385F84132A5F8426226B13246D4 +S3152020485039461D4810F0C8F81B49881F0DF096FAD6 +S31520204860B11DA5F844021948FFF73AFF0446D8B9E6 +S31520204870164E01A80DF0A4FA0446A8B99DF80530D5 +S3152020488003F15F02D2B2022A19D8A32B12D0A22B6F +S315202048900AD1B5F8421230460631FFF721FF60B91A +S315202048A09DF80530A22BE4D0204602B0BDE8F08149 +S315202048B0A523C7E742F21274F6E70446F4E7042458 +S315202048C0F2E700BF70292220B62B2220B02B2220EF +S315202048D00F4B93F8502413B504462AB193F851244C +S315202048E012B193F852347BB94AF25A73022201A9A3 +S315202048F02046ADF8043023695B689847236908224F +S3152020490004495B682046984742F2137002B010BDD6 +S31520204910702922206C4D21202DE9F043164685B0A2 +S3152020492098460F46002972D0002A70D00023394D90 +S31520204930136085F85134FFF755FF0446F8B9B8F1CE +S31520204940000FDFF8D49014BF4FF0A5084FF0A4082D +S315202049504FF400720021284610F054F802A80DF0DA +S315202049602FFA044640B99DF80930A62B0BD1D9F849 +S315202049701C00FFF7ADFFB0B300230446336020466A +S3152020498005B0BDE8F08343452BD11422022101A88E +S31520204990FFF7B4FEBDF804300028EDD1B3F5007F33 +S315202049A04FF014024FF0020101A828BF4FF40073E4 +S315202049B0ADF80A30FFF7A2FEBDF80430ADF80C3072 +S315202049C00028D9D1BDF80A206AB10146284610F020 +S315202049D019F8BDF80A100A2228464A43FFF78EFE08 +S315202049E0C9E70120C8E7294602A80DF0CFF9BDF86E +S315202049F00C30834203D0A220FFF7E0FEA8E7012354 +S31520204A0085F85034BDF80A303D603360B7E704247A +S31520204A10B5E700BF7029222070092220064BD3F843 +S31520204A201834012B05D0022B14BF00204FF0C04094 +S31520204A3070474FF0405070478C0022202DE9F041DE +S31520204A400546ADF5816D0C46144FDFF854800CB920 +S31520204A5001201CE0B4F5806F264602AA414628BFD5 +S31520204A604FF48066FFF7DAFF2B1AD7F81804009642 +S31520204A700FF039F90023B10802AA994202D1A41BCA +S31520204A803544E4E752F8040B013004D000200DF51C +S31520204A90816DBDE8F0810133EFE700BF8C00222035 +S31520204AA0C42D2220F8B5224F0C463B78002B3CD033 +S31520204AB020490444D1F8C4616442734200EA0305C4 +S31520204AC01C40FFF7ABFF2C442A1AD7F8180464425F +S31520204AD023460FF0C3F8074628BB174A5369DB0342 +S31520204AE012D5002E10DD05F01F031E44BFF34F8F75 +S31520204AF02B462E44C2F85C322033F11A0029F9DCE9 +S31520204B00BFF34F8FBFF36F8F0C4BDB681B695B6C3A +S31520204B10012B08D121462846FFF790FF44F68A63C9 +S31520204B20002808BF1F463846F8BD42F2DD77FAE74F +S31520204B308C002220C42D222000ED00E070092220A6 +S31520204B40034AD36B126D9B1A1844FFF7ABBF00BFE5 +S31520204B500C0A222037B5094D04462B7853B1FFF78E +S31520204B605DFF0091231A0649D5F818040FF0BBF8EB +S31520204B7003B030BD42F2DD70FAE700BF8C00222060 +S31520204B80C42D22202DE9F043154FADF20C4D0546BC +S31520204B900C46A7F11008DFF84C9024B901200DF21D +S31520204BA00C4DBDE8F083B4F5806F264602AA49460F +S31520204BB028BF4FF48066FFF731FF2B1A0096D8F8CE +S31520204BC018040FF090F83246394602A80FF0FCFE62 +S31520204BD018B9A41B35443744DFE70020DFE700BFA0 +S31520204BE09C002220C42D222070B52B4C63780BB933 +S31520204BF0002070BD0023294D6370D5F8C021A368FD +S31520204C00934206D004F11000D21AFF2118440FF047 +S31520204C10F9FED5F8C0116068FFF710FF18B960704B +S31520204C2042F2DB70E5E76268FFF7F8FED4F81864F5 +S31520204C301B4B121A194930460EF0ECFD00236370E7 +S31520204C40A3600028D5D117494B69DB0314D5D5F8A5 +S31520204C50C001002810DD636803F01F020244BFF361 +S31520204C604F8F1A44C1F85C322033D01A0028F9DC41 +S31520204C70BFF34F8FBFF36F8F0B4BDB681B695B6CCA +S31520204C80012BB5D1D5F8C0116068FFF77BFF00282E +S31520204C90AED144F68A60ACE78C002220C42D222097 +S31520204CA09C00222000ED00E0700922202DE9F0470B +S31520204CB0214C06460D461746237833B1DFF87C90E3 +S31520204CC004F110082DB9284601E042F2DD70BDE836 +S31520204CD0F087637813BBD9F8C031013B334027D105 +S31520204CE00122C4E901636270A0683946D9F8C0213F +S31520204CF0431993422CBFA2EB000AAA4640445246AF +S31520204D0056440FF071FEA368D9F8C0215744534466 +S31520204D10A5EB0A059342A360D4D104E0D4E901236C +S31520204D2013449E42E0D0FFF75FFF0028CAD0CEE78B +S31520204D3044F68960CBE700BF8C002220C42D222098 +S31520204D4010B4044CE36B246D1B1B5DF8044B1844F4 +S31520204D50FFF7ACBF0C0A2220124B1B7873B50446F2 +S31520204D600D460192DBB121F003060644B44206D15A +S31520204D7015F003010CD1FFF737FF02B070BD01AA51 +S31520204D8004212046FFF792FF0028F6D10434EDE7D0 +S31520204D9001AA2046FFF78AFF0028ECD0EDE742F251 +S31520204DA0DD70EAE78C00222010B4044CE36B246DDE +S31520204DB01B1B5DF8044B1844FFF7CEBF0C0A22209C +S31520204DC008B5002931D010282FD8DFE800F00913A4 +S31520204DD0162125292E2E2E2E2E2E2E2E2E2E30000C +S31520204DE0174B1A7842F2DD73002A08BF184608604E +S31520204DF0002008BDFFF712FEF9E7124AD2E9143047 +S31520204E000344906DD26D034413449B0A0B60EFE755 +S31520204E100C4BD3F8C031F9E70A4BD3F8C431F5E768 +S31520204E20084BD3F8D031002BF0D10420E1E7054AF6 +S31520204E30D2E914300344906DD26D03441344E5E740 +S31520204E408C002220C42D222043884CF690720146C5 +S31520204E5023F00F039BB293422DE9F041ADF5007D5F +S31520204E6010D10368C3F313035A1E012A4FD8714A5F +S31520204E700020D2F818148B4202D0C2F818341070B1 +S31520204E80002436E0C37803F0F003C02B36D1694BDB +S31520204E9002466949D3F8180406F0A2FC044640BB12 +S31520204EA0644D00236449D5F818042B700EF09EFC1F +S31520204EB00446F0B9D5F818040FF059F969461020A0 +S31520204EC0FFF77EFF0446A0B95C4A01215164FFF713 +S31520204ED0A5FDD063009E9165731E1844136D013B7A +S31520204EE01064B6F1806F94BF9B1903F180635365DC +S31520204EF0297020460DF5007DBDE8F0810368504AD3 +S31520204F00934206D1DFF82C8198F8003053B9042437 +S31520204F10EFE74C4A9342FAD14FF4007246480FF0FD +S31520204F2063FDBDE7444D28460FF0A9F80746002823 +S31520204F3054D04FF40072294668466E460FF054FD31 +S31520204F402B6C2946D8F8180423F004032B64D5F8B3 +S31520204F50C0315B08C5F8C031D5F8C4315B08C5F827 +S31520204F60C431D5F8D0315B08C5F8D0310EF03EFCDF +S31520204F70002848D1FFF752FD4FF4007100F58060DC +S31520204F80FFF75CFD002851D095F8CA317BB16B46DE +S31520204F90294900221E4648780232023303F8020CA1 +S31520204FA0B2F5007F11F8020B03F8010CF3D1FFF7BD +S31520204FB035FD32464FF4007100F58060FFF776FE0E +S31520204FC0044668B14FF400734FF480621A49D8F82A +S31520204FD018040EF043FE002F8BD012E02E46C9E790 +S31520204FE0FFF702FE044640B1FFF718FDD5F8C4119D +S31520204FF000F58060FFF756FDEDE7002F3FF440AF28 +S315202050002746AE4205D04FF4007231460A480FF0AB +S31520205010EBFC0949D8F818040EF0E8FB04460028D2 +S315202050207FF467AF002F3FF42BAF62E742F2DB74A9 +S31520205030D1E700BF8C002220C42D22200C0A22205A +S315202050400F0000F04643464273B5134E337803B320 +S31520205050FFF7E4FC01A905461020FFF7B1FE044620 +S31520205060A0B90E49D6F818040EF036FC0C4B04468F +S31520205070DB681B695B6C012B08D101992846FFF759 +S31520205080DDFC44F68A63002808BF1C46204602B071 +S3152020509070BD42F2DD74F9E78C002220C42D222037 +S315202050A070092220014B1878704700BF8C002220DF +S315202050B010B5034C206810B180470023236010BD13 +S315202050C0C82F222010B5034C206810B1804700231A +S315202050D0236010BDC42F222038B5094D6C68206965 +S315202050E018B9AC6823692BB938BD036803B1984732 +S315202050F01434F4E71B6803B198471434F2E700BF51 +S315202051007009222010B512B10F4B5B68136041B194 +S315202051103AB113682BB11C6834B95C6834B91C6960 +S3152020512024B942F2D8700BE084420AD85C688442C3 +S3152020513007D30138014442F2D8708C4228BF002080 +S3152020514010BD1433E2E700BF7009222070B513B1D9 +S31520205150134CA4681C6011B10BB11C6814B942F21F +S31520205160D87019E0256845B9666836B9A66826B983 +S31520205170E66816B92669002EF1D095420DD1D4E9DC +S31520205180025241184FF00003A5FB025243EB0306BF +S315202051908D42B241E3D3184670BD1434DAE700BFFE +S315202051A070092220D3B5174606461A460C4611B357 +S315202051B012F4706FC3F3032305D0012B10D042F2D3 +S315202051C0D87002B0D0BD01AAFFF79CFF0028F8D1E5 +S315202051D0019B1B695B683A46214630469847F0E793 +S315202051E001ABFFF7B3FF0028EBD1019B034A1B69D4 +S315202051F099691160EEE70846E3E700BFC42F222015 +S3152020520030B539B1084B00229B681BB11C680CB104 +S315202052101D690DB9042003E0844202D100200A60D2 +S3152020522030BD01321433F0E77009222001390B18E2 +S315202052301049CA6870B512694C68D2E91C152668CF +S315202052408E4205D0A84205D88B4203D301200EE0FA +S31520205250A942F7D16469D2E91E12A14201D1914215 +S3152020526006D0904204D899428CBF0020012070BDE0 +S315202052700020FCE770092220F7B5174605461A4676 +S315202052800C4600293CD012F4706FC3F3032304D0BC +S31520205290012B1ED042F2D87019E0FFF7C7FF064631 +S315202052A00028F7D101AA21462846FFF72BFF70B9FF +S315202052B0019B3A46214628461B699B689847114BF5 +S315202052C020B9019A126912691A6000E01E6003B0A3 +S315202052D0F0BD01ABFFF73AFF0028F8D1019B284605 +S315202052E0094A1B6999699B6811603A462146984765 +S315202052F0044B18B9019A12695269E5E70022E3E7BF +S315202053000846E4E7C82F2220C42F2220024608463A +S3152020531012F4706FC2F3032310B405D0012B0DD0E5 +S3152020532004205DF8044B70470E4B5B6819690029F1 +S31520205330F6D0DC6894420FD01433F7E7094B9B68EC +S31520205340143353F8041C0029EAD053F8144C143390 +S315202053509442F6D10B6902E08B69002BE0D05DF8F0 +S31520205360044B184770092220034B002083F8100392 +S3152020537083F80903704700BFCC2F22202DE9F04166 +S3152020538005460C461646DFF83C800D4F14B9012001 +S31520205390BDE8F08101232A464146384604F0F8FD2F +S315202053A0034650B9074A52F8041BB14205D10433AB +S315202053B0B3F5007FF7D1013CE8E70020E8E700BFFE +S315202053C0CC2F2220F03222202DE9F74F254E804661 +S315202053D00D46914696F80833002B3FD0C0F308049B +S315202053E0470A4FF0000BDFF880A01DB9284603B0EE +S315202053F0BDE8F08F96F8093333B1D6F80C339F42A7 +S3152020540002D35A1C974226D301233A465146304688 +S3152020541086F809B304F0BCFD0028E8D10123C6F89C +S315202054200C7386F809332B190AEB04014846B3F589 +S31520205430007F8CBFC4F500722A4601920FF0D4FA61 +S31520205440019A1444AD1A9144B4F5007F24BFA4F5E3 +S3152020545000740137C9E7A8EB4324E4E742F2DD7064 +S31520205460C5E700BFCC2F2220F032222010B5254CB4 +S3152020547020460DF04CFC00283DD1D4F81433B3F54A +S31520205480007F0CD094F8B012C3F500721E48012973 +S315202054904FF0FF31184418BF00210FF0B3FA94F8CB +S315202054A0B02200230121D4F81803012A4FF0FF321D +S315202054B084F8103318BF0022FFF760FFF0B10123D4 +S315202054C0D4F8182310490F4804F0E4FD90B901239D +S315202054D0D4F818230D490B4804F05AFD50B94FF43F +S315202054E000720A4908480FF06FFA42F2DF7300284B +S315202054F018BF184610BD42F2E070FBE742F2DB707F +S31520205500F8E700BFCC2F2220F0342220F0322220B0 +S315202055102DE9F74FDFF8B4B007460D4690469BF8A5 +S315202055200833002B4ED0C0F30804460ADFF8A0909B +S315202055304FF0010A0DB9284611E09BF810331BB90C +S3152020554084B142F2DE700AE0DBF818339E4202D3A1 +S315202055505A1C96422BD3FFF789FF0028F0D003B0A0 +S31520205560BDE8F08FCBE9C5468BF810A32B19414611 +S3152020557009EB0400B3F5007F8CBFC4F500722A46E0 +S3152020558001920FF031FA019ADBF814331444AD1A44 +S3152020559013449044B4F5007FCBF81433CAD3FFF7D5 +S315202055A065FF0028DBD1A4F500740136C2E7A7EBFE +S315202055B04324DBF81433A342D8D0FFF757FF002823 +S315202055C0CDD1B7E742F2DD70C9E700BFCC2F22202C +S315202055D0F0342220034B93F8100308B1FFF746BF7F +S315202055E0704700BFCC2F222070B5134E05460C469F +S315202055F096F80833BBB130460DF089FBB0B9C4B15B +S315202056006A1ED6F8E002D6F8FC122244B5FBF0F545 +S31520205610B2FBF0F23046B2FBF1F2B5FBF1F1BDE878 +S31520205620704004F0BDBD42F2DD7070BD42F2E070E4 +S31520205630FBE72046F9E700BFCC2F2220104B93F81A +S315202056400023072A19D8DFE802F0040909180C0FCD +S315202056501215D3F8E432036000207047D3F8E832DD +S31520205660F9E7D3F8EC32F6E7D3F8F032F3E7D3F8BC +S31520205670F432F0E7D3F8F832EDE70420704700BF84 +S31520205680CC2F222013B5044601A8FFF7D7FF48B90F +S31520205690054A019BD2F8E022A3FB02329B0A43EA69 +S315202056A08253236002B010BDCC2F2220F0B587B0C4 +S315202056B0064608F043FA08B904241CE0F01D08F039 +S315202056C03DFA0028F8D0F37803F0F002B02A6DD105 +S315202056D0944D95F80823002AEED0C3F3030703F050 +S315202056E00F03012BE8D883B93046FEF7D5F90446B7 +S315202056F020B185F81C73204607B0F0BDB368C5F8E5 +S315202057002033012385F81C33F5E795F81C33002B2D +S31520205710D2D0337813F00F03CED101A80193FFF70F +S31520205720B1FF04460028E6D1019B03A902A8D5F89B +S31520205730E072B3F5800FD5F8206384BF4FF0FF3396 +S315202057400193FEF7DDF904460028D4D1039B019A64 +S31520205750F118914221D87A1E324221D195F8B022D1 +S31520205760B3FBF7F1012A07FB11334FF0FF3218BFA5 +S315202057700022002B18BF0131B6FBF7F0FFF7FEFD04 +S3152020578088B13046DDE90221FFF7C2FE0446002813 +S31520205790B1D1FFF71FFF0446ADE742F2D874AAE73E +S315202057A042F2DE74A7E742F2DB74A4E7C02A83D153 +S315202057B05C4D4FF44972002128460FF023F93379A6 +S315202057C003F00F03012B0BD9022B7FF475AF564B19 +S315202057D00C202B6009F01AF9544BD3F8803D07E0B2 +S315202057E0534B0C202B6009F011F9504BD3F8003D78 +S315202057F0DBB229680133B0FBF3F04E4B68601A68A0 +S31520205800914204BF002283F8D42040F2FF13A5F84A +S3152020581004330223A5F802337378C3F3031385F8E0 +S315202058202C307378C3F3030385F82D30B379B279FE +S31520205830C3F3C00385F83830B379C3F3C01385F892 +S315202058403930F37903F00303022B65D0032B66D07E +S31520205850012B14BF44F6206342F2107312F0100F6E +S3152020586040F6C411C2F380022B6341F2883318BF5D +S315202058700B462C486B6385F83A200DF038FA0446FF +S3152020588000287FF438AFF178264801F007010DF083 +S3152020589046FA044600287FF42EAF01A8FFF7CEFE55 +S315202058A0044600287FF427AF02A940F22110FFF7F3 +S315202058B0A7FC044600287FF41EAF029A14211E4B13 +S315202058C001FB0233D5F8E022DA60019A9A60337818 +S315202058D0DA071DD5B278CDF81100C2F30101C2F343 +S315202058E0021210488DF80F10C3F301118DF80D20E8 +S315202058F0C3F38002C3F3C0038DF80E1003A98DF8DD +S315202059000C208DF810300DF047FA00287FF443AF95 +S31520205910012385F80833EEE641F288339EE740F6E8 +S31520205920C4139BE7CC2F222000C041400010CC403E +S3152020593000804140F03622209409222013B50E4CB7 +S3152020594094F8083393B120460DF0E1F988B901A8DF +S31520205950FFF774FE40B9D4F8FC320146019A20465E +S31520205960B2FBF3F204F01CFC02B010BD42F2DD7053 +S31520205970FAE742F2E070F7E7CC2F222013B540F267 +S31520205980FF13144CA4F8043302232046A4F8023330 +S315202059900EF0C7FFD0B920460DF0A9F9C0B9694647 +S315202059A040F22110FFF72CFC80B901A8FFF746FE14 +S315202059B060B9009A1421084B01FB0233D4F8E02267 +S315202059C0DA60019A9A60012384F8083302B010BD68 +S315202059D00023F9E7CC2F222094092220E1B10528A3 +S315202059E01AD8DFE800F0030E111919140B4B93F87F +S315202059F0082342F2DD73002A08BF184608600020DB +S31520205A0070470020086070470846FFF73BBE034BCF +S31520205A10D3F8E0320B60F2E704207047CC2F222007 +S31520205A20034B002083F8DC0083F8D500704700BFA5 +S31520205A30F03622202DE9F04105460C461646DFF8A1 +S31520205A403C800D4F14B90120BDE8F08101232A4660 +S31520205A504146384604F050FE034650B9074A52F8CC +S31520205A60041BB14205D10433B3F5007FF7D1013CA5 +S31520205A70E8E70020E8E700BFF0362220E0372220A2 +S31520205A802DE9F74F254E80460D46914696F8D4307F +S31520205A90002B3FD0C0F30804470A4FF0000BDFF855 +S31520205AA080A01DB9284603B0BDE8F08F96F8D530E2 +S31520205AB033B1D6F8D8309F4202D35A1C974226D3E8 +S31520205AC001233A465146304686F8D5B004F014FED6 +S31520205AD00028E8D10123C6F8D87086F8D5302B19AE +S31520205AE00AEB04014846B3F5007F8CBFC4F500724B +S31520205AF02A4601920EF078FF019A1444AD1A914459 +S31520205B00B4F5007F24BFA4F500740137C9E7A8EBBC +S31520205B104324E4E742F2DD70C5E700BFF0362220B9 +S31520205B20E037222010B5214C20460DF0FCFAB8BBD8 +S31520205B30D4F8E030B3F5007F09D0B4F8BE10C3F511 +S31520205B4000721B4841F3000118440EF05BFFB4F8A5 +S31520205B50BE2000230121D4F8E40042F3000284F879 +S31520205B60DC30FFF767FFF0B10123D4F8E420104999 +S31520205B700E4804F035FE90B90123D4F8E4200D49CF +S31520205B800A4804F0B9FD50B94FF400720949084873 +S31520205B900EF01AFF42F2DF73002818BF184610BDF8 +S31520205BA042F2E070FBE742F2DB70F8E7F036222083 +S31520205BB0E0392220E03722202DE9F74F304D0746C5 +S31520205BC00E46904695F8D430002B55D0C0F30804C5 +S31520205BD04FEA502BDFF8AC904FF0010A0EB9304631 +S31520205BE011E095F8DC301BB984B142F2DE700AE070 +S31520205BF0D5F8E4309B4502D15A1C93422CD3FFF78B +S31520205C0091FF0028F0D003B0BDE8F08FC5E9384BCE +S31520205C1085F8DCA03319414609EB0400B3F5007F53 +S31520205C208CBFC4F50072324601920EF0DDFE019A39 +S31520205C30D5F8E0301444B61A13449044B4F5007FC6 +S31520205C40C5F8E03016D3FFF76DFF0028DBD1A4F589 +S31520205C5000740BF101030BE0A7EB4324D5F8E020D9 +S31520205C600193A242D6D0FFF75DFF0028CBD1019B1E +S31520205C709B46B3E75B46FBE742F2DD70C3E700BFF6 +S31520205C80F0362220E0392220034B93F8DC0008B19D +S31520205C90FFF748BF704700BFF036222013B5104CBF +S31520205CA020460EF040FEB8B920460DF058FAA8B985 +S31520205CB001A94FF49070FFF7A3FA68B9019A14212D +S31520205CC0084B01FB0233D4F8CC20DA60D4F8C82064 +S31520205CD09A60012384F8D43002B010BD0023F9E75E +S31520205CE0F03622209409222070B50F4E05460C4608 +S31520205CF096F8D43083B130460DF015FA78B98CB1A8 +S31520205D00690A013D30462C44C1F1010202EB54229E +S31520205D10BDE8704004F0DCBD42F2DD7070BD42F279 +S31520205D20E070FBE72046F9E7F036222010B50D4C2F +S31520205D3094F8D43083B120460DF0F5F9014670B998 +S31520205D402046D4E93223BDE81040A2FB0323520A81 +S31520205D5042EAC35204F0BCBD42F2DD7010BD42F2CD +S31520205D60E070FBE7F0362220F7B5054607F0E6FE81 +S31520205D7008B904201BE0E81C07F0E0FE0028F8D034 +S31520205D80EB7803F0F002B02A5FD1754E96F8D42036 +S31520205D90002AEED0C3F3030403F00F03012BE8D827 +S31520205DA073B92846FDF778FE18B186F8E84003B087 +S31520205DB0F0BDAB68C6F8EC30012386F8E830F6E76C +S31520205DC096F8E830002BD4D02B781B07D1D101A907 +S31520205DD06846D6F8EC70D6E93245A5FB0443A40ADA +S31520205DE044EA8354B4F5800F88BF4FF0FF34FDF783 +S31520205DF087FE0028DBD1019BFA18A2421CD86A1EF6 +S31520205E003A421CD1B6F8BE20B3FBF5F105FB11337F +S31520205E1042F30002B7FBF5F0002B18BF0131FFF744 +S31520205E2009FE78B13846DDE90021FFF7C5FE0028B6 +S31520205E30BDD1FFF729FFBAE742F2D870B7E742F281 +S31520205E40DE70B4E742F2DB70B1E7D02A91D1444C20 +S31520205E50F022002120460EF0D5FD2B7803F00F03EB +S31520205E60012B0AD9022B84D13E4B0C20236008F02B +S31520205E70CDFD3D4BD3F8803D07E03C4B0C202360E5 +S31520205E8008F0C4FD384BD3F8003DDBB2216801333E +S31520205E90B0FBF3F0364B60601A68914204BF0022B3 +S31520205EA083F808236B78C3F3021384F82C306B789D +S31520205EB0C3F3000384F82D30AB78EA78C3F3C0030C +S31520205EC002F0030284F83830AB78022AC3F3C013D9 +S31520205ED084F83930AB783AD0032A3BD0012A14BF34 +S31520205EE044F6206242F2107213F0100F40F6C411CD +S31520205EF0226341F2883218BF0A4613F0600F1848F1 +S31520205F00626318BFC3F341136A780CBF01235B0079 +S31520205F10C2F3420223645201E2630DF020F9E0B974 +S31520205F2001A94FF49070FFF76BF900287FF43FAF5B +S31520205F30019A14210F4B01FB0233D4F8CC20DA60CE +S31520205F40D4F8C8209A60012384F8D4302FE741F270 +S31520205F508832C9E740F6C412C6E70023F4E700BF1B +S31520205F60F036222000C041400010CC400080414025 +S31520205F70CC2F22209409222011B3052820D8DFE80F +S31520205F8000F0030E111F1F1B0E4B93F8D42042F254 +S31520205F90DD73002A08BF18460860002070470020BD +S31520205FA008607047074AD2E93232A3FB02329B0AA5 +S31520205FB043EA82530B60F0E7024BD3F8CC30F9E763 +S31520205FC004207047F03622200A4B0022D3F8A8312D +S31520205FD0B0FBF3F0084B1969203310B5914201D15B +S31520205FE0002010BD53F8044B844201D00132F5E73E +S31520205FF00120F6E720802220007C222000280D4A3E +S315202060000D4B08BF134610B50C4640F21C4108BF65 +S315202060104FF47F7162689A420AD1A368012B07D177 +S31520206020201D0BF062FF23681B1A5842584110BDD1 +S315202060300020FCE74243464E5442424413B54FF4D7 +S31520206040807001A9FFF7DCF878B9019B1421084A52 +S3152020605001FB03220749D1F8A031D360D1E96B4354 +S31520206060D1F8A81163434B43936002B010BD00BF03 +S315202060709409222020802220064A1369FF2B07D844 +S31520206080591C0833116142F823000122024B5A7011 +S31520206090704700BF007C2220E03B222010B5094C0F +S315202060A04FF48062FF2120460EF0ACFC064A0123E5 +S315202060B04FF47F71201DC4E901230BF016FF2060C9 +S315202060C010BD00BF208022204243464E064A01466C +S315202060D092F8E0312BB9054883704360044BC2F80F +S315202060E0E431044802F090BF20802220E05B222069 +S315202060F0E23B2220208122202DE9F047154F0D4614 +S315202061001446D7F8A01102EB050897F8E031B0FB2A +S31520206110F1F62BB9104A93705360104BC7F8E4312F +S31520206120DFF83C90444502D30020BDE8F087D7F81D +S31520206130A031224631464846AB4228BF2B469A46B6 +S3152020614002F0C0FF0028F0D15444A5EB0A05013601 +S31520206150E8E700BF20802220E05B2220E23B2220AD +S3152020616020812220484800232DE9F04F00F5804643 +S31520206170464D85B0F268D5F8A01134698A42D5F803 +S31520206180A8813372D5E96BA907D002F500538A1A64 +S31520206190FF21083318440EF035FC012221463C48C5 +S315202061A00CF068FA074628B142F2DB77384605B06C +S315202061B0BDE8F08FD5F8A011364A04FB01F0FFF791 +S315202061C09BFF0028F2D00AFB09F3DFF8CCB0DFF8DA +S315202061D0C0A00193B4FBF8F0FFF74EFF736900F1DE +S315202061E0010801337361019B984502D342F2D87787 +S315202061F0DCE7D5F8A89108FB09F108460291FFF7BC +S31520206200E3FE029938BB5046B4FBF9F309FB13434E +S315202062105A1CA4EB030903930CF02CFA0028C3D1B3 +S31520206220039B02991B1B0B440393039B4C454B4416 +S315202062300293D5F8A03114D8164A194603FB04F048 +S31520206240FFF75AFF0028B1D042F2DB739842ABD039 +S315202062504046FFF711FF736908F101080133736186 +S31520206260C1E75A464946504602F08AFD0028EBD11E +S31520206270D5F8A0115A4602984843FFF73DFF00283B +S31520206280E2D109F10109D0E7E03B2220208022201B +S3152020629020812220E85B2220E23B22202DE9F74F95 +S315202062A00F469146002A75D0404A1378002B73D08A +S315202062B0DFF8FCA0DAF8A081DAF84030B0FBF8F558 +S315202062C09D426CD302F58046DAF8A82108FB1504F6 +S315202062D0736902FB03550FB938464DE0336996F8AA +S315202062E008B0AB4222D1BBF1000F1FD0F368A342E6 +S315202062F04BD13B1904F500504946434500F108008F +S315202063002A4B8CBFA8EB040BBB4618445A465C4448 +S315202063100EF06AFBF368A045A7EB0B075B44D94434 +S315202063209CBFA4EB08040135F360D4E7DAF8A81162 +S31520206330B5FBF1F0BBF1000F03D0B3FBF1F398428C +S3152020634016D00191DAE96B32534383422AD9284663 +S31520206350FFF73AFE019920B173690D440133736129 +S31520206360B9E7BBF1000F03D14CB145F2D12003E0B0 +S31520206370FFF7F8FE0028F7D003B0BDE8F08F4FF0E6 +S315202063800103C6E903453372B3E7FFF7EBFE002886 +S31520206390F2D1A0E70420EFE742F2DD70ECE745F2E8 +S315202063A0E320E9E742F2D870E6E700BFE03B22206F +S315202063B020802220024B187A08B1FFF7D3BE7047DF +S315202063C0E07B22202DE9F74F0E460092002A65D049 +S315202063D0DFF8E09099F80030002B61D0DFF8D880E4 +S315202063E009F5804B09F5005AD8F8A071DBF814304E +S315202063F0D8F8A821B0FBF7F507FB150402FB0355B7 +S315202064001EB9304603B0BDE8F08FDAF804309AF88A +S315202064100200AB4200D158BBD8F8A821B5FBF2F137 +S3152020642018B1B3FBF2F3994211D00192D8E96B301F +S3152020643043438B4237D92846FFF7C6FD019A30B110 +S31520206440DBF8143015440133CBF81430D8E7002379 +S31520206450164A294616488AF80230D8F8A03102F082 +S315202064608FFC0028CED10123CAF804508AF80230A6 +S315202064703319A11C0098BB4249448CBF3A1B324693 +S3152020648001920EF0B1FA019A009B1444B61A1344D5 +S31520206490A74200939CBFE41B0135B1E70420B1E756 +S315202064A042F2DD70AEE742F2D870ABE7E23B222023 +S315202064B020812220E03B2220208022202DE9F74F18 +S315202064C0064601920D464FF4005200211548984663 +S315202064D00EF098FA002E4FF0000BDFF84CA00CBFE0 +S315202064E04FF480694FF484690E4F019B9B4501D15F +S315202064F0012412E0DAF8A0013A4649466843FFF71C +S3152020650061FF044618B145440BF1010BEDE73946EE +S315202065103046FFF773FD0028F5D0204603B0BDE8AE +S31520206520F08F00BFE23B22202080222073B509F085 +S31520206530EBFD20283ED1204DFFF7B0FD05F58070DC +S315202065400AF008F9044690BB05F5807002F0BEF9E2 +S31520206550044660BB01A968460AF018F82146204661 +S31520206560DDE90023FFF7AAFF044600BB134E4FF4B4 +S315202065708062284631460EF037FA05F5807002F003 +S31520206580A5F9044698B9E9680120DDE90023FFF73B +S3152020659095FF044658B94FF48462314608480EF0D8 +S315202065A023FA012306F8023CFFF748FD044620463D +S315202065B002B070BD0124FAE720802220E23B22206F +S315202065C0007C22202DE9F04F3D4C85B08046B4F842 +S315202065D01290B4F810A0B9F1010F85BFD4F8A831D4 +S315202065E00AFB09F70123B7FBF3F3019368B3354E72 +S315202065F040F21C41E56845F2E22BD4F8A821301D53 +S31520206600B5FBF2F70BF071FC4FF4846330600293F4 +S31520206610002126E0D4F8A0013A464FF48061704349 +S31520206620FFF7D0FE00283BD14FF4806259463846EA +S315202066300EF0CAF9A0BB013556444D45EAD34FF09A +S31520206640000B584605B0BDE8F08F064605461E4F7E +S31520206650DFF86CB0F1E7C8190391FFF737FD0399EE +S315202066600131019B9942F6D100274F45E9D2D4F832 +S31520206670A001324602996843FFF73EFD50B1D4F877 +S31520206680A801B5FBF0F0FFF721FD58460137554408 +S315202066908346EAE7B8F1010F04BF0C4B5870F5E7A3 +S315202066A04FF47F710A480BF020FC00274FF48063BB +S315202066B0034E3D4645F2E12B20600293A8E700BF1A +S315202066C020802220007C2220E23B2220E03B222028 +S315202066D0248022202DE9F843254E3378002B3CD0E8 +S315202066E000293FD0DFF88C80441ED8F8A0510C44D6 +S315202066F0D8F8A821B0FBF5F7B4FBF5F4B7FBF2F7F1 +S31520206700B4FBF2F4C7F101031C44D8F84030B3FBA4 +S31520206710F2F39F4228D30125D8E96B2302FB03F904 +S3152020672044B97378DBB10120BDE8F843FFF74ABFAF +S31520206730013C10E04F45F4D2D8F8A8017843FFF762 +S3152020674043FC40B93846FFF7C1FC05460028EFD068 +S315202067503846FFF791FC0137E2E742F2DD752846FD +S31520206760BDE8F8830D46FAE745F2E325F7E700BFB3 +S31520206770E03B22202080222008B5074B587810B1F4 +S315202067800120FFF71FFF054B0022A3F500511A72A7 +S315202067905A618A7008BD00BFE03B2220E07B222080 +S315202067A02DE9F7430446804607F0C8F908B90420A6 +S315202067B0ECE004F2FF3007F0C1F90028F7D021469B +S315202067C00020FFF71BFC70B19C4B002221469C48E1 +S315202067D01A704FF480620EF007F99A4802F076F884 +S315202067E0002877D0D2E0E37803F0F002D02A40F0D8 +S315202067F0B7802379A679180714BF03F00F0701273E +S315202068006378310714BF06F00F0601269A076278AF +S3152020681014BF03F00303012363F301026379012BE1 +S31520206820627038BF0123637123785B0700F0FA80FA +S31520206830082E00F2FA80814B0022814D1A70FFF734 +S315202068402DFC05F5807009F085FF002840F09E80FC +S315202068500623A5F85C0185F8090105F5807085F8E1 +S315202068600C312378C3F3020385F852312378C3F3FE +S31520206870C00385F820312378C3F30213013385F82A +S3152020688053316378C3F30103DB0085F82131637824 +S31520206890C3F3021385F83031A378C3F3000385F8B8 +S315202068A05531A378C3F3400385F8563102F00EF80C +S315202068B000286BD163792946D5F8A8C107FB03F2B6 +S315202068C05200864234D10CFB03F36F822B827B430A +S315202068D06E61EB605A4901200B8A4A8AC968FFF704 +S315202068E0EDFD002800F09780574C4FF48462FF215D +S315202068F0012520460EF086F8544B40F21C41201DDF +S31520206900C4E90135002323610BF0EFFA20602846E5 +S31520206910FFF758FE002839D10020FFF753FEA8BBE9 +S31520206920464B01221A7003B0BDE8F043FFF786BB21 +S3152020693020B1B8F80620B8F804402244B8F80A4016 +S31520206940083108F10408944272D3B8F804E004FB15 +S315202069500CF401300CFB0EFE8C63C1F83CE0B0E752 +S31520206960B02A68D1354D2A78002A3FF420AFC3F3C8 +S31520206970030603F00F03012B3FF619AF05F58045DB +S3152020698063B92046FDF788F818B12E7603B0BDE806 +S31520206990F083A368EB6101232B769BE72B7E002BCC +S315202069A03FF405AF237803F00F03072B3FF6FFAE06 +S315202069B0234E083301A9684656F8338006EBC303D5 +S315202069C0D6F8A071D3F80490EC69FDF799F8002841 +S315202069D0DCD1019B2344B3FBF7F39945FFF4E7AEC3 +S315202069E007FB08447B1E23427FF4E1AE012206F5F5 +S315202069F08070B4FBF7F10BF03DFE48B92046DDE967 +S31520206A000021FFF74BFC0028C0D1FFF7D3FCE7E697 +S31520206A1042F2DB70BAE74FF484620D490A480DF042 +S31520206A20E3FF79E745F2E420B0E745F2E520ADE73C +S31520206A3045F2E620AAE745F2E020A7E7E03B222020 +S31520206A402080222020812220007C22205442424461 +S31520206A50E23B22202DE9F041154FDFF85880D7E977 +S31520206A606B365E4398F80030F3B942F2DD74204647 +S31520206A70BDE8F081D7F8A8016843FFF7A5FA38B911 +S31520206A802846FFF723FB044610B12846FFF7F4FAE1 +S31520206A900135B542EED198F80130002BE7D0012000 +S31520206AA0BDE8F041FFF78EBD00250124F1E700BFA8 +S31520206AB020802220E03B2220002939D0102837D8D8 +S31520206AC0DFE800F0091316233627363636363636D3 +S31520206AD0363636362E00174B1A7842F2DD73002AC8 +S31520206AE008BF1846086000207047002008607047BD +S31520206AF0114AD2E96B034343D2F8A801D2F8A02148 +S31520206B00434353439B0A0B60EDE70B4BD3F8A0314D +S31520206B10F9E7094AD2F8A831D2F8A0215343F2E75F +S31520206B20054AD2E96B034343D2F8A8014343F3E74E +S31520206B3004207047E03B2220208022200020014B89 +S31520206B4098607047A80422202DE9F047234B8CB06B +S31520206B50234E804693F818748A4693F8199414463F +S31520206B6005AD0FCE0FC596E8070085E80700102251 +S31520206B70002101A80DF046FF4FF48013049344B959 +S31520206B8001223846494609F015FA00200CB0BDE806 +S31520206B90F087032C01D10022F3E7012C18D1CDF860 +S31520206BA008800CABCDF80CA003EB870401A954F880 +S31520206BB01C0C08F0CFF8B0F5C87FF7D00028E5D018 +S31520206BC038460022494609F0F5F942F6CD10DDE790 +S31520206BD0022C08BFCDF80480E3E700BFA8042220BA +S31520206BE0144A21200B461146044A127812B11A461D +S31520206BF001F0BEBB42F2DD70704700BFA804222000 +S31520206C0030B5134CADF20C4D0023A268EAB165686D +S31520206C1004F10C0101922846C4E9013301F0C4FB9A +S31520206C2080B9019A02A9284601F0A2FB50B9019AFF +S31520206C3002A904F10C000DF0C7FE42F2DF730028F2 +S31520206C4018BF18460DF20C4D30BD1046FAE700BF8E +S31520206C50A80422202DE9F8431D4D06460C469046D1 +S31520206C602B7893B3D5F82874B7F5806F28BF4FF4C7 +S31520206C7080670CB9204626E0D5E9012050EA020398 +S31520206C801AD16E600219974238BFA7EB000900F18E +S31520206C900C0028BFA1462844404503D04A464146F9 +S31520206CA00DF0A2FEAB68C8444E44A4EB09044B4425 +S31520206CB09F42AB60DDD102E00244B242E2D0FFF730 +S31520206CC09FFF0028D5D0BDE8F88342F2DD70FAE791 +S31520206CD0A80422200B4B1B7870B505460E4673B1AF +S31520206CE001F0A0FB044640B9314628460BF010F9A6 +S31520206CF042F2DF73002808BF1C46204670BD42F2B0 +S31520206D00DD74FAE7A80422202DE9F0438FB005464A +S31520206D1006F014FF08B904201CE105F12B0006F02B +S31520206D200DFF0028F7D0EB7803F0F002C02A40F0C0 +S31520206D30FC80AF4C2C22002104F582600DF062FEEF +S31520206D40AC4BAD4AC4F810344FF48033AB49C4F869 +S31520206D501434AB4BC4F8303440F20563A4F83434F1 +S31520206D602B7803F00F0352F82330A64AC4F8283490 +S31520206D702B781B0952F823306A78C4F82C3402F079 +S31520206D800F0251F822106A78C4F82414C2F3031093 +S31520206D901209012A18D0022A2ED000226020B1F111 +S31520206DA0807F84F8202484F8380432D81822B3F53A +S31520206DB0803F84F821244FF0420284F836241ED3C3 +S31520206DC0D82384F8373407E0B1F5803F84F82004AF +S31520206DD00BD8102384F82134AB781B09013B032BD5 +S31520206DE049D8DFE803F02D424446B1F1807F01D80F +S31520206DF01823EFE72023EDE784F82004ECE7B3F50A +S31520206E00805F01D12023DCE7B3F5004FE4D1522364 +S31520206E10D7E72021B3F5803F84F8362484F821143F +S31520206E204FF0120184F831144FF0130184F83214F4 +S31520206E3001D3DC23C5E7B3F5805FCDD12123C0E77D +S31520206E40012384F81834AB78C3F3030203F00F032D +S31520206E50022B03D0032B01D0012B0ED184F8192429 +S31520206E60EB781A070DD1684B15E00223E9E70323B7 +S31520206E70E7E70423E5E70023E3E7002384F8193432 +S31520206E80EEE72B7903F00F03022B4AD0032B4AD0AF +S31520206E90012BE8D15D4BC4F81C34554E4FF0000829 +S31520206EA05B4D07AC96F8187406F58360D6F81C94CB +S31520206EB086F8008009F0A0F838460DF015FD3846F2 +S31520206EC0544909F08DF80FCD0FC495E8070084E8C2 +S31520206ED007001C22414668460DF094FD082369468A +S31520206EE04C4A01934C4BCDF80090ADF808808DF894 +S31520206EF00A80B3FBF9F3CDE90333059302230693E6 +S31520206F000EAB03EB870757F81C0C07F0B1FED6F81B +S31520206F100C1406F5846001F0FBF9D8B901233370EF +S31520206F2018E03E4BB7E73E4BB5E7B02A50D1304C60 +S31520206F302278002A3FF4EFAEC3F3030603F00F03B3 +S31520206F40012B3FF6E8AE7BB92846FCF7A5FD20B1FC +S31520206F5084F83C640FB0BDE8F083AB68C4F84034B5 +S31520206F60012384F83C34F5E794F83C34002B3FF495 +S31520206F70D2AE2B781B077FF4CEAE07A96846D4F86D +S31520206F802464D4F82854D4F84044FCF7B9FD0028CA +S31520206F90E0D1079B23449E4217D36B1E234211D157 +S31520206FA0294620460AF0B4FF48B1009A2046079980 +S31520206FB0FFF750FE0028CDD1FFF722FECAE742F286 +S31520206FC0DB70C7E742F2DE70C4E742F2D870C1E731 +S31520206FD02A68084B9A427FF49EAE2C220021114823 +S31520206FE00DF010FD2C2229460E480DF0FDFC54E70D +S31520206FF0A80422206B7365632C092220EC0822200A +S315202070000102030444092220002D31018096980094 +S31520207010144A2120005A620200CA9A3B404B4C0057 +S3152020702080841E00B808222038B50A4D2B7873B1EB +S3152020703001F03EFA044640B9D5F824140AF068FF38 +S3152020704042F2DF73002808BF1C46204638BD42F294 +S31520207050DD74FAE7A804222059B3102829D8DFE8BE +S3152020706000F009131B162028282828282828282815 +S3152020707028282400104B1A7842F2DD73002A08BFF4 +S3152020708018460860002070470020086070470A4B89 +S31520207090D3F828340B60F5E7074BD3F824349B0A22 +S315202070A0F8E7054BD3F82C34F4E7034BD3F82434F4 +S315202070B0F0E70420704700BFA8042220084B0022B6 +S315202070C01969203310B5914201D1002010BD53F803 +S315202070D0044B844201D00132F5E70120F6E700BFB8 +S315202070E054A422202DE9F347DFF8648006460C4677 +S315202070F0174608F58079DFF854A01CB9204602B03F +S31520207100BDE8F087D8F8C0523B4632464946A542CC +S315202071104FF0010028BF254600950CF0FAFE0028E6 +S31520207120EDD10A4B324649460120009505F0C6FB93 +S315202071300028E4D12A46514638460DF045FC18B998 +S315202071402F44641B0136D8E70120D8E73484222037 +S3152020715074A822200246024901200CF078BE00BFE6 +S3152020716074A922202DE9F84F204C0026B4F812804D +S31520207170B4F81090D4F8C87209FB08F5E368B5FB7B +S31520207180F7F5B3FBF7F7B0B20136854214D8184E7F +S3152020719040F21C414FF0000B44F62967301DDFF8E2 +S315202071A054A00AF0DAFEE56830601FFA8BF3984582 +S315202071B006D83846BDE8F88F3844FFF7CBFFE2E7FC +S315202071C032464FF484612846FFF78CFF48B1D4F825 +S315202071D0C802B5FBF0F0FFF7BDFF4D440BF1010BC4 +S315202071E0E3E707468AF80100F7E700BF74A82220C4 +S315202071F054A422202484222010B5074C607808B17C +S31520207200FFF7B0FF054A0023A2F58051137653627B +S315202072100B74237310BD00BF2484222024A4222093 +S31520207220064A1369FF2B07D8591C0833116142F8E7 +S3152020723023000122024B5A70704700BF54A42220FB +S31520207240248422202DE9F041224F04460D463B7806 +S31520207250BBB3D9B37A68204B012AD3F8C8020FD002 +S31520207260D3F8C012B4FBF1F2013C2544B5FBF1F56D +S31520207270B2FBF0F2B5FBF0F1C2F1010514460D4444 +S315202072801A6CB2FBF0F2A24222D8D3F8DC82042672 +S315202072900DB1A04505D87B78ABB1BDE8F041FFF70D +S315202072A061BF2046FFF70AFF38B92046FFF752FF75 +S315202072B0064620B12046FFF7B3FF0134E8E7013D1B +S315202072C0FBE742F2DD763046BDE8F0810E46FAE74E +S315202072D00426F8E72484222074A822202DE9F743C7 +S315202072E0DFF83C8005460C46164608F580791CB901 +S315202072F0204603B0BDE8F083D8F8C07233462A462C +S315202073004946A7424FF0010028BF2746009705F09F +S31520207310D5FA0028EDD13E44E41B0135E7E700BF2E +S3152020732074A82220F8B50E4B044645180D4FD3F8E5 +S31520207330C06220463A4631460134FFF7CFFF034646 +S3152020734060B90849B34203D3AC42F2D10120F8BD3B +S3152020735051F8042B013201D10433F3E70020F6E75C +S3152020736074A82220348422202DE9F74F3D4ADFF8C5 +S31520207370FC8002F50056D8F8C032F169356A994268 +S315202073804FF000034FF00101284618BF13733376C0 +S31520207390FFF7C8FF20B942F2DB7003B0BDE8F08FBB +S315202073A0314A2846F169FFF79DFE08B90020F4E707 +S315202073B0D8F8C802DFF8B8A0DFF8ACB0B5FBF0F0FB +S315202073C0FFF72EFF736A471C01337362D8F8DC322D +S315202073D00093009B9F4202D342F2D870DDE73846C5 +S315202073E0FFF76CFE28BBD8F8C832B5FBF3F403FBB5 +S315202073F014547B43611CA5EB040918460193FFF71F +S3152020740091FF0028C7D0641B019B1C444D4504EBEB +S315202074100903D8F8C01211D85A461846FFF762FE3B +S315202074200028C3D042F2DB739842B4D03846FFF707 +S31520207430F7FE736A013701337362CAE7524648461C +S315202074400193FFF74BFF0028ECD1019B5246D8F839 +S31520207450C0121846FFF746FE0028E3D109F101099C +S31520207460D4E700BF248422203C94222074A8222002 +S31520207470348422202DE9F04F85B006468A46019293 +S31520207480002A00F0CB80664F3B78002B00F0C3808B +S315202074907A68DFF898B1012ADBF8C09255D1387B7B +S315202074A098B9DBF8DC12B14240F2B880DBF8C8424A +S315202074B007F500513A7374435A4A0876BE60064649 +S315202074C009FB04A11160042515E0B968DBF8C80280 +S315202074D009FB01F2DFF84C814243521AD8F80010FA +S315202074E0324491421BD10425B2FBF9F409FB142620 +S315202074F05244C8F80020DBF84020A2420BD8DFF8FF +S315202075003081DBF8C812D8F8242001FB0244BAF1D6 +S31520207510000F1FD15DB9284605B0BDE8F08F07F5CD +S315202075200052127E32B1FFF71FFF054618B1002305 +S315202075303B73F0E70425DBF8C8420122BE60744382 +S3152020754000263A7309FB04F2D2E7B0FBF9F409FBD3 +S315202075501406B8E7D8F8203098F81820A34224D16A +S315202075601AB3D8F81C20B2424CD10AEB06022E4B75 +S3152020757001994A4503EB06008CBFA9EB0605554623 +S315202075802A462E440DF030FAD8F81C20019BB1450E +S315202075902A44AAEB050A2B449CBFA6EB09060134F4 +S315202075A00025C8F81C200193B1E7DBF8C812B4FBEC +S315202075B0F1F01AB1B3FBF1FC604516D0DBF8DC32D2 +S315202075C08342CDE9021223D9FFF778FDDDE90212A5 +S315202075D030B1D8F824200C440132C8F8242096E76C +S315202075E01AB946B144F62A65A1E7FFF7BDFE05463E +S315202075F00028F6D09BE74FF00103C8E9076488F8F6 +S315202076001830B2E7FFF7B0FE054600288FD17EE777 +S3152020761042F2D8758BE742F2DD757CE704257AE7BE +S3152020762024842220208422203C94222074A82220D4 +S3152020763024A42220024B187E08B1FFF795BE70475E +S3152020764024A422202DE9F04F85B089460192002AD4 +S3152020765000F09E80DFF8448198F80030002B00F05F +S315202076609480D8F804204B4F012AD7F8C06233D112 +S3152020767098F80C4014BBD7F8DC32834240F288803D +S31520207680D7F8C83288F80C2003FB00F5C8F8080084 +S31520207690DFF80CA1D7F8C822DAF82400AAF5805BF7 +S315202076A002FB00550422B9F1000F1AD112B1002392 +S315202076B088F80C30104605B0BDE8F08FD8F8085071 +S315202076C0D7F8C83206FB05F45C43641B0444B4FB9C +S315202076D0F6F506FB1544DBE7B0FBF6F506FB1504AD +S315202076E0D6E7DBF814309BF810E0AB4202D1BEF18E +S315202076F0000F2DD1D7F8C812B5FBF1F0BEF1000F3F +S3152020770003D0B3FBF1FC604511D0D7F8DC3283429D +S31520207710CDE9021236D9FFF7D1FCDDE9021230B1CC +S31520207720DAF824000D440130CAF82400BBE70022F1 +S31520207730D7F8C01228468BF81020174AFFF7CEFD1F +S3152020774002460028B3D10122CBF814508BF8102002 +S3152020775009EB0402104B0198B24203EB04018CBFC3 +S31520207760321B4A4602920DF03FF9029A019B14449D +S31520207770A9EB020913440022A64201939CBFA41B15 +S31520207780013590E742F2D87291E742F2DD7291E715 +S3152020779004228FE774A822203484222024842220C5 +S315202077A024A422202DE9F84F174B0024174EB3F896 +S315202077B01280B246B3F81090DF68DFF854B04AF84A +S315202077C0044FA3B2984501D9082C01D1012518E0F0 +S315202077D032464FF484613846FFF780FD054610B1C6 +S315202077E04F440134EDE773685B45F9D1B368012B2B +S315202077F0F6D140F21C4150460AF0AFFB336898423E +S31520207800EED12846BDE8F88F74A8222054A4222041 +S31520207810544242442DE9F04F85B008F075FC0228E9 +S315202078201CD1324808F07EFA0446002856D12F492A +S3152020783001200CF0F9FA044600284FD1DFF8B88051 +S3152020784002A901A8264608F057FAA8F11005DFF864 +S31520207850B0B0DDE9019AA3B24B4501D301243DE026 +S3152020786042464FF480613046FFF738FD002839D153 +S315202078706B695B4536D1AF69012F33D14FF47F71C8 +S315202078801B480AF06AFB2B6998422BD1194E4FF4DC +S315202078908062194930460DF0A7F806F580713846E2 +S315202078A00CF0C2FA0446C8B9FFF77CFF0446A8B9F3 +S315202078B003A940F201102F70FDF7A2FC044668B9F7 +S315202078C0039A14210D4B01FB0233D6F8C022DA602D +S315202078D0D6F8DC22D6F8C8124A439A60204605B04C +S315202078E0BDE8F08F56440134B5E700BF74A92220A5 +S315202078F03884222074A8222034842220940922200D +S315202079004243464E2DE9F74F0546074606F016F91F +S3152020791008B90424DEE005F2FF3006F00FF900282E +S31520207920F7D0EB7803F0F002C02A40F0A3802B7822 +S315202079300D3303F00F03072BEBD84FF48062002181 +S31520207940B6480DF05FF86868B44E06F0F7F80028C0 +S31520207950DFD06868083006F0F1F80028D9D06A68A8 +S3152020796006F58071012005F053F80446002840F0E2 +S31520207970B1806B782A7803F00F03A94C02F00F020E +S31520207980022BA2F1020228BF0023082A636024D8F2 +S31520207990AB783F2B4FEA13101FD8E97801F00F015F +S315202079A04B1E032B19D89F4B3746D6F8C88233F85F +S315202079B010E001239C48A6F810E071827261C6E986 +S315202079C001030EFB01F30020F360824239D84FF4E5 +S315202079D07F7196480AF0C1FA3060002323709449BB +S315202079E001200CF021FA0446002873D1FFF7DAFE95 +S315202079F0002840F0BD80894D0024DFF844A26E8AFD +S31520207A00A1462F8AD5F8C8B24E4500F2C980844BAC +S31520207A10012201A940F201101A70FDF7F1FB04465C +S31520207A20002857D1019A1421824B01FB0233D5F825 +S31520207A30C022DA60D5F8DC22D5F8C8124A439A60EB +S31520207A4048E090B9BEFBF8F34B435B00B5F80AC07B +S31520207A50083704359C45BAD3AB88013008FB03F39D +S31520207A60FB630CFB08F3BB63AFE7EB88B5F804C0D8 +S31520207A706344EBE768686C49884212D14FF47F71E2 +S31520207A80281D0AF06AFA2B6898427FF442AF644B8D +S31520207A900022294661481A704FF480620CF0A4FF18 +S31520207AA09DE7B02A7FF435AF5D4E3278002A3FF429 +S31520207AB030AFC3F3030503F00F03012B3FF629AFA5 +S31520207AC006F5005683B93846FBF7E6FF044628B16B +S31520207AD086F82850204603B0BDE8F08FBB68F362B5 +S31520207AE0012386F82830F5E796F82830002B3FF436 +S31520207AF010AF3B7803F00F03072B3FF60AAF474A18 +S31520207B00083301A9684652F8338002EBC303D2F822 +S31520207B10C072D3F80490F56AFBF7F2FF04460028DA +S31520207B20D8D1019B2B44B3FBF7F399451DD307FBF3 +S31520207B3008547B1E234215D10121B4FBF7F420469D +S31520207B40FFF7F0FB58B12046DDE90021FFF7CAFAFE +S31520207B5004460028BED1FFF76DFD0446BAE742F25F +S31520207B60DB74B7E742F2DE74B4E742F2D874B1E7A9 +S31520207B70314D4FF48462FF2128460CF043FF2F4AD3 +S31520207B80012340F21C41281D2C61C5E901230AF05E +S31520207B90E4F92860FFF7E6FA044600289AD12AE776 +S31520207BA052464FF480612046FFF798FB68BB4FF47E +S31520207BB08062294650460CF007FF30BB09F10109A7 +S31520207BC03C4421E720460134FFF7C4FAA045F9D1E9 +S31520207BD04FF0000844F62964DFF840A0C1465246FB +S31520207BE04FF480614846FFF77DFAA0B1D5F8C80248 +S31520207BF0B9FBF0F0FFF7AEFA08F10108B944464583 +S31520207C00EDD8002C7FF466AF01E707FB06F80024A9 +S31520207C10B8FBFBF8DAE70446EEE700BF74A822207B +S31520207C20248422206C5721204243464E78A82220A5 +S31520207C3074A922209409222054A42220544242446A +S31520207C403484222070B50F4D2B78BBB10E4B0024E7 +S31520207C50D3F8DC62B44205D1687870B1BDE87040B3 +S31520207C60FFF780BA2046FFF729FA08B10134F1E759 +S31520207C702046FFF76FFA0028F8D070BD42F2DD705B +S31520207C80FBE700BF2484222074A8222000293CD090 +S31520207C9010283AD8DFE800F0091316233927393976 +S31520207CA039393939393939392E00194B1A7842F26E +S31520207CB0DD73002A08BF1846086000207047002080 +S31520207CC008607047134AD2E954300344D2F8580149 +S31520207CD0D2F85C2103441344DB0A0B60EDE70D4BFD +S31520207CE0D3F8C032F9E70B4AD2F8C032D2F8C822EC +S31520207CF05343F2E7074AD2E954300344D2F85801D5 +S31520207D00D2F85C2103441344E7E70420704700BFE0 +S31520207D102484222074A8222050B1064B984206D0D3 +S31520207D2003F5804398420CBF022003207047012090 +S31520207D30704700BF0080414038B5446B0246124D43 +S31520207D402C404463836B2B408363FFF7E5FF0F4B67 +S31520207D5033F91030002B0DDB5809012403F01F03C3 +S31520207D60203004FA03F30A4C44F82030BFF34F8F17 +S31520207D70BFF36F8F506B074C2043506311B1936B29 +S31520207D802343936338BD00BFC0AE80EA74572120B9 +S31520207D9000E100E0FF507F1570B50446FFF7BCFFD9 +S31520207DA0224B0D461A5C224B520113441A68D207E5 +S31520207DB005D401221A60BFF34F8FBFF36F8F42F293 +S31520207DC010724FF0807120460AF0ECF92A79A16AC8 +S31520207DD01201636C21F44C71E87902F0300203F031 +S31520207DE0E0230002E66A0A43A97900F4F85026F433 +S31520207DF0702643EA014369790B43297A090603430E +S31520207E00204601F0F8510B432968090401F470211A +S31520207E103143E16200216364A262A36C23F009034B +S31520207E20A364BDE87040FFF787BF00BF8857212095 +S31520207E300060CC402DE9F043079CC1F35C01022C65 +S31520207E4004BF0432043B12F0030660D19D074FF68F +S31520207E50FC771CBF23F003030433B3FBF7F507FBA2 +S31520207E60153707B10135022C0AD14FF0000C05E059 +S31520207E7050F83C70FF0714D50CF1010C8C45F7D136 +S31520207E80AF198F4201D9002C44D007F1010C8C4523 +S31520207E9001D9002C3ED131464FF6FC7800F1040959 +S31520207EA01AE06646ECE7434526D8002B14BF9C46AD +S31520207EB04FF0040C002B49F831200EBF4FF0000E56 +S31520207EC04FF0210EA3EB0C034EEA0C4E40F831E086 +S31520207ED02CF0030E013172448F42E4D806F100566D +S31520207EE0013E64B9354450F8353043F0020340F85A +S31520207EF035300020BDE8F0834FF6FC7CDAE700EB36 +S31520207F00C703054A5A60054B40F83730F1E741F65A +S31520207F106810EFE70320EDE7C4C6222021000400E5 +S31520207F202DE9F0471568044675B1EB785E1E73423D +S31520207F307341276B17F4805708D04FF4805341F6AE +S31520207F4069102363BDE8F0872B46F2E7D2F8048038 +S31520207F50002D39D1A36C4FF0000923F00103A3642F +S31520207F60A36A23F44073A36208F1200229462046FF +S31520207F700AF006F80646002840F0D78041462046DB +S31520207F800AF0D5F8002D35D0EB78002B32D0B9F178 +S31520207F90000F4DD0664A236B1342FCD0590142D4A0 +S31520207FA0644A134204D0AA78002A3FD0C3F300564D +S31520207FB0EB78032B04D11EB95F4B1A68EB681A6045 +S31520207FC05E4B30462363BDE70029C3D0002BC1D1A9 +S31520207FD0EB78022B0CD0032B0CBF022300232A463E +S31520207FE020460AF0FFF90028B4D14FF00109BBE75B +S31520207FF00123F4E7524A236B1342FCD058010DD4B7 +S3152020800013F4702F0DD1414620460AF019F84D4B16 +S315202080102363002D96D0002894D1B8E741F66A1024 +S31520208020F5E70120F3E741F66A16C1E70126BFE707 +S315202080306B68D5E9022003F00301002838D019B156 +S3152020804023F0030304336B606F680020DFF8FC9075 +S315202080504FF0B8787A439708874216D9002300E054 +S31520208060236B13EA090FFBD0EA78012A06D19A0658 +S3152020807004D544F220030020236363E7590106D563 +S315202080804FF0806341F66A162363022399E713F0A3 +S31520208090B87F05D0AB78C4F830800BB90126F4E739 +S315202080A002462946204609F0F9FF20232363D3E7F9 +S315202080B019B123F0030304336B606B680020DFF8CB +S315202080C090A04FF0B8795A434FEA9208804516D9A6 +S315202080D0002300E0236B13EA0A0FFBD05A0105D5B3 +S315202080E04FF0806341F66A1023632BE713F0B87FA5 +S315202080F007D0AA78C4F830901AB91F460126124B09 +S3152020810008E002462946204609F0ECFF1023236387 +S31520208110DCE7276B1F42FCD017F0B87F3FF451AF26 +S31520208120AA78002A08BF01264BE704200AE700BFC9 +S315202081300200701500007011C4C62220024070155E +S3152020814001000F0001000F040200700120007005BD +S3152020815010007005024B034A1B68516802481847D5 +S3152020816080AC222074AC222000804140024B034A5E +S315202081701B6891680248184780AC222074AC2220C4 +S3152020818000C041402DE9F347434E90460022054644 +S3152020819089461F461146F369104696F801A098474E +S315202081A08DB3337CAB4230D0737CAB422FD0B37CA3 +S315202081B0AB422ED0F37CAB422DD0337DAB422CD09C +S315202081C0737DAB422BD0B37DAB422AD0F37DAB421D +S315202081D029D0347EAC420CBF092400247378092B85 +S315202081E004D1B9F1FF0F88BF45F00805BAF1090F70 +S315202081F08DF8005008BF4FF0080A032C15D8012C03 +S3152020820016D8012121E02C46E8E70124E6E70224BE +S31520208210E4E70324E2E70424E0E70524DEE7062456 +S31520208220DCE70724DAE70824D8E7E31F012BE8D880 +S31520208230BAF1010148BF0AF10601CB100021581CD2 +S31520208240CAB20131904210D8991CF369022268469D +S315202082509847054628B98FB90021F3690322084695 +S315202082609847284602B0BDE8F08702AD15449A1AF1 +S31520208270D20029FA02F205F8072CE1E7013CF3693E +S3152020828039464046012C8CBF0122022298470028DD +S31520208290E2D00546E5E700BF84AC2220114B73B51A +S315202082A01E7DE6B15D7DD5B101230DF107020021AA +S315202082B03046FFF767FF04460028F5D19DF80730A2 +S315202082C09A0709D40346024601462846FFF75AFF55 +S315202082D09DF807309B07E7D5204602B070BD42F6B1 +S315202082E0D014F9E784AC2220084B13B51C7D01233A +S315202082F00DF1070200212046FFF744FF0028F6D182 +S315202083009DF8070000F0010002B010BD84AC2220A9 +S3152020831070B5164D04460E462022002128460CF024 +S3152020832071FB2378012B1AD86378202B1AD8033B8C +S315202083300122616802FA03F3994213D8B1F5006F3E +S3152020834010D31C22214628460CF04EFB6B68EE618A +S31520208350B3F5007F01D109236B70002001E042F69E +S31520208360CE1070BD42F6CF10FBE700BF84AC222092 +S3152020837030B4134685180B4A5468A54208D8947CF5 +S3152020838054B163B10A460146204630BCFFF7FABEF7 +S3152020839042F6CC1030BC704742F6D010FAE7184689 +S315202083A0F8E700BF84AC22202DE9F0471C4F144665 +S315202083B0821805467B680E469A422ED897F8119049 +S315202083C0B9F1000F03D142F6D010BDE8F087D7F8D7 +S315202083D008800CB92046F8E7FFF760FF0028F4D183 +S315202083E0324629464846B5FBF8FA08FB1A5AA8EB26 +S315202083F00A0AA24528BFA246534655445644A4EB12 +S315202084000A04FFF7BFFE0028DFD13B7D002BDAD000 +S31520208410FFF76AFF0028FBD1DBE742F6CC10D4E732 +S3152020842084AC22202DE9F041204D471804466B6864 +S315202084309F4237D895F81780EE68B8F1000F2BD1D8 +S3152020844095F81680AE68B8F1000F25D12B781BB988 +S3152020845042F6D010BDE8F081012B1DD1BDE8F041B8 +S315202084600AF02CB8FFF71AFF0028F3D1034602465C +S3152020847021464046FFF786FEB4FBF6F306FB134261 +S3152020848072B103FB06640028E4D12B7D002BDFD0BC +S31520208490FFF72AFF0028FBD1BC42E3D30020D9E7EF +S315202084A03444F0E742F6CC10D4E700BF84AC222037 +S315202084B070B5124D2E7E4EB92B78DBB1012B05D10E +S315202084C069683046BDE8704009F0F8BFFFF7E6FE40 +S315202084D0044668B90346024601463046FFF752FE57 +S315202084E0044628B92B7D2BB1FFF7FEFE0028FBD1B1 +S315202084F0204670BD42F6D014FAE700BF84AC222075 +S3152020850073B590F85D3004460D46012B1BD1104ED5 +S315202085103378022B06D10822002171200AF095F902 +S31520208520A46905E00622052178200AF08EF97468D0 +S31520208530014601AB0022204600F040FF08B9019BEE +S315202085402B7002B070BD082200217020E6E700BF04 +S3152020855024AE222037B500220D461146019209F07D +S31520208560C7FF044630BB0422022105200AF06DF9FC +S315202085702246014601AB284600F020FF0446C8B912 +S3152020858001460322E0200AF060F92246014601AB8B +S31520208590284600F013FF044660B9084B98694FF42B +S315202085A07A73002808BF4FF4FA70B0FBF3F001303D +S315202085B002F054FE204603B030BD00BF24AE222058 +S315202085C02DE9F04F1D46B0F85430E3B00446B3F5FC +S315202085D0807F914600916ED1D0F8A0708022836D45 +S315202085E0002102A8B7FBF3F70CF00CFA94F8576099 +S315202085F0002E4AD04FF48072FF2122A80CF002FAD6 +S3152020860002AB0022BA4246D1637A012B4BD1009B82 +S3152020861022A9D4E92802034418460AF00FF963B0A8 +S31520208620BDE8F08F0023A26D22932DB3954209EB4E +S315202086300A0112D3AD1A22AAB4F85800019102F0E9 +S31520208640A9FC229B02AA019942F8283008F10108A8 +S31520208650A36D9A44B845E5D1CCE72A4617480CF0B5 +S31520208660C3F9A26DFF210BEB0500521B0CF0CAF9B2 +S31520208670002312491D46DEE7002EDCD1FF21584675 +S315202086800CF0C0F901265946D5E74946B246B046F0 +S31520208690DFF828B0DEE722A953F8040B01EBC2014C +S315202086A001324860AEE733B9D4F8A42022A9204667 +S315202086B00AF06AF8B3E70020B1E700BF34C42220CD +S315202086C030B590F8563085B004460D468B423ED0C4 +S315202086D090F850309BBB1F4A127F82B3ADF80C30E6 +S315202086E0012901A9CDE901334FF0EF038DF804309C +S315202086F04FF09003ADF806301CBF08238DF80830C4 +S3152020870090F82130102B04BF4FF49073ADF806302B +S3152020871009F068FF88B9EE238DF8080001A92046C4 +S315202087208DF8043009F05EFF38B99DF80830082B03 +S3152020873014BF45F2DD2084F8565005B030BD45F2F1 +S31520208740D62045F2DB23002D18BF1846F5E700205A +S31520208750F3E700BF24AE222073B500260422044668 +S315202087600D469020012101960AF06FF801AB0146B3 +S315202087703246304600F022FE78B90D4B94F85C2024 +S315202087809868B0F57A7F38BF4FF47A70012A06D1DF +S315202087900146204609F0ACFE18B102B070BD02F0A9 +S315202087A05DFD012302222946204609F0AEFFF4E78B +S315202087B024AE22202DE9F34704462A4FFD6802F0F5 +S315202087C033FDB4F85E3006464FF47A708A46584315 +S315202087D002F038FD8146884602F026FD831B61EB98 +S315202087E00A02994578EB020338D394F85530012BA9 +S315202087F013D1B4F86000BB68984238BF1846C0B27F +S3152020880094F85C301BBB8DF8073002F027FD94F8D6 +S315202088105530012B06D0002013E00BB1E8B2EFE74C +S31520208820387BEDE70DF107012046FFF769FE40B9B9 +S315202088309DF80730DB0707D4204609F0A0FE002844 +S31520208840E9D002B0BDE8F08745F2DC20F9E7012B1C +S31520208850E1D100F0ABFD0028FBD0DCE745F2D020AB +S31520208860EFE700BF24AE2220002273B50D46114625 +S315202088700646019209F03CFE044698B9124B042282 +S3152020888001461B78022B10D109F0DFFF2246014634 +S3152020889001AB284600F092FD044618B93046FFF772 +S315202088A089FF0446204602B070BD09F0CEFF22463D +S315202088B0014601AB284600F081FD04460028F1D16F +S315202088C0014603223020DFE724AE22202DE9F04F77 +S315202088D0C04F044689B02022002138460CF092F859 +S315202088E019262D234FF4167CC7E9026340F6B833A8 +S315202088F0C7E904C394F8523013B100233B700AE031 +S3152020890094F82230042B4FD8012202FA03F313F0D5 +S31520208910150F49D03A70B4F85430A3F580756B42C0 +S315202089206B4184F825303B78002B3FD194F8533087 +S31520208930212201210825053B0420012B9FBF94F8E5 +S315202089402030B3FA83F35B0984F8203000237B7030 +S31520208950062384F84010002184F8435084F84400EC +S3152020896084F8455084F84600204684F8411084F83F +S31520208970421084F84C1084F8472084F8482084F844 +S31520208980492084F84A3084F84B2000F051FD0546D2 +S3152020899030B93E7886B194F85430002B00F0D68139 +S315202089A0284609B0BDE8F08F0223A7E700231A4600 +S315202089B019461D461846CCE702220121FF2005969E +S315202089C009F043FF3246014605ABA06900F0F6FCCC +S315202089D032464FF47A71204609F08AFD00BB4FF4C7 +S315202089E0807231467C480CF00DF804220121EC20BF +S315202089F0059609F02AFF05AB01463246304600F09F +S31520208A00DDFC68B9B96894F85C20B1F57A7F38BF67 +S31520208A104FF47A71012A05D1204609F069FD20B14B +S31520208A200546BDE7084602F019FC01234FF4807263 +S31520208A306949204609F069FE0028F1D1DFF898819E +S31520208A40DFF89C91D8F800304B455CD14FF0000AD6 +S31520208A5004A8ADF814A00BF085FDFE22414604A8FB +S31520208A600BF084FD05A904A80BF079FDB8F8FE20AB +S31520208A70BDF814309A4246D10723584A84F85030FC +S31520208A805346DFF860C110460C2110F8019B1CF8D4 +S31520208A9001EBF14540F067810139F6D184F8503059 +S31520208AA098F80830C3F38002C3F3C00303923A77C1 +S31520208AB0D8F8502084F85D300023C4F8A02052082E +S31520208AC0002A3CD194F82120082A3BD184F823304F +S31520208AD0B8F85430C4F8A430D8F85C30C4F8A8309C +S31520208AE0D8F86030C4F8AC3098F86430C4F8B03088 +S31520208AF098F86530132B6BD028D8112B76D0122BD3 +S31520208B0072D0002327E001234FF48072414620466D +S31520208B1009F0FBFD002883D105A92F4A0423CDF88F +S31520208B20149011F801EB12F801CBE64508BF01306D +S31520208B30013BF6D1012885D845F2D52530E70133EA +S31520208B405208BDE7102AC3D1013BBFE7212B3DD0D8 +S31520208B50222BD6D1022384F8223094F85330072BA7 +S31520208B6006D198F88130980642D5062384F85330CA +S31520208B7098F8871098F8880098F8853001EB00201F +S31520208B8098F8861098F88AC003EB012398F8891064 +S31520208B90800801EB0C219B08786189083B61B9602C +S31520208BA098F88B3098F88C1003EB0123BB613B7827 +S31520208BB0002B40F0B08094F85330023B042B00F277 +S31520208BC0A880DFE803F0A4A29F9D26000423C2E705 +S31520208BD00123C0E724AE222024AD2220F3572120D2 +S31520208BE04F4E464944AD22200323B4E70723B2E75C +S31520208BF0D90601D50523B9E7180701D50423B5E7FA +S31520208C00590701D50323B1E79B074CBF0223012334 +S31520208C10ACE705237B7094F82030B3FA83F35B0905 +S31520208C2084F820307B780D21524803FB011143180C +S31520208C30465C197A5F780291597A93F802C093F8A4 +S31520208C4003E093F8048093F8059093F806A093F810 +S31520208C5007B0D87A0191997A1B7B84F8426084F8F0 +S31520208C604730454E019B84F8491084F84A30717864 +S31520208C70029B84F840B084F84B304B1E84F841A0E8 +S31520208C80042B84F8439084F8448084F845E084F8C3 +S31520208C9046C084F84C7084F8480049D8039B002BA2 +S31520208CA046D00023102A2046ADF81C30CDE90533C6 +S31520208CB04FF0EF038DF8181005A98DF814304FF0DA +S31520208CC00103ADF8163004BF0223ADF8163009F0A3 +S31520208CD089FC00287FF4A4AEEE238DF8180005A980 +S31520208CE020468DF8143009F07DFC00287FF498AEBC +S31520208CF09DF8182073789A421AD045F2D7254FE648 +S31520208D00042387E703237B708CE70223FBE70123D9 +S31520208D10F9E70023F7E70023184619469B469A468B +S31520208D20994698469E469C461F46CDE9013394E7B0 +S31520208D30204600F07DFB00287FF472AE0F492046A6 +S31520208D40FFF70AFD00283FF426AE69E694F8551071 +S31520208D5029B9204609B0BDE8F04FFFF7B1BC01295B +S31520208D607FF41EAEF5E701330C32072B7FF489AE54 +S31520208D7096E600BF8B57212024AE222032C4222003 +S31520208D802DE9F04F1E46D0F8A0309146C2695943AE +S31520208D90C7B004468A4240F22981B342C0F02981D5 +S31520208DA009F05BFD637A954F0546012B78600FD13C +S31520208DB001462046D4F810A0FFF756FD804680B9FC +S31520208DC05546204609F0F2FB78B945F2D42808E02A +S31520208DD0002BF6D101462046FFF746FD8046002887 +S31520208DE0EFD0404647B0BDE8F08FB4F85420B2F516 +S31520208DF0807F79D1FF2106A8D4F8A0A0D4F858B036 +S31520208E000BF000FE627A012A0CD1236906A9B5FB54 +S31520208E10F3FCD4E928020CFB030009F007FD804669 +S31520208E2008B1DEE7AAB106AA4FF4807312F8011B17 +S31520208E30FF2940F0E180013BF8D101238022002147 +S31520208E406F487B770BF0DEFD6D4A0023BAFBFBFAD9 +S31520208E5048E03B78022B34D111462046059209F072 +S31520208E6047FB80460028BCD101460422502009F029 +S31520208E70ECFC4246014605AB284600F09FFA804688 +S31520208E800028AED1B4F860100122BB682046994252 +S31520208E9038BF194609F02CFB80460028A1D103466D +S31520208EA0D4F8A42006A9204609F02FFC80460028C5 +S31520208EB097D13B7829462046022B09D1FFF7D4FCAF +S31520208EC0ADE7D4F8A01020462944FFF743FBE3E77B +S31520208ED0FFF740FBA3E706A901EBC301013349684D +S31520208EE042F8041B9A45F6D1DFF818A10AF5007B33 +S31520208EF00EB9B04675E7637A012B34D14FF4007250 +S31520208F005146284609F092FC804600287FF469AF16 +S31520208F10B4F85430B3F5807F14D194F857308BB9F8 +S31520208F20D4F8A020A36D3749B2FBF3F30193637ADB +S31520208F30012B0ABF2369A846A5EB03080023019A23 +S31520208F409A4219D1B6F5007FB0465146484628BFE9 +S31520208F504FF4007842460BF047FDEB4398453AD92B +S31520208F604FF003083DE7002BD2D14FF40072514633 +S31520208F70204609F0CAFBC7E7D4F8A0C0A06DB8FBED +S31520208F80FCF20CFB1282B2FBF0F29A4221D10A4665 +S31520208F9000EB010C624502D17A7FAAB904E012F8CF +S31520208FA001EBBEF1FF0FF5D0154A80B202EB83020A +S31520208FB0CDE9021302F09AF8A0F5A640343801280C +S31520208FC0DDE902133FF601AFA26D11445945B9D20E +S31520208FD090440133B3E76FEA090345449845BFD847 +S31520208FE0B045C144BCD8A6EB080681E745F2D12876 +S31520208FF0F7E645F2D328F4E600231FE724AE222005 +S31520209000A4AC222034C422202DE9F341D0F8A83064 +S315202090100F46D0F8A01005464B4307FB03F1C36942 +S315202090208B4247D909F019FCDFF8948000220646A6 +S31520209030C8F8040028461146019209F059FA044638 +S31520209040A0BB04220521602009F0FFFB2246014611 +S3152020905001AB304600F0B2F9044638BB0322052185 +S31520209060D02009F0F2FB2246014601AB304600F023 +S31520209070A5F90446D0B9B5F860100246D8F81430C0 +S315202090802846994238BF194609F032FA044668B96B +S31520209090284609F08BFA80B195F8E03033B9D5F817 +S315202090A0A820284607FB02F109F0E4FA204602B060 +S315202090B0BDE8F08145F2D124F8E745F2D424F5E73E +S315202090C024AE22202DE9F04F1F4687B0D0F8A030BD +S315202090D01646039104465943C2698A4240F2B38018 +S315202090E0BB42C0F0B38009F0B8FB5B4B804658608A +S315202090F0637A012B5BD123690193002320461946ED +S315202091001A46059309F0F4F9014600286BD104226A +S315202091100290802009F099FB029905AB0A46014668 +S31520209120404600F04BF9014600285CD13D46824658 +S315202091300290D4F8A03053453ED801993B4632467A +S315202091402046FFF73DFA014600284CD10222059001 +S315202091500190102009F079FB019905AB0A460146BA +S31520209160404600F02BF9014600283CD13A4B0A46CE +S31520209170B4F860001B6901469842204638BF19463C +S3152020918009F0B6F9014670BB0190204609F00EFA87 +S3152020919000285ED094F8E030019923BB3B46324626 +S315202091A00399204607B0BDE8F04F09F08ABA002B74 +S315202091B00CBF034600239FE765B3B5F5007F16D382 +S315202091C025F4FF79B34629F00109A5EB0905637A31 +S315202091D0012B2FD1019B4A46594603EB0A0009F061 +S315202091E02DFB014638B3084607B0BDE8F08F2A4646 +S315202091F006EB0A0119484FF400790BF0F5FB174BC3 +S31520209200C5F50072FF215819DFF850B000250BF064 +S31520209210F9FBDCE7029B002BD9D14FF40072FF210A +S315202092200E484FF400790BF0EDFB0123DFF82CB02C +S315202092300293CCE70BB1CA447BE74A4659462046DF +S3152020924009F0A2FACDE745F2D121CCE745F2D32188 +S31520209250C9E745F2D421C6E724AE222034C42220F1 +S31520209260094BDA6BD207FCD5DA6B42F00102DA63BE +S31520209270D86B10F0020005D0DA6B45F2092042F0B7 +S315202092800202DA63704700BF00400D40084BD3F836 +S31520209290C020D20701D500207047DA6B5107F6D5BA +S315202092A0DA6B45F20A2042F00402DA63704700BFE7 +S315202092B000400D40431E032B22D8134B0428C3F80D +S315202092C09400D3F8982022F00E02C3F8982015D0C7 +S315202092D0D3F89820032842F00802C3F898200DD00E +S315202092E0D3F89820012842F00402C3F8982005D10B +S315202092F0D3F8982042F00202C3F898200020704725 +S3152020930045F20C20704700BF00400D40044BD3F897 +S31520209310940000F00700431E032B88BF04207047CB +S3152020932000400D40094B01F1254110B4DC6B01F5BD +S31520209330B40144F00104DC63C3F8A0205DF8044B9B +S31520209340C3F89000C3F89C10FFF78ABF00400D4059 +S315202093502DE9F041144E1D4601F125419DF8187046 +S31520209360F36B144601F5B4019DF81C8043F00103EC +S31520209370F363C6F89000C6F89C10FFF771FF50B92A +S31520209380D6F8B030B8F1000F07D0102F18BF082715 +S315202093902544A54203D1BDE8F0810827F8E704F843 +S315202093A0013BFB40F5E700BF00400D40024BD3F8C0 +S315202093B0C000C0F34000704700400D40F8B51B4D5B +S315202093C01F4601F00F04EB6B062C43F00103EB63E1 +S315202093D02AD00A2C28D01CB3012C21D0A4F1080392 +S315202093E05E425E41072C05D1C5F890000F4BC3F88D +S315202093F0A02006E00B2CF7D00C4B092CC3F89000AC +S31520209400F4D001F12541094C01F5B401C4F89C1092 +S31520209410FFF726FF18B916B1D4F8B0303B60F8BD57 +S315202094200126C5F89000E1E70126E5E700400D403A +S3152020943038B502680446B14B9A4240F04A8106F07C +S31520209440FBF8204606F036FD207B072800F24381D4 +S3152020945006F0D4F806F0E8F8A94B1A6822F00202A2 +S315202094601A601A6842F001021A601A6812F0010284 +S31520209470FBD1BFF34F8FBFF36F8F196841F00201E5 +S315202094801960217A012940F02981196A94F821004E +S3152020949001F47C61196221691D6A21F47F6121F022 +S315202094A00F01294319626369B3F1004F02D945F2AE +S315202094B00B2038BD5B0B511C002B36D19049520016 +S315202094C00D6A02F03E022A430A620A6A42F001022B +S315202094D00A620A6B02F47C620A63A2690D6B22F48B +S315202094E07F6222F00F022A430A63E269B2F1004F1B +S315202094F0DDD8520B5D1CDAB95B000D6B03F03E0301 +S315202095002B430B630B6B43F001030B634B6803F078 +S315202095107F434B6094F83010794B042900F2E18088 +S31520209520DFE801F0BEC2C6CA09005B080A46C2E7C8 +S3152020953052082B46DEE7596841F0040159605968E4 +S315202095405960196821F08001196094F831101D683E +S31520209550C901C9B229431960196D21F4FE6121F090 +S315202095600101196594F820101D6DC901C9B229433E +S31520209570196594F82430591E3F2900F2B5805B08DE +S31520209580511C002B40F09C805D4B12010828196D40 +S3152020959002F0700242EA01021A6540F094801A6DA8 +S315202095A01A6594F8252094F82330012A04BF013324 +S315202095B0DBB2A3F10902072A00F29C805049C3F1AD +S315202095C010030A6DDBB242EA03230B6594F8403080 +S315202095D094F8422003F00F0343EA027394F84C20B8 +S315202095E0120602F07062134394F84620120502F404 +S315202095F07002134394F84520120402F47022134378 +S3152020960094F84420120392B2134394F84320120272 +S3152020961002F47062134394F841201201D2B213430C +S315202096204B6594F84B3094F84A201B06920403F09D +S315202096307C5302F47C02134394F8472002F03F0225 +S31520209640134394F84920120302F47C32134394F8EE +S315202096504820920102F47C6213438B6594F82230D1 +S3152020966003F00703CB65274B8B6009F042F80028CF +S315202096707FF41FAF0D68244BA27B2B4043EA024286 +S31520209680637B1B0603F0F8531A43E37B9B0003F00E +S31520209690040313430B600B6823F002030B6008E7D7 +S315202096A0596841F0400149E7596841F4806145E70E +S315202096B0596841F4804141E7596841F480213DE7CA +S315202096C05B080A465CE7102811D11A6D42F0010288 +S315202096D066E70420EDE645F21220EAE645F2082068 +S315202096E0E7E645F20F20E4E645F21020E1E645F2D2 +S315202096F00E20DEE645F21120DBE600BF53454D4322 +S3152020970000400D4085404000FBFF00E010B58CB0A6 +S31520209710044600211C2205A80BF074F900230321FE +S31520209720206801934FF40033CDE90313012301A9C7 +S315202097308DF8153003AB0293A36A984718B1064BD0 +S31520209740069A134023B902230020A3640CB010BD2F +S3152020975040F20970FAE700BF0800F9FF10B590F82B +S3152020976090320446094AC3F3C30103F0070352F893 +S315202097702120074951F8233053430A22D0E90001FA +S31520209780B3FBF2F208F035FD606410BDA04E212017 +S31520209790904E2120F0B58DB004461C22002105A82C +S315202097A003AD0BF02FF90D230026104F0393A36C46 +S315202097B01B04049301238DF81530002201A920468D +S315202097C0CDE9016509F0C8F950B9069B3B420AD17B +S315202097D0DA05F2D5C3F34323072BEED00DB0F0BD27 +S315202097E040F20970FAE74FF4E360F7E78800F9FFC3 +S315202097F010B58CB000210446202204A801910BF03C +S3152020980001F90C23022201A90393032320468DF874 +S3152020981015208DF81430064B0A9303AB029309F0DA +S315202098209BF940F20973002818BF18460CB010BDCA +S315202098300800F9FF2DE9F0438DB01C220F46804603 +S31520209840002105A80BF0DEF8002340F6B939019354 +S315202098500123CDE9033704238DF8153003AB02937A +S3152020986001F0E2FC06461B480D4601F0EBFC3618BB +S3152020987045EB0105D8F8283001A9D8F800009847EB +S31520209880044620BB069BC8F874328FB9002B14BF20 +S315202098903C460524B9F1010906D02CB101F0C4FCBF +S315202098A0B04271EB0503E5D320460DB0BDE8F08329 +S315202098B0002B0ADAC3F34173022BEBD1D8F85030B0 +S315202098C043F48073C8F85030E4E70524E2E740F2F9 +S315202098D00974E9E740420F0001392DE9F04F81460E +S315202098E093B0484C05296ED8DFE801F065036D6DED +S315202098F065034FF6FF754AF655234FF0080BA84609 +S31520209900236099F80C30012B61D0022B07D0002B35 +S3152020991074D1236898FA88F81BBA23602DBA20229E +S3152020992000210AA84FF0010A0BF06CF81022002122 +S3152020993009AF0DEB02000BF065F8132302A9D9F825 +S315202099400000099304AB8DF82DA002938DF812A068 +S31520209950D9F8283008940397CDE905BA98472A4B99 +S315202099600C9A1A4052EA00013BD120220AA82668E6 +S31520209970019121600BF046F81422019904A80BF0DE +S3152020998041F804AB0E2202A902930992D9F80000CD +S31520209990D9F828208DF82DA08DF812A007940397AA +S315202099A0CDE905BA90470C9A174B134003431DD097 +S315202099B040F2217017E05A23FF2523604FF0FF083D +S315202099C04FF0040B9DE78023C0252360F6E723680C +S315202099D05BBA98FA98F06DBA1BBA90FA80F8236091 +S315202099E09CE74FF4E46013B0BDE8F08F2068704008 +S315202099F000EA0800401B18BF0120F4E74FF4E1607D +S31520209A00F1E700BF44AE22200800F9FF30B520221E +S31520209A1091B0044600210DEB02000AF0F3FF02ABC1 +S31520209A2014220021184604F174050AF0EBFF0822BF +S31520209A30A36A69460792012205958DF8252004926E +S31520209A404FF40072039207AACDE9000220689847B6 +S31520209A50A14B0A9A1340034340F03881237B012BE4 +S31520209A6000F02081022B0BD0002B40F032812B4698 +S31520209A7004F51D711A6812BA43F8042B8B42F9D1CA +S31520209A8094F8043194F8052194F8510103EB02222D +S31520209A9094F8033194F8541103EB022394F8082107 +S31520209AA043434B43C4F8EC3294F8073103EB0222AC +S31520209AB094F8063103EB022394F80B2143434B43BE +S31520209AC0C4F8F03294F80A3103EB022294F80931D3 +S31520209AD003EB022394F80E2143434B43C4F8F4327C +S31520209AE094F80D3103EB022294F80C3103EB022378 +S31520209AF043434B43C4F8F83294F8213184F8AA32F0 +S31520209B0094F8223184F8AB3294F8233184F8AC329D +S31520209B1094F8253184F8AD3294F8263184F8AE3283 +S31520209B2094F8273184F8AF3294F8293184F8B0326A +S31520209B3094F82B31226D84F8B13294F82D3184F8A3 +S31520209B40B23294F82F3184F8B33294F8313184F834 +S31520209B50B43294F8333184F8B53294F8343184F819 +S31520209B60B63294F8363184F8B73294F8103184F826 +S31520209B70A83294F8623284F8DD3294F8383184F8A9 +S31520209B80B832134394F83921236584F8B92294F8FE +S31520209B903C2184F8BA2294F83D2184F8BB2294F8FB +S31520209BA03E2184F8BC2294F83F2184F8BD2294F8E3 +S31520209BB0602194F84B5184F8D22294F8612184F8BC +S31520209BC0D32294F8622184F8D42294F8632184F84D +S31520209BD0D52294F8712184F8DC2294F8412184F846 +S31520209BE0BE2294F8422184F8BF2294F8432184F897 +S31520209BF0C02294F8442184F8C12294F8452184F87F +S31520209C00C22294F8462184F8C32294F85E2184F84F +S31520209C10D02294F85F2184F8D12294F84A21120484 +S31520209C2002EB056294F848512A4494F8495102EBF4 +S31520209C300522DD05C4F8C42248BFC4F8E42294F8DE +S31520209C404D2184F8CB0284F8C82294F84F2184F839 +S31520209C50CE1284F8C92294F8502184F8CA2294F886 +S31520209C60522184F8CC2294F8532184F8CD2294F8DA +S31520209C70552184F8CF2294F856211202C4F8E822DE +S31520209C8094F85821D00717D543F400732365D4F8C8 +S31520209C906D310020C4F8D83294F86C3284F8DE3244 +S31520209CA011B030BD2B4604F51D711A6852BA43F8FF +S31520209CB0042B9942F9D1E3E6910702D543F4806338 +S31520209CC0E4E75207E3D543F40063DFE740F2097067 +S31520209CD0E6E74FF4E160E3E70800F9FF2DE9F041DC +S31520209CE08CB005460F46164600211C2205A898460C +S31520209CF00AF088FE00239DF848400222019306237D +S31520209D0024062846039344EA08438DF8152043EA7F +S31520209D1007010C4B41EA06210A9303AB049101A9C2 +S31520209D20029308F019FF48B92846FFF733FD00288B +S31520209D3018BF4FF4E3600CB0BDE8F08140F2097003 +S31520209D40F9E700BF8800F9FF90F8403070B5044647 +S31520209D50002B00F0F58090F82D10006806F04CFBC3 +S31520209D6094F83830A3B1206806F0CEFA94F839104A +S31520209D70206806F011FB206B01F070FA94F8391058 +S31520209D80206881F0010106F007FB606B01F066FA7E +S31520209D9094F83A304BB1206806F012FB2268D2F8AC +S31520209DA0C03043F00203C2F8C03020682546734AEB +S31520209DB0836A616823F00603836208F01AFA6064D6 +S31520209DC055F8140B42F2107108F06AFA20682946D9 +S31520209DD008F0F9F9A16A206809F0D1F9014600288E +S31520209DE040F0B1802046FFF725FD10B140F21470D7 +S31520209DF070BDD4F8743294F83A2013F0C04F1EBFA9 +S31520209E00236D43F480732365E369B3F5007F2CBF6C +S31520209E104FF080430023002A3AD143F47F0141F4B6 +S31520209E2000412046FFF706FD0028DFD1204608F016 +S31520209E304BFD002840F08A802046FFF767FC00284B +S31520209E4040F08780204608F083FD002840F084805B +S31520209E502046FFF783FC0121204608F05FFE0028DC +S31520209E607DD12046FFF7D2FD00287BD14FF400720A +S31520209E70A16A206800F072FF002876D194F82C3051 +S31520209E80012B08D0023B012B4FD84FF4E160AFE7DE +S31520209E903B491943C5E794F82D20236D053A012A1D +S31520209EA005D813F00C0F21D140F20C70A0E79A07A9 +S31520209EB01ED4DB07F8D5334E0121204608F080FE3C +S31520209EC0002855D194F82D50053DEDB2012DD4E929 +S31520209ED0000194BF7208324608F08BF96064204650 +S31520209EE008F0C5FE30B140F2127081E7264EE3E736 +S31520209EF0264EE1E7012D0ED83246D4E9000108F09E +S31520209F0078F9236860649A6C22F040029A649A6CED +S31520209F1042F008029A64012384F80633204608F08A +S31520209F206DFE40BB84F8000362E794F82D30053B94 +S31520209F30012BB9D9204608F09AFE0028EED0D2E788 +S31520209F4040F22E7054E740F2137051E740F20D7024 +S31520209F504EE740F21A704BE740F20F7048E74FF475 +S31520209F60E26045E740F21C7042E740F20A703FE784 +S31520209F7040F21B703CE740F21F7039E7E093040063 +S31520209F808080FF0080BA8C0100EA32060075190312 +S31520209F902DE9F04F904693B01A460446019141464A +S31520209FA01D4608F06EFC814600286DD12E460746B8 +S31520209FB0002E5AD0226A0DF1240B0DF1100A002111 +S31520209FC0B242584636BFB31A002316464FF0240213 +S31520209FD034BF009300930AF015FD14220021504629 +S31520209FE00AF010FD0022CDE90222D4F8E022B2F5B3 +S31520209FF0007F44D3E269B2F5007F40D32046FFF7A5 +S3152020A000C9FB002838D1019B4FF40072216D2046D0 +S3152020A010CDE9052503EB47220792012295428DF8AB +S3152020A020102014BF12221122CB05194B099207EBBF +S3152020A030080202A910930A925CBF52020A920122B8 +S3152020A040CDE902AB8DF82D2008F086FDD0B9012D63 +S3152020A0500FD99DF8102062B994F84C204AB9204691 +S3152020A060FFF7C6FB28B140F21779484613B0BDE862 +S3152020A070F08F3744009E9BE74FF4E369F5E740F2E3 +S3152020A0800C79F2E78146F0E74FF00409EDE700BFAF +S3152020A0900800F9FF2DE9F04F904693B01A46044662 +S3152020A0A0019141461D4608F0ECFB8146002871D1DE +S3152020A0B02E460746002E5ED0226A0DF1240B0DF186 +S3152020A0C0100A0021B242584636BFB31A002316463C +S3152020A0D04FF0240234BF009300930AF093FC1422FD +S3152020A0E0002150460AF08EFC0022CDE90222D4F827 +S3152020A0F0E022B2F5007F48D3E269B2F5007F44D34F +S3152020A10021684A6AD201FCD52046FFF743FB002866 +S3152020A11038D1019B4FF40072216D2046CDE90525CB +S3152020A12003EB47220892012295428DF8102014BF76 +S3152020A13019221822CB05194B099207EB080202A9EE +S3152020A14010930A925CBF52020A920122CDE902ABF9 +S3152020A1508DF82D2008F000FDD0B9012D0FD99DF8BE +S3152020A160102062B994F84C204AB92046FFF740FBCC +S3152020A17028B140F21779484613B0BDE8F08F37440E +S3152020A180009E97E74FF4E369F5E740F20C79F2E772 +S3152020A1908146F0E74FF00409EDE700BF0800F9FFFC +S3152020A1A02DE9F0418CB004460F46904603AD24227B +S3152020A1B0002128460AF026FC0023CDE9013394F815 +S3152020A1C00033072B61D8DFE803F004353560383BB0 +S3152020A1D03E41D4F8E432D4F8FC62B3FBF6F006FB19 +S3152020A1E0103303B1013087424FD880454DD822689D +S3152020A1F0536AD901FCD5236D774306FB08F6002246 +S3152020A200DB054FF0230301A9204658BF7F02029584 +S3152020A21058BF7602CDE9033701231D4F8DF815301F +S3152020A2200A9708F099FC024698B140F209700CB0C2 +S3152020A230BDE8F081D4F8E832CDE7D4F8EC32CAE78D +S3152020A240D4F8F032C7E7D4F8F432C4E7D4F8F83299 +S3152020A250C1E7242301A9CDE901052046CDE903360E +S3152020A26008F07AFC02460028DFD1262301A90A9786 +S3152020A270CDE903300223CDE9010520468DF815309E +S3152020A28008F06AFC0028D2D0CFE70420CFE700BF11 +S3152020A2900800F9FF2DE9F04705460F46164640F2FD +S3152020A2A0097841F66A19DFF868A0AB6A394628682A +S3152020A2B09847A0F5CB530446093B012B04D97B684C +S3152020A2C0DB681AEA030F19D095F8D030023B012B10 +S3152020A2D014D84C4506D142F210724FF0B05128685E +S3152020A2E007F060FF284608F0D5FD70B91CB140F272 +S3152020A2F029739C42D9D12046BDE8F087002C18BF6F +S3152020A3004446002EF7D0013EF0E740F22974F8E7C4 +S3152020A3100800F9FF70B58CB004461C22002105A840 +S3152020A32003AD0AF06FFB0D2300260393636D1B04F8 +S3152020A330049301238DF815300A4B0A93022201A992 +S3152020A3402046CDE90165FFF7A5FF40B9069BDA0532 +S3152020A350F4D5C3F34323072BF0D00CB070BD40F2C5 +S3152020A3600970FAE70800F9FF10B58CB000210446E1 +S3152020A370202204A801910AF045FB0C23012201A9E1 +S3152020A3800393032320468DF8143002238DF81530AD +S3152020A390064B0A9303AB0293FFF77CFF40F2097327 +S3152020A3A0002818BF18460CB010BD00BF0800F9FFC2 +S3152020A3B02DE9F04190B0064615460C4602AF1C22E8 +S3152020A3C0002109A898460AF01DFB142200213846B0 +S3152020A3D0E4070AF017FB0623AA0064F07F440793BC +S3152020A3E00F2369463068934024EA030408FA02F3CF +S3152020A3F04022234308930123CDE903238DF82530DA +S3152020A400084B059307ABCDE90073B36A98470A9AA0 +S3152020A410054B1340034340F2097008BF002010B0BB +S3152020A420BDE8F08144AE22200800F9FF2DE9F8434B +S3152020A4303D4C80468946164600214FF480722046A0 +S3152020A4400AF0E0FAD8F85830012B69D933464A4623 +S3152020A45000214046FFF7ACFF18B140F20970BDE855 +S3152020A460F88398F80C30012B3ED0022B03D08BB1E9 +S3152020A4704FF4E160F3E723681BBA236063681BBAB5 +S3152020A4806360A3681BBAA360E3681BBAE3602369F1 +S3152020A4901BBA2361E5684FEA89072B02E57C9BB22C +S3152020A4A02B43FB4003F00F039E42E1D133464A461D +S3152020A4B001214046FFF77CFF0028CED198F80C30AA +S3152020A4C0012B27D0022B1ED0002BD1D1E168E37C93 +S3152020A4D0090289B2194340F21673F94001F00F019F +S3152020A4E08E4218BF1846BAE723685BBA2360636892 +S3152020A4F05BBA6360A3685BBAA360E3685BBAE36078 +S3152020A50023695BBAC5E7E3681BBAE36023691BBAF4 +S3152020A5102361DBE7E3685BBAE36023695BBAF7E78D +S3152020A52040F20C709BE700BF44AE222070B58CB061 +S3152020A53005460021242203AE3046CDE901110AF03A +S3152020A54061FA6A6DA96A286800F0DEFB0446B8B96C +S3152020A550062301A9039301238DF815300223CDE983 +S3152020A560010604932868AB6A9847074B069A13403E +S3152020A570034340F2097318BF1C4620460CB070BD19 +S3152020A58040F21574F9E700BF0800F9FF2DE9F041E4 +S3152020A59090B000210446242207AF0DF10808544D1F +S3152020A5A03846CDE900110AF02DFA14220021404622 +S3152020A5B00AF028FA4FF48072002128460AF022FA5F +S3152020A5C0626DA16A206800F09FFB0646002840F0B5 +S3152020A5D0898033230822089069460793012320681F +S3152020A5E08DF825300595CDE90323CDE90087A36A8B +S3152020A5F09847404B0A9A1340034376D1237B012B5D +S3152020A60060D0022B06D05BB14FF4E166304610B005 +S3152020A610BDE8F0812B681BBA2B606B681BBA6B6078 +S3152020A6203349082204F180000AF0DEF92B6819024A +S3152020A6304FEA1372C3F3074048BFB4F8BE1084F81C +S3152020A640BC20C3F3036248BF41F0010184F8BD203A +S3152020A65048BFA4F8BE10C3F302511F0484F8C010CB +S3152020A660C3F3034184F8C11042BFB4F8BE1041F0B1 +S3152020A6700201A4F8BE10990A012A01F01E0184F8CD +S3152020A680C210D9B203F0030384F8C3306B68C4F830 +S3152020A690C4301DD0022A1DD00AB90123A365400744 +S3152020A6A042BFE36D43F00403E365CA0742BFE36D6F +S3152020A6B043F08003E3658B07A8D5E36D43F0400381 +S3152020A6C0E365A3E72B685BBA2B606B685BBAA6E7CA +S3152020A6D00223E3E70423A365B4F8BE309D07DED525 +S3152020A6E00823DBE740F2157690E740F209768DE7DE +S3152020A6F044AE22200800F9FF2DE9F04F8B4616465E +S3152020A7009918D0F8C82091B0044691421F4663D8A4 +S3152020A71000250FB9384653E0226A0DF11C0A002184 +S3152020A7200DF10809BA4250463CBFA7EB020817464E +S3152020A7304FF0240228BF4FF00008CDE900110AF07F +S3152020A74061F91422002148460AF05CF9D4F8CC207D +S3152020A750B2F5007F3DD3E269B2F5007F39D320469A +S3152020A760FFF7D8FD002831D14FF40072012FE16D7B +S3152020A7702046CDE903270BEB4522059214BF122252 +S3152020A78011228B07154B6946079205EB06020E937D +S3152020A79008925CBF520208920122CDE9009A8DF8D8 +S3152020A7A02520FFF777FD58B9049A012A0BD99DF861 +S3152020A7B0082042B92046FFF7D7FD20B140F2177076 +S3152020A7C011B0BDE8F08F3D444746A2E74FF4E36041 +S3152020A7D0F6E740F20C70F3E70420F1E70800F9FFD2 +S3152020A7E02DE9F04F8B4616469918D0F8C82091B0FF +S3152020A7F0044691421F4667D800250FB9384657E0B0 +S3152020A800226A0DF11C0A00210DF10809BA42504690 +S3152020A8103CBFA7EB020817464FF0240228BF4FF073 +S3152020A8200008CDE900110AF0EDF81422002148464F +S3152020A8300AF0E8F8D4F8CC20B2F5007F41D3E269BB +S3152020A840B2F5007F3DD321684A6AD201FCD5204645 +S3152020A850FFF760FD002831D14FF40072012FE16D02 +S3152020A8602046CDE903270BEB4522069214BF192259 +S3152020A87018228B07154B6946079205EB06020E9385 +S3152020A88008925CBF520208920122CDE9009A8DF8E7 +S3152020A8902520FFF7FFFC58B9049A012A0BD99DF8E9 +S3152020A8A0082042B92046FFF75FFD20B140F21770FD +S3152020A8B011B0BDE8F08F3D4447469EE74FF4E36054 +S3152020A8C0F6E740F20C70F3E70420F1E70800F9FFE1 +S3152020A8D02DE9F04FD0F8C83014460A448DB00546ED +S3152020A8E00F469A4263D84FF000080CB920461DE047 +S3152020A8F095F8B53003AE002124220133304608EBEB +S3152020A9000709A342CDE9011136BFA4EB030A4FF074 +S3152020A910000A1C460AF076F829684A6AD201FCD534 +S3152020A9202846FFF7F7FC20B14FF4E3600DB0BDE8D1 +S3152020A930F08FEA6D09F1FF3B01A9284693074FF0D6 +S3152020A94020021C4BA34458BF4FEA492902960A935A +S3152020A9504FF0000358BF4FEA4B2B0193CDE9032933 +S3152020A96001228DF81520FFF795FC0246C8B9212330 +S3152020A97001A9CDE901062846CDE9033BFFF78AFC4C +S3152020A980024670B9262301A9CDE9033002238DF88A +S3152020A9901530084BCDE9010628460A93FFF77AFCA5 +S3152020A9A010B140F20970C1E7A04454469DE7042027 +S3152020A9B0BCE700BF0800F9FF90F84C302DE9F0479E +S3152020A9C004468CB0002B00F04F8190F82D100068A3 +S3152020A9D005F080FD94F82C6094F83830023EF6B2CB +S3152020A9E00BB9022E1CD8206805F08EFC94F839105D +S3152020A9F0206805F0D1FC206B00F030FC94F839104B +S3152020AA00206881F0010105F0C7FC606B00F026FC70 +S3152020AA10022E05D80123206884F82D3005F0D0FC9D +S3152020AA202068002325469F4AE365836A616823F0D0 +S3152020AA300603836207F0DDFB206555F8140B42F2EE +S3152020AA40107107F02DFC2068294607F0BCFBA16A6F +S3152020AA50206808F094FB014628B140F21375284659 +S3152020AA600CB0BDE8F08701238F4A019005A884F811 +S3152020AA70D33003AF8D4B4FF00A0840F20C7A022ECA +S3152020AA808CBF914699461C2209F0BCFF4FF4D57302 +S3152020AA9008200297CDE9030309238DF81530A36AF0 +S3152020AAA001A920689847054668B9069BC3F3080381 +S3152020AAB0B3F5D57F18BF5546B8F1010806D035B174 +S3152020AAC05545ECD1CBE740F20975F5E75DBBE36D43 +S3152020AAD049F0804943F00803E36500211C2205A89C +S3152020AAE040F6B93ACDE9011109F08CFF2923CDE9A9 +S3152020AAF0033904238DF8153000F096FB80466C48E8 +S3152020AB000D4600F09FFB18EB000845EB0105BAF136 +S3152020AB10010A05D000F088FB404571EB050310D3D0 +S3152020AB2040F214759BE740F20C739D4202D140F20D +S3152020AB300C7594E7A16A206808F021FB0028CCD068 +S3152020AB408BE70022A16A206800F0DEF80028E7D1F2 +S3152020AB50A36A01A9CDE90107206898470028DFD1FB +S3152020AB60069B002BD3DA5900C4F8883042BFE26D09 +S3152020AB7042F00202E265DA0142BFE26D42F0200293 +S3152020AB80E265E36D9B066BD5A16A206808F00DFB74 +S3152020AB9000286CD1032384F8D330204608F088F986 +S3152020ABA0002867D1204608F058F9002865D120468C +S3152020ABB008F0C3F9002863D10121204608F0ADFA18 +S3152020ABC0002860D13B4AD4E9000107F012FB94F813 +S3152020ABD02D302065012B01D0022E0BD82046FFF7E1 +S3152020ABE0A5FC002852D12268936A23F0060343F05D +S3152020ABF0020393622046FFF7C9FC002849D14FF46F +S3152020AC000072A16A206800F0A9F80546002843D1E1 +S3152020AC1094F82C20531EDBB2032B3FF620AF264977 +S3152020AC2051F8236001462046FFF700FCB8BB94F874 +S3152020AC302C30324684F8D030D4E9000107F0D9FAF6 +S3152020AC4094F8D0302065023B012B3FF608AF2046F2 +S3152020AC5008F020F940F22973051E18BF1D46FEE68E +S3152020AC6019F0807F99D062E740F22E75F7E640F200 +S3152020AC702575F4E640F20D75F1E640F20E75EEE606 +S3152020AC8040F20F75EBE64FF4E265E8E640F21275E6 +S3152020AC90E5E640F21175E2E640F20A75DFE640F27B +S3152020ACA01B75DCE6E09304000080FF000080FF0196 +S3152020ACB040420F0040787D01E04E2120F0B58DB036 +S3152020ACC00D4600210646144604A820221F4601913F +S3152020ACD009F098FE0723039327B124040123049423 +S3152020ACE08DF8153003AB01A930460293A847069A62 +S3152020ACF0044B1340034340F2097008BF00200DB0D7 +S3152020AD00F0BD00BF0800F9FF70B58CB00D460021BC +S3152020AD100646144605A81C22019109F073FE372306 +S3152020AD20240401A903930123304604948DF8153079 +S3152020AD3003AB0293A84758B9069A074B13403BB951 +S3152020AD4012F0200F40F20C7308BF18460CB070BDCD +S3152020AD5040F20970FAE700BF0800F9FF70B58CB001 +S3152020AD600C4600210546164605A81C22019109F00D +S3152020AD7049FE102301A92846CDE9033601238DF863 +S3152020AD80153003AB0293A047069A044B1340034386 +S3152020AD9040F2097008BF00200CB070BD0800F9FFF2 +S3152020ADA07FB50B6804460D465BB10C22002101A815 +S3152020ADB009F028FE02238DF80430114B0293082334 +S3152020ADC003932A4601A92046FDF7AAF8012805461D +S3152020ADD012D1666AF20706D542F210724FF0007140 +S3152020ADE0204607F0DFF9B30706D542F210724FF05E +S3152020ADF08061204607F0D6F9284604B070BD00BFF2 +S3152020AE00C8C622200F2300F1080110B5836048F21E +S3152020AE10020304468381802383730068FCF7BCFFEA +S3152020AE20014B0020A36210BDA1AD20201A4BD3F8E0 +S3152020AE30802410B50446D00706D40122C3F88024E6 +S3152020AE40BFF34F8FBFF36F8F0523C4F808310D232F +S3152020AE50C4F808310923C4F80831236A002BFCD012 +S3152020AE60236ADA07FCD4236A13F0060F03D0A06ADC +S3152020AE7010F003000ED0204608F05FFA236A002B3C +S3152020AE80FCD0236ADB07FCD4236A13F0060F0CBF01 +S3152020AE900120002010BD00BF0060CC40F8B504463C +S3152020AEA00E461546002B36D0042B36D121F47F7240 +S3152020AEB022F003028ABB1B4F3B7823B908F07CFB88 +S3152020AEC0F8B901233B70204608F053FBC8B946F059 +S3152020AED079566FF47C434FF40067204646F45C167F +S3152020AEE0A760A36066602B68236208F042FB40B906 +S3152020AEF023681B0513D4204608F03BFB10B144F6EB +S3152020AF00EA60F8BD4FF48053A7602046636008F0BE +S3152020AF1030FB0028F3D10020F3E70420F1E744F6A4 +S3152020AF20E960EEE734C62220F8B504460E461546DB +S3152020AF3033B3042B26D121F47F7222F003020ABBDD +S3152020AF40134F3B7823B908F037FBC0B901233B7058 +S3152020AF50204608F00EFB90B94FF400632046A360EC +S3152020AF6040F2FF33A36001236660236308F001FBD0 +S3152020AF7028B923681B0507D4D4F800312B60F8BDE7 +S3152020AF801846FCE70420FAE744F6E860F7E700BF16 +S3152020AF9034C622202DE9F74F07468846144600213D +S3152020AFA0032201A809F02EFD00229DF806309DF8E7 +S3152020AFB005C09146C3F340019DF8045003F00103D8 +S3152020AFC010461646DFF820E1B74267D8B9F1000FC0 +S3152020AFD003D08DF805C08DF804503AB19DF806208F +S3152020AFE061F3410263F300028DF80620B7F5807FD6 +S3152020AFF09DF8049008BF9DF80630C9F30002C9F3D6 +S3152020B0000011C9F3801C08BF43F003034FEAD91669 +S3152020B01008BF8DF80630C9F340139DF8065045EA3F +S3152020B02080059DF80500C0F3000AC0F30018C0F380 +S3152020B030401EC0F3801742EA4A02C9F3400A41EA79 +S3152020B0404801A57042EA8A02C0F3400A41EA8303F6 +S3152020B05042EACA02C9F3800AC9F3C00943EACE03E9 +S3152020B06042EA0A12C0F3800A43EA0C1342EA4A1241 +S3152020B07043EA471342EA8912C0F3C00943EA8613FA +S3152020B08042EAC912C0092270627822F07F02134355 +S3152020B09060F3C713637003B0BDE8F08F18F806A0DD +S3152020B0A01EF80AA00AF03F0B1AF0400F80EA0B0088 +S3152020B0B017D05FFA86F9B7F5007F85EA09058CEA6D +S3152020B0C0090C6FEA0505EDB209D1C6F307225340D4 +S3152020B0D051400122DB4301F0010103F001034FF02F +S3152020B0E00109013670E700BF53582120444BF7B59C +S3152020B0F016461A889B780546ADF800206A460C46E7 +S3152020B1008DF80230FFF746FF01A9721E6B460236E4 +S3152020B110084612F801CF13F8017BB24287EA0C07C2 +S3152020B12001F8017BF5D1032108F04BFAB5F5807F94 +S3152020B130024658D0B5F5007F0CBF0C230023002AE9 +S3152020B1405BD0934251D19DF80620B5F5007F9DF81E +S3152020B15004004FEA1213C2F3C0064FEA90079DF867 +S3152020B160051003F0020307F0020746EA03064FEA1A +S3152020B170521308BFD20103F0040308BF02F48072E1 +S3152020B18046EA0306C0F3400343EA07034FEAD00703 +S3152020B1904FEA101007F0040700F0080043EA0703DF +S3152020B1A04FEA810740EA03004FEAC10307F0200750 +S3152020B1B003F0100343EA070301F080074FEA410119 +S3152020B1C043EA070301F0400143EA010343EA00036F +S3152020B1D045F2353008BF13430122B240E65C564083 +S3152020B1E0E65403B0F0BD0B23A9E745F2373345F2E9 +S3152020B1F03630012A08BF1846F3E745F23430F0E707 +S3152020B2004A4C2120074B0022C3F81821C3F80821D5 +S3152020B210C3F81021C3F800211A6842F002021A60EE +S3152020B220704700BF00800D40054B82B0D3F8E01058 +S3152020B230D3F8E430C94301930198C04302B0704744 +S3152020B24000800D40044B1968A0FB0101C00840EA8C +S3152020B2504170C908704700BF44AF222038B5024646 +S3152020B260FFF7E2FF084B1D68A2FB0525D30843EA1A +S3152020B27045731C1841EBD505FFF7D6FFA04271EB8D +S3152020B2800503F9D338BD00BF44AF22201B4BD3F88A +S3152020B290C027D20710B506D40122C3F8C027BFF392 +S3152020B2A04F8FBFF36F8F164B4FF0FF3101240022B3 +S3152020B2B01A60C3F81011C3F81821C3F81C41D3F81B +S3152020B2C0182142F00402C3F81821D3F8182122436A +S3152020B2D0C3F81821C3F80011C3F80C41C3F808415C +S3152020B2E009F000FB074AC300B2EBC00F064A37BF5E +S3152020B2F006491460B3FBF1F3136010BD0060CC4007 +S3152020B30000800D403F420F0044AF222040420F00D4 +S3152020B3102DE9F04F082399B00D46904600210DEBDC +S3152020B3200302074608F048FA8146002851D1344BBB +S3152020B330029A9A4260D19DF80E6004AA9DF80C309C +S3152020B340384601362B600A2E28BF0A26B8F1000F70 +S3152020B3504FEAC6030CBF08214FF4006108F02CFAEF +S3152020B3608146002835D104AC4FF6847A05F15C0B52 +S3152020B37001466422284609F045FBE379227802EB30 +S3152020B3800322B2F57F4F1BD1A379617941EA0321AC +S3152020B390237943EA0121E3789B00B8F1000F1CD1E1 +S3152020B3A0B2F57F4F1BD1502B05F10802384628BF16 +S3152020B3B05023019308F000FA50B9019B6B6001E0FD +S3152020B3C05245E1D009F1010908344E45D5D1002056 +S3152020B3D08146484619B0BDE8F08F0902E0E752457C +S3152020B3E0F0D15A46384608F0E7F90028F0D14FF038 +S3152020B3F0010385F85830E5E744F68B69E9E700BF75 +S3152020B4005346445003232DE9F04F0C46CB73082195 +S3152020B41091B00746237384F84510582121640AB138 +S3152020B420592323648C4B01264FF4007B2146E36766 +S3152020B4304FF48023384684F84760C4F8D03184F806 +S3152020B440C961C4E970B308F0D1F90546002857D15F +S3152020B4500146102203A8DFF82C9209F0D3FA7F4B5D +S3152020B46003AA31463846DFF82082CDE903933346B6 +S3152020B4704FF0020901F008FD2946102203A809F001 +S3152020B480C1FA774B294603AA3846CDE903833346AA +S3152020B49001F0FAFC4FF4184307A93846009340F6EA +S3152020B4A0AA238DF82C508DF81C900893CDF830D0F7 +S3152020B4B0CDF83490CDE9096608F073FE0546F8B933 +S3152020B4C020234FF0030B4FF0080A8DF82C00089309 +S3152020B4D001AB07A98DF81CB00E93CDF83CA0CDE981 +S3152020B4E00906384608F05DFE054648B95D4801AB99 +S3152020B4F00199BDF808208142029205D044F68D6537 +S3152020B500284611B0BDE8F08FB2F5B24FF6D14E22C3 +S3152020B51007A938468DF82C508DF81CB00892CDE915 +S3152020B5200956CDE90E3A08F03CFE05460028E7D11B +S3152020B5309DF80530A3F117020193092ADED806FAD1 +S3152020B54003F308908DF82C0007A923654FF4704348 +S3152020B55038468DF81C900093CDF830D0CDF8349015 +S3152020B560CDE9096608F01DFE05460028C8D1DFF87A +S3152020B5701CE14AF20470DFF818C14FF087223A49BD +S3152020B5803A4F3B4BC4F88080C4F8A080C4F8C02032 +S3152020B590C4F81811C4F8D810DFF8F880C4E947CECB +S3152020B5A00CF1DF5CC4E926170CF5016C314FC4E998 +S3152020B5B02130C4E92970304B3048314FC4F824C19A +S3152020B5C0DFF8D4C0C4F8CC00C4E92423C4E92C2352 +S3152020B5D0C4E92E13C4E94423C4E93423C4E9393108 +S3152020B5E0C4E93107C4E937C2C4E93B32C4E94C2354 +S3152020B5F0C4E95023C4E95213C4E95823A3F51A03F6 +S3152020B600C4F8681184F8CC61C4F86C3140F2023356 +S3152020B610A4F888314FF48173A4F8843140F60213BC +S3152020B620A4F8903140F20453A4F88C310423C4E9C1 +S3152020B6303F0E84F8943148F2307E0B23C4E93D072F +S3152020B640C4E9418EC4E94E1CC4E95420C4E956708D +S3152020B65084F8953154E700BF0F000100108F02A314 +S3152020B660108F04A700510052008705870087708716 +S3152020B670108F0CB3108F0BB70087AA8700875587AA +S3152020B680008702872087188BA087188B0087188B26 +S3152020B6900087A087108F0087008780872DE9F043B9 +S3152020B6A0054693B00C469046002A00F08F805378AA +S3152020B6B012789A4200F08C80A3F14102012A8BBF96 +S3152020B6C008220422032602268CBF81F8452081F8F1 +S3152020B6D04520822B21D0422B0CBF21270127002158 +S3152020B6E04FF00109202201A80A918DF834108DF8F7 +S3152020B6F02410CDF82C9009F085F998F80330072BE3 +S3152020B70045D0082B0BD0062B59D140F2664343EA6D +S3152020B7100623019340F2994308E02127DFE740F2F0 +S3152020B720064343EA0623019340F2FF4343EA0623D6 +S3152020B730059302230C934FF0807326490126284631 +S3152020B7402365254B84F8466084F8C861C4E9001334 +S3152020B750032321466373A3730A23636708F046F8FD +S3152020B76090B90C9B01AA3146284601F08DFB09A9E8 +S3152020B770284608F016FD194B4FF47A721B68B3FB46 +S3152020B780F2F30093009BEBB913B0BDE8F0833306A8 +S3152020B790212F43EA062343EA872343EA876343F498 +S3152020B7A0190243F4CC0342F0660243F09903019236 +S3152020B7B00593BED1236C43F040032364B9E7CDF82B +S3152020B7C03090B8E700BF009B013BDAE70420DBE797 +S3152020B7D00020D9E7464346420004015690092220FC +S3152020B7E02DE9F04F0546C7B016460C46002901F034 +S3152020B7F02D80002A01F02A804FF400720021204655 +S3152020B80009F000F94FF08072B94801232265B94A20 +S3152020B81084F8463084F8C831C4E9000203226273D2 +S3152020B820A273F3781F071DD0B379F17903F00F03A4 +S3152020B830012B02BF236C43F4807323640B0704D0AF +S3152020B84001F00F01204609F052F8F37913F0F00F9A +S3152020B85008D0B27812F0E0021FD11B09012B12D09A +S3152020B860022B15D0B7783B09092B00F2FA83DFE8A3 +S3152020B87013F018001800C203CB03CD03CD036905AE +S3152020B880690599069906236C43F004032364E9E7A6 +S3152020B8904FF080732265A365E4E76FF30713F371F6 +S3152020B8A0E0E7382200211BA809F0ACF89248934BF8 +S3152020B8B0DFF868C2DFF868E2CDE91903904B04204F +S3152020B8C0CDE91DC38F4BCDE921E3B37813F00F03C8 +S3152020B8D0009340F0C6838C498C4B84F8450028463B +S3152020B8E0C4E92013214607F081FF0246002840F0B4 +S3152020B8F08C80337803F0F003102B65D0B2780123A7 +S3152020B90019A9284602F00F0201EB0212194601F06E +S3152020B910BBFA00222DA92846FFF7FAFC024600286A +S3152020B92073D1B37803F0F003102B75D19DF8BE3078 +S3152020B9301A07C3F3C00940F1948300232DA902AA34 +S3152020B940204623733378C3F3030384F8463003ABAE +S3152020B95008F0F7F8236D7178B3F1807F94BF18270C +S3152020B9602027090940F07D8310220CA809F04AF8E7 +S3152020B9702D9B042B03D82E9B3F2B40F2B3800123F3 +S3152020B98023749DF8F630C3F30213013BDBB2052B5B +S3152020B99044D85F4A12F80380002308F1FF38089321 +S3152020B9A011938DF8503003238DF8403008AB179330 +S3152020B9B001231893CDE91233B8F1030F00F2B68094 +S3152020B9C0DFE808F0D1B2D3B26FF0F923012704F5CE +S3152020B9D0B8728DF8B40039468DF8C4002E902846CA +S3152020B9E0C4E95C3340F2FF63C4F878310F23CDE9F4 +S3152020B9F02F373B4601F048FA2DA928462F9708F0E5 +S3152020BA00D0FB024600283FF479AF012384F8443046 +S3152020BA10104647B0BDE8F08F81468EE70023237479 +S3152020BA209DF8BE3013F0200C00F0D6809DF8C480FF +S3152020BA3002204FEA581208F01F08202F40F0E680F7 +S3152020BA409DF80C11002900F0DB809DF81111C90703 +S3152020BA5040F1D0802F49C4F8101142F20421C4F8B5 +S3152020BA6014110121DFF8BCE0217340F20641C4F80D +S3152020BA70B0102949C4F89010390401919DF8081076 +S3152020BA8041EA074141EA0E01C4F8D0109DF80C1076 +S3152020BA9041EA074141EA0E01C4F800114FF48C61B6 +S3152020BAA0C4F83011F178090700F0B28031790029E5 +S3152020BAB000F0AE808846B9F1000F00F0DD864FEA0F +S3152020BAC04108226C182F42F040020CBFED23EE23B2 +S3152020BAD02264019A134343F00A4343F48063C4F853 +S3152020BAE080306BE196F8018018F00F0898D053E744 +S3152020BAF046434642000401565A0418080830FF24BB +S3152020BB000831FF250832FF260304180804240100E3 +S3152020BB10535921203E04200A050404245A051809D5 +S3152020BB205A06180A00040008B74B0C9301230CAAC6 +S3152020BB302846194601F0A8F910A9284608F031FB15 +S3152020BB40024600287FF461AFF3781B0702D0737971 +S3152020BB5003B1089300232374B8F1030F14D8DFE828 +S3152020BB6008F0061F3229A94BDFE7A94BDDE7089B02 +S3152020BB70580609D403F0C303A64A43F04003C4F869 +S3152020BB80C020089301232374237C002B3FF448AF45 +S3152020BB9040F20143A382089BA361012363743FE7FC +S3152020BBA0089B9907F0D49C4A1B02C4F8C02043F472 +S3152020BBB00073E6E7089B9A07E6D4984A43F00203E7 +S3152020BBC0C4F8C020DDE7089B1806DDD4944A43F04C +S3152020BBD08003C4F8C020D4E713F0400219BF9DF893 +S3152020BBE0C6806046904610461CBF4FEA581208F081 +S3152020BBF01F0822E79DF91011002901DA89492AE731 +S3152020BC008949C4F8101142F2040128E78749F8E748 +S3152020BC10B9F1000F00F03186202F2146284602BF99 +S3152020BC20834A844BC4E9202307F0E0FD02460028FE +S3152020BC307FF4EBAE4FF400738DF8500012900DF187 +S3152020BC40200811934FF0010A7B4B4FF0100BCDF8B3 +S3152020BC504CA0CDF860B00FCB88E80F004FF003033F +S3152020BC6004F18002514628468DF840300CAB1793BC +S3152020BC70534601F009F910A92846CDF848A008F026 +S3152020BC8090FA0346002840F08680DDE90C210A4000 +S3152020BC900E990A400F990A40013232D10246214696 +S3152020BCA0284607F0CCFC002875D1092304F5887294 +S3152020BCB051462846129302238DF84030139BCDE916 +S3152020BCC0158B01F0E1F810A92846CDF848A008F0F8 +S3152020BCD068FA034600285ED102462146284608F007 +S3152020BCE096FB002857D14FF00303129010A928461F +S3152020BCF08DF840300CABCDE9173B08F052FA0028DE +S3152020BD0049D15A460CA9404608F05EFE002842D169 +S3152020BD10236C4FF002084FF0000ADFF828B143F0D9 +S3152020BD204003012294F846102846236403F04EFF50 +S3152020BD30102200210DEB020008F064FE226D3F4BFD +S3152020BD4000212846B2F1807F98BF5B4604AA04933F +S3152020BD503B4B48EA03030593012301F095F803237F +S3152020BD60102210A98DF840300CAB2846CDF848A0DB +S3152020BD701793189208F015FA68B90CAB102208A868 +S3152020BD80194608F021FE00283FF49BAE08F1010851 +S3152020BD90B8F1330FCCD144F68E6236E6BCF1000FD3 +S3152020BDA02CD09DF8C53043EA0063009239040B431A +S3152020BDB043F0006343F48063C4F8803096F800B0E3 +S3152020BDC0CBF3031A5FEA1B1B4AD1009B9844B8F198 +S3152020BDD0000F00F008815FFA88F8B9F1000F00F013 +S3152020BDE0CF80174B48EA0303C4F88430012384F814 +S3152020BDF0CE31236C43F040032364C6E05B0640F13A +S3152020BE0028859DF8C730CEE7350401240504012472 +S3152020BE103F040124010401200104022031040120D1 +S3152020BE203E040220340420081204200802041808A4 +S3152020BE301304200804240100304A2120EE04208AFD +S3152020BE4000B204A6ED04188A9DF8BE30990600F1AA +S3152020BE50068513F0400340F006851A4600F01EBDE5 +S3152020BE60BBF1010F40F084802E9B3F2BADD99DF84E +S3152020BE70F5309A07A9D59DF8F61001F00F0311F099 +S3152020BE80050167D113F0020367D010220CA8089170 +S3152020BE90019108F0B7FD032301990CAA28468DF8B5 +S3152020BEA0403008AB11918DF850105946CDE9173BFB +S3152020BEB0C64B0C935B46CDE912BB00F0E5FF10A9DB +S3152020BEC0284608F06EF9024600287FF49EAD089B8E +S3152020BED0BF4A03F0F70384F8CFA142EA0342A361C5 +S3152020BEE040F20143C4F8602140F601622382A282F7 +S3152020BEF09DF8F5309B0813F00A0F30D06FF0F92308 +S3152020BF00202FC4E95C3303D140F2FF63C4F8783193 +S3152020BF10012384F8CD31009B002B3FF458AF009BA2 +S3152020BF20012B4FEA08430CBF0622072203F47F0386 +S3152020BF3008BF4FEA1B1B43EA822343EA0B0B4BF035 +S3152020BF40485343F40073C4F8843042F20463C4F89F +S3152020BF5088304CE04FF0A50BCAE79B46C8E713F084 +S3152020BF60110F16D04FF00623C4E95C33994BCDE749 +S3152020BF70BBF1050F4FF0000B08BF84F80CB0CAE7C1 +S3152020BF80954B48EA0303C4F88430236C43F010030E +S3152020BF902364204608F073F880B1236DA365D4F876 +S3152020BFA0C0315B00C4F8C031D4F8C4315B00C4F87A +S3152020BFB0C431D4F8D0315B00C4F8D031204608F003 +S3152020BFC094FC3378C3F3030384F84630F07810F0DA +S3152020BFD00F0006D0F37903F0F003302B01D1236D27 +S3152020BFE0A365002211E542F20443C4F88430B9F156 +S3152020BFF0000FCAD0FAE6012221462846FFF702FA88 +S3152020C0000246002ADAD000E50022F5E707F0F00EF6 +S3152020C010DFF8E8810DF1B40CAEF15003D3F100091D +S3152020C02049EB0309B8E80F00ACE80F00B8E80F0089 +S3152020C030ACE80F0098E80F0096F801805FEA181800 +S3152020C0408CE80F0002D0B8F1030F0AD1C7F3030AF8 +S3152020C05017F00F0707D0032F03D1B8F1000F40F0B8 +S3152020C060DA800422D1E410A803F07AFD83463846EC +S3152020C07003F070FDBBF1000F00F0C2800023237374 +S3152020C0801023236403232193B8F1000F00F0CE80E0 +S3152020C090B8F1030F14BF012308232146284684F82C +S3152020C0A0453007F0A3FB024600287FF4AEAC002FD4 +S3152020C0B000F0C080B9F1000F14BF01220222012313 +S3152020C0C02DA9284601EB0212194600F0DDFE002399 +S3152020C0D019A928461A938DF8743003238DF86430D5 +S3152020C0E00123CDE91B3310AB209308F05AF80246E2 +S3152020C0F000287FF48AAC9DF84030C22B7FF45EAFB7 +S3152020C1004FF48033002F40F097809DF84220303A1C +S3152020C1104FF4805B89F00105934023654FF48073AB +S3152020C120C4E9703B4FF48033C4F8D0310323237302 +S3152020C130102323644FBBB8F1030F26D1274B0020B1 +S3152020C1400221274A236140F2016367F30700A38275 +S3152020C150072363F31F60234B002D70D0C4F8E02003 +S3152020C1604FF004226FF07D07A161C4E9392333788B +S3152020C17067F30F2003F0F003302B0ABF012384F846 +S3152020C180CAA184F8CA3103F0E5FC40F20643C4F87C +S3152020C190B030154BC4F89030B8F1000F66D101238A +S3152020C1A0124D134F2373134BC4E9205342F2040339 +S3152020C1B0C4E94473104BC4F8D030BB33C4F80031E3 +S3152020C1C04FF48C63C4F83031F8E600BF850401248F +S3152020C1D081040004001E10320032042601020100D0 +S3152020C1E07204000400040120050404240C04200801 +S3152020C1F0120420080830042421042008404A212043 +S3152020C20010AA21462846FFF749FA024600283FF47D +S3152020C21035AFFFF7FABBBEF1400F84F80CA014BF50 +S3152020C2201023502323640623219331E74FF001095D +S3152020C2304B4632E73A4642E79DF8452067E76FF0BE +S3152020C2407E07A161BE4967F30F20C4F8E02040F2A3 +S3152020C2500177C4F8F0204FF004222784C4E939134B +S3152020C2600121C4E93D23217721638CE7002DB54B9D +S3152020C270B54913BF2C2319460C2322250CBF022592 +S3152020C2804FF00A0C4FEA83630ABF4FF0050C21209A +S3152020C290012043EA852316BF28270827292243EA97 +S3152020C2A00C4308BF0922C4F880104FEA852143F0A9 +S3152020C2B003234FEA822241F4487143F0200342F4BB +S3152020C2C04172C4F8D410C4F884304FEA8063C4F88D +S3152020C2D0882043EA80209D4BC4F8AC2043EA000303 +S3152020C2E09B4AC4F8C03042EA00029A4B43EA000334 +S3152020C2F0C4F8A03040F00323C4E92933964B43EAFF +S3152020C3000003C4F810314FEA876343EA852343F0BC +S3152020C310417343F44873C4F81431904B43EA000325 +S3152020C320C4F8D0308E4B43EA0003C4E94021C4F838 +S3152020C330303103D0236C43F040032364022384F856 +S3152020C340CC313BE6DFF84CE20DF1640C17F00F09F7 +S3152020C350BEE80F00ACE80F009EE80F008CE80F0027 +S3152020C36040F090802DA803F0FBFB8046484603F042 +S3152020C370F1FBB8F1000F7AD0002323731023236416 +S3152020C38008232146284684F8453007F02FFA02460E +S3152020C39000287FF43AABB37813F00F0376D101232C +S3152020C3A019AA1946284600F06FFD082300222DA938 +S3152020C3B0284684F84530FEF7ABFF024600287FF456 +S3152020C3C024AB07F0F00710AB0CAA2DA9204607F0C6 +S3152020C3D0B8FB702F1FBF502323640323237340F2FF +S3152020C3E00643C4F8B0305F4BC4F89030B37803F0DE +S3152020C3F00F03032B50D0727802F0F002302A4BD054 +S3152020C400002A7FF4DBAD256D9DF84010B5F1807FA5 +S3152020C410DFF884E19DF830002BBF4FF0200C4FF041 +S3152020C420180C8E22C22241EA0C41702F42EA0C427D +S3152020C43041EA0E0140EA0C404FEA0C43C4F80011B1 +S3152020C44040EA0E004849C4F8D00042EA0102C4F866 +S3152020C45010214FF40E52C4F8142155D0434BDFF847 +S3152020C4603CE1C4E920E3012384F8CE31A8E62DAAB5 +S3152020C47021462846FFF712F9024600283FF47CAFD2 +S3152020C480FFF7C3BA03232373502378E7032B7FF4C4 +S3152020C49095AD01231DAA84E7354ADFF80491C4F817 +S3152020C4A0A020344A3449C4E9209240F20672C4F8C6 +S3152020C4B0C020324AC4F8D020BB32C4F800214FF421 +S3152020C4C0EC62C4F830214AF20432C4E94412002B2B +S3152020C4D07FF434AF06230020294D63F31F60294BB8 +S3152020C4E063F30F0003F036FBE723A361264B23617A +S3152020C4F040F20163A3824FF00423C4E9385342F269 +S3152020C5000103C4F8E83019E7B5F1807F1F481C4F96 +S3152020C51034BFCB22CC22C4E9387042F20100134327 +S3152020C520C4F8E8000C200B43A0610120C4F8803019 +S3152020C530207440F20160164BA082C4F884303FE676 +S3152020C54000040204EC071307EE8711870603F9037C +S3152020C550DC0323030503FA031203ED032103DE0381 +S3152020C56060039F03050404240004000B0CB304A7D6 +S3152020C570050704A706B304A71207208B2107208BC3 +S3152020C580810400040082FFFF01020100000401044F +S3152020C5900C330427704A212000040008FD04208B38 +S3152020C5A0FD07208B5022BF4919A807F0F00908F073 +S3152020C5B01BFA0423102284F8453096F802807778D7 +S3152020C5C0C8F3030318F00F084FEA1717226422D165 +S3152020C5D02DA803F0C5FA0090404603F0BBFA009A36 +S3152020C5E042B92DAA21462846FFF758F802460028A8 +S3152020C5F07FF40BAA01234FF0000A84F8453084F8F3 +S3152020C6000CA0002F00F03281022F1DD0032F7FF4A3 +S3152020C610F8AC082319E0B8F1020F06D103234FF016 +S3152020C620000A237344F68D62EBE7B8F1030F40F03E +S3152020C6300981B9F1900A23734FF0080318BF4FF0F0 +S3152020C640010A84F84530EDE7042384F84530B9F112 +S3152020C650900F236C40F0BF8023F040034FF0010958 +S3152020C66021462846236407F0C1F8024600287FF495 +S3152020C670CCA9B9F1000F00F0B380B8F1020F00F079 +S3152020C680B880B8F1030F14BF00220222012319A972 +S3152020C690284601EB0212194600F0F6FB52462DA938 +S3152020C6A02846FEF735FE024600287FF4AEA92DA99E +S3152020C6B010AB0CAA204607F044FAB9F1000F4FEA36 +S3152020C6C007204FF003034FEA076208BF4FF02908DF +S3152020C6D000F4407018BF4FF0090802F040720CBFDA +S3152020C6E04FF0220C4FF0020C237342EA00026E4BCD +S3152020C6F00CBF4FF02C0E4FF00C0E42EA8C6CC4F877 +S3152020C700903042EA88620BBF0C2306232821082179 +S3152020C710DFF8A4A1134340F2064540EA81214CEAE2 +S3152020C7200A0A43EA8E23C4F8B05041F08001C4F8A7 +S3152020C73080A043F48023C4F81411C4F884304CF02C +S3152020C740201343F48063C4F8D0304CF4001343F410 +S3152020C7509B63C4F80031554B4CEA0303C4F81031CF +S3152020C76040F48C63C4F83031BB1E012B09D8504BC2 +S3152020C77028431343C4F8C000C4F8A030022384F809 +S3152020C780CC31022F39D14FF48023A361B9F1000F88 +S3152020C79039D1A36943F40003A36142F20303454937 +S3152020C7A0002F4FF00000C4E938134FF001030CBFCF +S3152020C7B0002202226FF307002374638240F2016372 +S3152020C7C06274A382B9F1000F33D0022F23D14123E3 +S3152020C7D063F30F2026E043F040034FF000093FE7A4 +S3152020C7E0B8F1020F07D0B8F1030F14BF002204229C +S3152020C7F04CE701224AE7032248E7032F14BF0023F0 +S3152020C8004FF40023C1E7236C43F0800323640123E4 +S3152020C81084F87930C1E7032F02D16FF07E03D7E762 +S3152020C8206FF30F20082363F31F6003F093F9FFF7BC +S3152020C830C5BB022F01D14223CAE7032FF0D16FF0C7 +S3152020C8407D03C5E744F68D62FFF7DFB80422FFF7A4 +S3152020C850DFB86246E0460323FFF7A5BA0220EC2381 +S3152020C860FFF7A1BA18466C23FFF79DBAB8F1000F3F +S3152020C8707FF4EDAE236CEFE64A46182F3FF48EAABE +S3152020C8809DF80C31002B3FF4DFAA9DF8101111F0F2 +S3152020C8902003E3D111F01001E4D10A469046132358 +S3152020C8A0FFF781BA904A212005040424020420009F +S3152020C8B005040400710400040B0420002DE9F04730 +S3152020C8C08AB0064615469946DDF848A00C4600292A +S3152020C8D000F09680002B00F09380BAF1000F00F034 +S3152020C8E08F80D1F8C471012357430B22CDE903232E +S3152020C8F091F84730029733B191F894311BB191F8D2 +S3152020C9009521CDE90323039A00230121304604EB08 +S3152020C91002128DF814308DF804308032049B00F0FA +S3152020C920B3FA012301A93046039307F03AFC804647 +S3152020C930002867D194F8CC312BB3B4F8D2014146E4 +S3152020C94003F0F0F8304607F012FC94F8CD3123B3EB +S3152020C95094F8CE218ABB1546B7F1805F3DD22B4B6A +S3152020C9605246484653F82610394408F03DF835B14A +S3152020C970012304F180020021304600F085FA40464A +S3152020C9800AB0BDE8F08702463B462146304607F0EE +S3152020C9903EFD0028D6D08046F1E70DF103033A4626 +S3152020C9A02146304607F0FDF90028F4D19DF80330C2 +S3152020C9B0002BCDD144F62260EDE7D4F8C821B5FB73 +S3152020C9C0F2F515F00105C7D0012304F1C00200219C +S3152020C9D03046012500F058FABEE70023032201A99C +S3152020C9E030468DF814300393012302978DF80420C6 +S3152020C9F00493CDE9089A07F0D4FB0028CBD1B6E7DB +S3152020CA000420C8E744F62060C5E700BFFC4E21205D +S3152020CA102DE9F04307468FB016460C46002900F034 +S3152020CA20F880002A00F0F580D37803F0F003C02B9D +S3152020CA3040F0EF804FF40072002120464FF003098A +S3152020CA4007F0E0FF7449754B4FF00108384684F80B +S3152020CA500E9084F84680C4E900133223214663676A +S3152020CA604FF44073A38140F20243A4F844304FF0A0 +S3152020CA708053236507F0D8F9054638BB0146102296 +S3152020CA8001A807F0BFFF664A42F2024341463846D4 +S3152020CA90CDE90123434601AA00F0F6F9022305A990 +S3152020CAA03846009506958DF824508DF81490CDF8AB +S3152020CAB030D00D93CDE9078807F073FB054628B9BA +S3152020CAC09DF80030FF2B05D144F62B6528460FB064 +S3152020CAD0BDE8F083002BF7D0F17811F00F0103D0B9 +S3152020CAE032790AB19342EFD1012323733378C3F3EA +S3152020CAF0030384F8463033781B09022B01D0042BFC +S3152020CB007ED172789802DB0202F00F02C4F8C001AF +S3152020CB10C4F8C431032A73D8424FB0F5805F37F862 +S3152020CB201270226DC4F8C871B2FBF3F3B3FBF7F38E +S3152020CB30C4F8DC310CBF0D230C23E373B37803F048 +S3152020CB400F03022B5CD8384ADFF800E152F8233055 +S3152020CB50364A5B00DFF8F8803548236540F20643E5 +S3152020CB60C4F830010338C4F8B03042F20143C4F887 +S3152020CB706001C830C4E92423C4E954232D4BC4F8CA +S3152020CB80D000C4E920E34FF40953C4E944830023A9 +S3152020CB9084F8CE31737813F0F00F0FD0264B274F21 +S3152020CBA0DFF8B0C0C4E94873254BC4E930C34FF43D +S3152020CBB01A53C4F8C830012384F8CE3140F201221A +S3152020CBC020480123228442F20102237784F8D0319F +S3152020CBD0C4E928020020206340F20160A0841A487C +S3152020CBE0C4E938021922626371B1B27962B17379CC +S3152020CBF053B1C4F8D421C4F8D831022384F8443060 +S3152020CC00204607F072FE61E73023C4F8D431202372 +S3152020CC10F1E704255AE700BF464346420004015661 +S3152020CC209F0400047A572120F04E21200F04C004AF +S3152020CC3013041808083280260C0C402232040118CE +S3152020CC400C0C08321F04A0041F04B0046B04100C23 +S3152020CC503204100C6B04011802289ABF024B53F899 +S3152020CC6020000020704700BF084F21202DE9F04FDB +S3152020CC7087B00746FFF7F0FF4FF480730C46054632 +S3152020CC80CDE90433002878D0002976D00B7B032BDE +S3152020CC9073D812D1084607F0FEF970B902AA0221EC +S3152020CCA0384602F0EDFC364B029A9A4224D9236C60 +S3152020CCB01A0621D47923CDE904332B689B075AD42D +S3152020CCC02B6843F002032B600123226D0AB9626D83 +S3152020CCD012B1049AC5F8C020A26D0AB9E26D12B12C +S3152020CCE0059AC5F8C4201BB12B6823F002032B60BC +S3152020CCF0002007B0BDE8F08F26460DF1100804F17C +S3152020CD0004094FF0640ADFF880B096F8792022BB18 +S3152020CD1096F8781011FB0AF1C9B9204603A907F025 +S3152020CD20BEF902460190384602F022FF019A039965 +S3152020CD304FF47A70134B3AB9B3FBF1F242434B21AD +S3152020CD40B2FBF1F2013208E0BBFBF1F2F6E74B2011 +S3152020CD50B1FBF0F250438842F4D33F2A06F1020673 +S3152020CD6028BF3F22B1454FEA422242F4807248F83A +S3152020CD70042BCAD1A1E70023A7E70420B9E700BFE7 +S3152020CD80FFE0F5050065CD1D80B2E60E10B588B111 +S3152020CD9082B17BB1084CB4FBF2F25343B1FBF3F2E0 +S3152020CDA002FB03F4A14202D80260002010BD01320A +S3152020CDB01C44F7E70420F9E700CA9A3B7FB54FF6D3 +S3152020CDC0FF760546CDE90066FFF746FF044660B3A9 +S3152020CDD059B302AA0221284602F052FC03AA0121B5 +S3152020CDE0284602F04DFC4FF48063029A684610498B +S3152020CDF0FFF7CCFF4FF48063039A01A8FFF7C6FF05 +S3152020CE00009B0020B3F5803F019B28BF0096B3F5F9 +S3152020CE10803F009A24BF4FF6FF730193BDF804305C +S3152020CE2043EA0243636004B070BD0420FBE700BFE1 +S3152020CE300065CD1D034610B510B309B391F84420E3 +S3152020CE40012A09D1C268084622F0010207F017F903 +S3152020CE5098B942F04002DA60DA680A4C42F02002A1 +S3152020CE60DA60002203EB82000132016A072A01EAF6 +S3152020CE7004010162F6D1002010BD42F04102EAE70A +S3152020CE800420F9E700FCF0F870B51C461646FFF79B +S3152020CE90E3FE054608B302B30C194FF000035B41AD +S3152020CEA0112C73F1000318D207F0E0F802230C4A64 +S3152020CEB099409C408261C36101F1800300EB83038A +S3152020CEC0A14204D301230020AA61EB6170BD56F84C +S3152020CED0040B013143F8040BF2E70420F6E700BFE8 +S3152020CEE0F05AF05A2DE9F04F8FB006460C46FFF740 +S3152020CEF0B3FE0546002800F06E81002900F06B81E4 +S3152020CF000B7C1BB90B7F002B00F0DC80236CC3F33A +S3152020CF10001B2268B14B9A4240F05D81304602F0D8 +S3152020CF2043FE2146304602F009FCBBF1000F00F0FB +S3152020CF30CB8000220121304602F048FE304602F006 +S3152020CF4021FE2B682846214623F002032B6007F07A +S3152020CF5085F82B68304643F002032B602A6894F824 +S3152020CF60453022F40352082B237B22F030024FEA4D +S3152020CF7003134FEA024203F030034FEA124208BF5E +S3152020CF8042F4005213436FEA03436FEA13432B60A4 +S3152020CF90FFF714FFAB68204623F40043AB6007F06D +S3152020CFA072F818B1AB6843F40023AB6021462846BB +S3152020CFB0FFF740FF2146304607F075F821463046D8 +S3152020CFC0FFF754FE2B68284623F002032B6007F038 +S3152020CFD045F8237C002B7ED1237F002B6DD004F1B6 +S3152020CFE0600304F1500A04224FF0000801935AF8F6 +S3152020CFF0043B0093002B5BD04FF00103042204F165 +S3152020D0001D0904F130078DF814300023CDF818803F +S3152020D0108DF8243004F13C030B92029317F80F3C31 +S3152020D020002B3BD0D5F8001211F4407F03D099F87D +S3152020D0300010022932D00793002217F8103C2146EF +S3152020D04030460A970893434607F0B5F9024600284A +S3152020D05040F08D80079A0121089B304604EB02126E +S3152020D0608032FFF711FF012305A93046079307F0E9 +S3152020D07098F8024600287AD1618A002940F08980D2 +S3152020D08099F80030023B012B40F28380434621460B +S3152020D090304607F0BCF90246002868D10437029BA7 +S3152020D0A009F101099F42B9D1002A60D1009B9844F9 +S3152020D0B0019B9A459BD1002A59D1BBF1000F70D1F3 +S3152020D0C0002254E09B4624E7204606F0E8FF94F809 +S3152020D0D0461002462FE704F1600304F1500804228B +S3152020D0E0002700934FF0010904F11803019358F803 +S3152020D0F004ABBAF1000F45D0D5F8003213F4407FA7 +S3152020D10002D0637C022B3BD0637D00222146304611 +S3152020D1100793237D8DF8149008934FF000030697EC +S3152020D1208DF82430019B0A9304230B933B4607F06A +S3152020D13042F9079A089B012104EB021230468032DD +S3152020D140FFF7A2FE05A93046CDF81C9007F029F856 +S3152020D150024660B9618A71B9637C023B012B0AD9E8 +S3152020D1603B462146304607F052F9024640B110464A +S3152020D1700FB0BDE8F08F64204843002102F0D2FC96 +S3152020D18057440022009B9845B1D1002A3FF424AF72 +S3152020D190EDE7642003924843002102F0C3FC039A62 +S3152020D1A07CE72B68204643F002032B6006F077FFAE +S3152020D1B094F846100246304602F008FD21463046B5 +S3152020D1C0FFF7FCFD21463046FFF750FD2B6823F064 +S3152020D1D002032B6074E70422C9E700BF4643464278 +S3152020D1E030B5D0E90034084D14440A4444609142B5 +S3152020D1F001D1036030BD11F8014B84EA136455F840 +S3152020D200244084EA0323F2E7144F2120D0E9002387 +S3152020D21030B513F0030308D0054D140E013355F80D +S3152020D2202440042B84EA0222F7D102600A6030BD12 +S3152020D230144F2120024B00201B69DB6818607047A1 +S3152020D24070092220034B242200211B69D8680C3028 +S3152020D25007F0D8BB700922201FB5074B0C2203915B +S3152020D26001A9CDE90130054BD86943699C68002383 +S3152020D270A04704B010BD00BFA000000270092220E4 +S3152020D280F7B52A4C0025E0698DF807504269002A17 +S3152020D29049D02369D9680B68012B33D056682B4691 +S3152020D2A001F108020431B04720B1A0F51C53123BEE +S3152020D2B0012B10D82669F268956865B150680178E7 +S3152020D2C04B1E142B09D90023136342F21070FFF74B +S3152020D2D0C3FF42F2107003B0F0BD01F10053B668CF +S3152020D2E0013B06EBC3071763002FEED056F83330E9 +S3152020D2F0002BEAD02946984723690122DB680020A3 +S3152020D3001A60E8E70B6B4BB15B683BB10DF1070068 +S3152020D310984718B12369DB681D60DCE723699DF8EF +S3152020D3200720DB68EBE71046D5E700BF70092220EF +S3152020D33008B501780020FFF78FFF0A4BD86943698B +S3152020D3401B699847022000F091FCBFF34F8F0649B6 +S3152020D350064BCA6802F4E0621343CB60BFF34F8FBB +S3152020D36000BFFDE77009222000ED00E00400FA0549 +S3152020D370064B1B6810B504469B69D0E9021240680B +S3152020D38098472178BDE81040FFF766BF7009222014 +S3152020D39010B50446FFF756FF074B002062681B692D +S3152020D3A0DB681A61082283F820202178FFF754FFB2 +S3152020D3B0BDE81040F6F7C0BF70092220064B8168D1 +S3152020D3C0DB6810B50446DB68007998472178BDE8EC +S3152020D3D01040FFF741BF00BF7009222010B5044638 +S3152020D3E0FFF730FF084B0020E2681B69DB689A6153 +S3152020D3F0A2681A6162685A61042283F82020217863 +S3152020D400BDE81040FFF728BF7009222038B5224DED +S3152020D410002204462B69DB68C3E9042293F82030D6 +S3152020D420042B04D12B681B69984784B9044674B908 +S3152020D4302B69DB6893F82020152A08D15A6A012AFD +S3152020D44020D11648D3E90A2101F008F804462B6892 +S3152020D4505B6998472B69002C08BF0446DB68204669 +S3152020D46093F82010FFF7F8FE42F212739C4211D156 +S3152020D4702B69DB6893F82030082B0BD1BDE8384088 +S3152020D480F6F7AABF052AE2D14FF49E61044801F09F +S3152020D490B5F8DBE738BD00BF7009222080B32220F3 +S3152020D4A080B522202DE9F347DFF8F8800746D8F803 +S3152020D4B01030DA6816693EB906703046FFF7A6FFA7 +S3152020D4C0002002B0BDE8F08701234FF0000A69460C +S3152020D4D00370D8F81C00CDF804A0D2E9055942697A +S3152020D4E0546801AAA047044650B1D8F81C004369C5 +S3152020D4F0DB6898472046FFF789FF87F800A0DFE7FB +S3152020D500DDF804A0BAF1000F02D142F21270F2E740 +S3152020D510D8F81030B24551460098DA6828BF3146EF +S3152020D52092F820300191082B14D1D060D161F6F7E2 +S3152020D5302BFF42F27D73984204D042F274739842B4 +S3152020D54018BF0446019BF61A19D12046FFF75EFF25 +S3152020D5503E70B5E7132B07D10A460146284607F029 +S3152020D56043FA019B1D44EDE7152BF5D0D8F8003062 +S3152020D570024628469C684B46A0470446F1E754B10C +S3152020D580D8F81C004369DB6898472046FFF73EFF02 +S3152020D59000233B7094E7D8F81030DB68C3E9046594 +S3152020D5A08EE700BF700922202DE9F74F394E074616 +S3152020D5B03369DA6814693CB904702046FFF726FFE0 +S3152020D5C0002003B0BDE8F08F4FF0010A9369D2F80E +S3152020D5D0148080F800A0F069D2F80C9092F820B040 +S3152020D5E04269019352699047A042019B28BF204659 +S3152020D5F00546B9F1000F14D002464946264807F0C1 +S3152020D600F3F9CDF80480F069641B2A462249436940 +S3152020D610D3F808800123C04784BBFFF7F7FE3C7070 +S3152020D620CEE708EB0002BBF1030F019216D1326838 +S3152020D63001464046D2F804B0174AD84780460028EB +S3152020D640E1D0F0694A46144943699C685346A0476D +S3152020D6504046FFF7DBFE87F80090B1E73369DB68A9 +S3152020D66093F82030152B05D12A4641460A4807F043 +S3152020D670BBF9C8E7BBF1130FC5D1F5E720B1FFF7FA +S3152020D680C5FE00233B709BE73369019ADB681C614A +S3152020D6905A6195E7700922208CAF2220044B1B6902 +S3152020D6A0DB6893F821300BB9FFF7FCBEFFF77CBF70 +S3152020D6B070092220074A03461269D26892F821204F +S3152020D6C00AB9FFF7EFBE012A01D1FFF76DBF00206F +S3152020D6D01870704770092220064B1B6810B5044627 +S3152020D6E0DB68D0E90212406898472178BDE81040CF +S3152020D6F0FFF7B2BD700922202DE9F0410546164ECE +S3152020D700D0E90178C0683060F0B90024384600F0AE +S3152020D71015FA0028297808BF04242046FFF79CFD07 +S3152020D720C4B90E4D20462F6000F0A0FA33681BB1F5 +S3152020D73083F3088883F309882B684046984700207E +S3152020D740BDE8F04100F092BA00F010FA0028DCD1B2 +S3152020D7500424DBE7BDE8F08184AF222088AF222095 +S3152020D76073B50546F6F7A6F81148AB6805F10C0205 +S3152020D7706968FDF793FB044688B9019001AAAB6836 +S3152020D78069680B48EE68FDF7CFFB044638B9019B44 +S3152020D79036EA030344F6E9630CBF04461C46F6F733 +S3152020D7A08FF82978204602B0BDE87040FFF754BD97 +S3152020D7B000C0CA4010B5A72388B0ADF8003000239A +S3152020D7C0019002A88DF80230531C01EB8202DBB2B5 +S3152020D7D08DF8033091420AD1074A6946D0695A1CEE +S3152020D7E0436992009C680023A04708B010BD51F8D9 +S3152020D7F0044B40F8044BEDE77009222073B50A4DFF +S3152020D80000246A468168EB6800799E6801ABCDE9E1 +S3152020D8100044B0472B69019ADB68920800991C6165 +S3152020D820FFF7C8FF02B070BD700922201FB5074B35 +S3152020D8300C22039101A9CDE90130054BD869436912 +S3152020D8409C680023A04704B010BD00BFB30100028E +S3152020D8507009222030B5214D85B00446FFF7F2FC11 +S3152020D8602B69DA68132382F82030E36882F8213086 +S3152020D8709BB9A16820290ED81948656801601948E6 +S3152020D88011610560184618495161217805B0BDE817 +S3152020D8903040FFF7E1BC0420F7E70023114A104966 +S3152020D8A0039303AB10480093104B12680968F6F7D0 +S3152020D8B06FFA18B9039B013B572B01D900230393F9 +S3152020D8C02B690A4ADB6803995A610122196183F878 +S3152020D8D02120FFF7ABFF05B030BD00BF7009222005 +S3152020D8E080AF22207CAF22208DC6222035C6222042 +S3152020D8F01FB5074B0C22039101A9CDE90130054B19 +S3152020D900D86943699C680023A04704B010BD00BF96 +S3152020D910A30100027009222010B50446FFF792FCCD +S3152020D920084B0020E2681B69A168DB689A6162685F +S3152020D93019615A61032283F82020BDE81040FFF7A1 +S3152020D940D7BF00BF7009222010B50E4C88B0CDE974 +S3152020D9500040A0B99008029202308DF8030003A857 +S3152020D96007F042F8084B69469DF80320D869013212 +S3152020D970436992009C680023A04708B010BD00236D +S3152020D9800293EFE7AF000002700922201FB504465C +S3152020D9900023CDE90233F5F78DFFA36802AA61683B +S3152020D9A00648FDF7C1FA0190F5F78AFFA26802A979 +S3152020D9B00198FFF7C9FF04B010BD00BF00C0CA40C0 +S3152020D9C01FB5074B0C22039101A9CDE90130054B48 +S3152020D9D0D86943699C680023A04704B010BD00BFC6 +S3152020D9E0B00100027009222010B50446FFF72AFC58 +S3152020D9F0084B002062681B69A168DB685A611022E7 +S3152020DA00196183F82020E26883F82120BDE81040A0 +S3152020DA10FFF7D6BF700922201FB5074B0C22039192 +S3152020DA2001A9CDE90130054BD86943699C680023BB +S3152020DA30A04704B010BD00BFB50100027009222006 +S3152020DA4037B50022314D436802210446CDE9002214 +S3152020DA502A69D26882F82110062B55D8DFE803F0F0 +S3152020DA60040A242A2E32400000F0C8FC2178FFF731 +S3152020DA70F3FB17E0C368102B44D8FFF7E3FB2B6991 +S3152020DA802349DB68E268596115211A611984616886 +S3152020DA905962A168C3E90A1200202B69DB6819693B +S3152020DAA0FFF7BAFF03B030BDD0E90221002000F0F5 +S3152020DAB0D5FCDBE7806800F041FDD7E7806800F0E1 +S3152020DAC05BFDD3E7FFF7BEFB2B694FF49E62DB6835 +S3152020DAD01A61104A5A6115221A8462685A62DBE753 +S3152020DAE0FFF7B0FB01A9684600F072FD0028D4D1CB +S3152020DAF02B69019ADB681A61009A5A6140F2151245 +S3152020DB001A84CAE70420C8E70420AFE77009222038 +S3152020DB1080B3222080B52220BFF34F8F0549064BA4 +S3152020DB20CA6802F4E0621343CB60BFF34F8F00BF75 +S3152020DB30FDE700BF00ED00E00400FA0507B5421E10 +S3152020DB4003320ED8084A90420BD001AA0221F7F7B9 +S3152020DB50D9FA30B9019B986800F0010003B05DF82E +S3152020DB6004FB0020FAE700BF012420200A4B5B6833 +S3152020DB701A690AB9104670479A6802F01102112ACA +S3152020DB8006D11A68824203D25A680132824201D2D1 +S3152020DB901433EDE7012070477009222080B5314DDE +S3152020DBA004F03DF802F050FB002001F085FC2E4CBD +S3152020DBB0FDF76CFB2B681B689847EB685B689847DA +S3152020DBC0EB681F6923683BB94FF47A70FDF73AFB5F +S3152020DBD006F098FE244C0EE097F890201A4205D0A5 +S3152020DBE062692046E36891695B6898471834E9E7BB +S3152020DBF01A4206D11834236897F89020002BF7D1A3 +S3152020DC00E8E7E36820461B6898470028F2D0164E9E +S3152020DC100AE097F890201A4205D0B44203D0F36840 +S3152020DC2030469B68984718363368002BF1D12369F4 +S3152020DC30EC611BB11B680BB120469847E869436904 +S3152020DC4013B11B6803B198472B691B689847EC6969 +S3152020DC502B695B689847E368DB68002BF8D0204661 +S3152020DC609847F5E77009222024572120012838B526 +S3152020DC70044611D00E4D2B689BB96CB9F5F71AFEC8 +S3152020DC80FDF7C0FAF5F7CCFD0A4B01209C6001F088 +S3152020DC9013FC02F045FA62B6BFF36F8FBFF34F8FA6 +S3152020DCA038BDEB689B680BB1284698471835E2E7C4 +S3152020DCB02457212000ED00E070B50C4B0446456822 +S3152020DCC05B5D4BB10A4B2846002153F8256001F0B5 +S3152020DCD0C7FB304601F066FA284606F0C0FCA3684A +S3152020DCE060680021BDE87040184700BFADC62220DD +S3152020DCF0BC532120064B10B50446196083680121A8 +S3152020DD0040689847606800F0C3FA002010BD00BF25 +S3152020DD1070BA2220F0B5456887B00746694628465E +S3152020DD2000F0E4FA002834D11B4B01A853F82560D3 +S3152020DD3006F097FD009B2846019301F09DFC01A942 +S3152020DD400246304601F056F900BBBB680221284620 +S3152020DD50124C98470121284601F082FB4FF40011EE +S3152020DD60304606F08DFDB3695A2043F48023B361F3 +S3152020DD70B36943F40023B361236898472368A62018 +S3152020DD8098470120064B585507B0F0BD284600F08D +S3152020DD907FFA0020F8E700BFBC53212070BA22204A +S3152020DDA0ADC6222008B54068034B53F8200006F064 +S3152020DDB080FD002008BD00BFBC53212010B5074C94 +S3152020DDC0204601F013FA830206D5E069044BC0B23F +S3152020DDD01B68BDE81040184710BD00BF00C0074093 +S3152020DDE070BA2220064B0021064A187B93F821344C +S3152020DDF010708B42517008BF084600F00100704712 +S3152020DE0074BA2220B9C62220024B01225A701A70D7 +S3152020DE10704700BFB9C622202DE9F04116460F468D +S3152020DE20002937D0002A35D0002232602BB3012B8F +S3152020DE3032D14FF002081A4B1878E0B1194DAB7B3E +S3152020DE403BB14FF47E7305F120020221A86803F02E +S3152020DE5041FE01244FF0FF311348AC73F5F706FD40 +S3152020DE6095F8203043450BD0A04517D1022B42F2FE +S3152020DE70127018BF2046BDE8F0814FF00108DAE77E +S3152020DE80EB696A8C043B934208D3084B00203B6005 +S3152020DE903260F0E70420EEE70120ECE72046EAE7AF +S3152020DEA0B9C6222074BA222088BA222098BA2220E3 +S3152020DEB038B5084D002105F11404204603F0ADFEA7 +S3152020DEC0002105F1180003F0A8FE2046F5F7E2FC14 +S3152020DED0002038BD74BA22202DE9F0411546204A6B +S3152020DEE00E4612780AB9002012E0B5F57D7F33D888 +S3152020DEF083B1012B32D14FF004081A4CF5F7DAFC06 +S3152020DF00677B57B100236373F5F7DAFC42F2127070 +S3152020DF10BDE8F0814FF00308EFE7F5F7D1FC84F850 +S3152020DF20208084F82170658436B12DB12A46314669 +S3152020DF3004F1240006F058FD94F81A140129D2D1B0 +S3152020DF404FF47E73084AA06803F0A9FD4FF0FF31F5 +S3152020DF500648F5F78BFCC6E70420D9E70120D7E74A +S3152020DF60B9C6222074BA222094BA22208CBA222022 +S3152020DF7010B50446022003F013FE88BB1948F5F796 +S3152020DF800DFD1948636830F91330002B0DDB5A0933 +S3152020DF90012103F01F03203201FA03F3134941F82C +S3152020DFA02230BFF34F8FBFF36F8F636830F9133062 +S3152020DFB0002B09DB5A09012103F01F03603201FAE5 +S3152020DFC003F30A4941F82230094BD3F8602ED207B1 +S3152020DFD006D50022C3F8602EBFF34F8FBFF36F8F75 +S3152020DFE010BD00BF74BA22208257212000E100E014 +S3152020DFF00060CC4040F224420021274870B506F02C +S3152020E00001FD01F0A5FA254BDB681B6958B993F869 +S3152020E010902022F0100283F89020DA6822F0100255 +S3152020E020DA60012037E0D3F8942001320AD0B3F801 +S3152020E03094101B4A1172090A5172B3F896109172E4 +S3152020E040090AD172D3F898200220164B124DB2F12C +S3152020E050FF3F18BF1346144A144E136000232A4646 +S3152020E0603146A5F82034AB602B60F5F72FFB04460C +S3152020E0700028D6D1336828465B68AB60F5F788FC44 +S3152020E0800B4B402283F888234FF480721A6128682C +S3152020E09003F087FA204670BD74BA22207009222008 +S3152020E0A0D90A222044002220602722200C00222068 +S3152020E0B000E100E00139F8B5054615296FD8DFE8DB +S3152020E0C001F00B6E6E6E6E6E6E6E1D2B4A50565C78 +S3152020E0D062686E6E6E6E3B41324E0027022006F538 +S3152020E0E0846186F8217403F089FD044690B996F858 +S3152020E0F020142846F5F79AFC2046F8BD002A4ED053 +S3152020E100284B012183F821141178986883F822144A +S3152020E110F5F714FC0024EFE7224B93F8211400296D +S3152020E1203DD01288140A3AD1D2B22146986883F873 +S3152020E1302324F5F71BFCDFE78AB31A4B93F8223406 +S3152020E1401370E7E75AB31488240A28D1154B93F87D +S3152020E15023341380D0E712B31146BDE8F840F5F7F3 +S3152020E16031BCE2B11146BDE8F840F5F733BCB2B177 +S3152020E1701146BDE8F840F5F739BC82B11146BDE815 +S3152020E180F84003F04DBD52B11146BDE8F840F5F7F1 +S3152020E1900DBC22B11146BDE8F84003F043BD05244D +S3152020E1A0AAE700BF74BA2220014B186802F055BD99 +S3152020E1B074BA22202DE9F8432D4F8046FDF734F8F6 +S3152020E1C00D46396804462B4E4B1C2B48DFF8BC9055 +S3152020E1D03B60D6E90032D0E900C0E31A65EB0202A3 +S3152020E1E09C4570EB020315D201233B60234BC3E9E8 +S3152020E1F00045234BC9E90045C3F800803B68D9F880 +S3152020E2000020013B1F49A21AC6E9004541F82320D8 +S3152020E210BDE8F8830629F1D801A353F821F000BFE1 +S3152020E220EDE12020FDE12020FDE120203DE22020FF +S3152020E2304FE22020FDE1202057E220200F4BD3E97A +S3152020E2400021A21A65EB0101C3E90021D6E70E4B76 +S3152020E250C3E90045D2E70C4B4046D3E90021A21A58 +S3152020E26065EB0101C3E9002102F032F8C6E700BFC1 +S3152020E270CCBE222008242220202422200024222032 +S3152020E28098BE2220B0BE222010242220182422200C +S3152020E29000210E4B002210B5044619600C4800239D +S3152020E2A0C0E900230B48C0E900230B48C0E900231E +S3152020E2B00A4B0B481960FCF7C5FF0A4BC3E900013E +S3152020E2C020460949BDE8104001F0E6BFCCBE2220F9 +S3152020E2D000242220102422200824222098BE222016 +S3152020E2E08038010020242220B5E12020F8B52A4BB1 +S3152020E2F00C461B68072B4CD1284B1B68834248D1E0 +S3152020E300274E284AB168F368DFF8A4C05B1AD6E9FD +S3152020E310005793607D1BCF1B15605760D6E90421DB +S3152020E320B6698A1A711A6426CCF800207343CCF871 +S3152020E3300410B3FBF5F53C3D0D2D28D8B3FBF7F3A0 +S3152020E340403B052B23D806FB02F3B3FBF1F18139A1 +S3152020E35009291CD8B3FBF7F3813B092B17D806F0E4 +S3152020E360C1FA114B114AC0EB00101B680A21126812 +S3152020E37013444FF49662B0FBF3F34B430020B3FBD8 +S3152020E380F2F30533B3FBF1F353432360F8BDFFF7D4 +S3152020E3907FFF0120FAE700BFCCBE222098BE222094 +S3152020E3A0B0BE22209CBE22200024222010242220FF +S3152020E3B0A8BE22200268064B9A4206D14068054B09 +S3152020E3C098428CBF0020012070470020704700BF54 +S3152020E3D04655504B0001010010B5064C204604F04E +S3152020E3E0E0FF21460448FCF721FD08B901232372CA +S3152020E3F010BD00BFC0C322200020C84038B5124D12 +S3152020E4002B7AD3B12B7A012B1CD1104C4FF49E6240 +S3152020E4100021204606F0F6FA4FF4956204F1100109 +S3152020E4200B4804F0C8FF60B90A4B0B4AC4E9002305 +S3152020E4300223C4E902002B7203E0FFF7CDFF002858 +S3152020E440E0D038BD0120FCE7C0C32220D0BE222048 +S3152020E4500020C840000101004655504B2DE9FF41C0 +S3152020E460022A4FF0000307460D461646CDE9023311 +S3152020E4702ED103AA02A9304606F075FA039BAB4299 +S3152020E48032D8029BAB422FD3DFF8AC8098F80840D5 +S3152020E490A31E012B10D9012C42D12248FFF78AFF37 +S3152020E4A0A8B34FF495622049204804F0AFFF0446D4 +S3152020E4B068BB032388F808307FB9022E14D1342371 +S3152020E4C02A46394619480093194B04F0C7FF17E00E +S3152020E4D010220823CDE90223D0E7324629463846A2 +S3152020E4E006F04DFA022E01D0042410E034233A46B9 +S3152020E4F000210E4801930E4B00932B4604F0EAFF91 +S3152020E500044640B1382200210A4806F07BFA2046EC +S3152020E51004B0BDE8F081034B0222C3F8B824F6E705 +S3152020E5200124F4E7D0BE2220E0BE22200020C840CD +S3152020E5308CC3222088C32220C0C3222013B50446A0 +S3152020E5400C48FFF737FF90B1002301A920460193FD +S3152020E55006F0F6F948B92346064A4FF49E610198FB +S3152020E560F6F78AFE08B9F6F7A3FD02B010BD012002 +S3152020E570FBE700BFD0BE22201FB5002203A90190B1 +S3152020E580039206F0DDF9019B014688B94FF49E617E +S3152020E5900D4A0398F6F706FE014648B90A48FFF7C2 +S3152020E5A009FF48B94FF49E62074806F02BFA01214D +S3152020E5B0084605B05DF804FB044B1B7A012BF7D0E7 +S3152020E5C0FFF70AFF0146F3E7D0BE2220C0C3222050 +S3152020E5D038B5044658B151B1074D2846FFF7EAFE13 +S3152020E5E038B14FF49E63002025600B6038BD04208F +S3152020E5F0FCE70120FAE700BFD0BE2220B1F59E6FAE +S3152020E60010B504460FD1FFF7D5FE70B10A4609484A +S3152020E610214606F0E9F9084B1B7A012B07D0BDE8E5 +S3152020E6201040FFF7D9BE042010BD0120FCE70020B2 +S3152020E630FAE700BFD0BE2220C0C3222010B506286C +S3152020E6401FD8DFE810F0070036007800C000080148 +S3152020E6504A017801CF48B1B1D0F8201821F4803171 +S3152020E660C0F82018D0F8201821F0FF010A43C0F85E +S3152020E6702028C0F83038D0F8003583F48033C0F80D +S3152020E6800035002014E0D0F8203843F48033C0F839 +S3152020E6902038D0F8203823F0FF031A43C0F820284A +S3152020E6A0D0F8003583F48033C0F80035D0F8400800 +S3152020E6B010BDB848F9B1D0F85048D0F8501804F415 +S3152020E6C0007421F48031C0F85018D0F8501821F069 +S3152020E6D0FF010A43C0F85028C0F86038D0F85038D7 +S3152020E6E083F48073C0F85038D0F8503803F4007380 +S3152020E6F09C42F9D0C5E7D0F85018D0F8503801F40C +S3152020E700007143F48033C0F85038D0F8503823F0C5 +S3152020E710FF031A43C0F85028D0F8503883F480736A +S3152020E720C0F85038D0F8503803F400739942F9D005 +S3152020E730D0F87008BCE7974829B3D0F88048D0F89D +S3152020E740801804F4007421F48031C0F88018D0F8A1 +S3152020E750801821F0FF010A43C0F88028C0F890389D +S3152020E760D0F8803883F48073C0F88038D0F8803889 +S3152020E77003F400739C42F9D0D0F8803823F48033F8 +S3152020E780C0F880387DE7D0F88018D0F8803801F49A +S3152020E790007143F48033C0F88038D0F8803823F0D5 +S3152020E7A0FF031A43C0F88028D0F8803883F480737A +S3152020E7B0C0F88038D0F8803803F400739942F9D015 +S3152020E7C0D0F8A00874E7734829B3D0F8B048D0F819 +S3152020E7D0B01804F4007421F48031C0F8B018D0F8B1 +S3152020E7E0B01821F0FF010A43C0F8B028C0F8C0387D +S3152020E7F0D0F8B03883F48073C0F8B038D0F8B03869 +S3152020E80003F400739C42F9D0D0F8B03823F4803337 +S3152020E810C0F8B03835E7D0F8B018D0F8B03801F4C1 +S3152020E820007143F48033C0F8B038D0F8B03823F0E4 +S3152020E830FF031A43C0F8B028D0F8B03883F4807389 +S3152020E840C0F8B038D0F8B03803F400739942F9D024 +S3152020E850D0F8D0082CE74F48F9B1D0F82049D0F885 +S3152020E860201904F4007421F48031C0F82019D0F83E +S3152020E870201921F0FF010A43C0F82029C0F8303999 +S3152020E880D0F8203983F48073C0F82039D0F8203985 +S3152020E89003F400739C42F9D0F3E6D0F82019D0F87F +S3152020E8A0203901F4007143F48033C0F82039D0F8A0 +S3152020E8B0203923F0FF031A43C0F82029D0F8203925 +S3152020E8C083F48073C0F82039D0F8203903F40073FC +S3152020E8D09942F9D0D0F84009EAE62E48A9B1D0F8D5 +S3152020E8E0E01821F48031C0F8E018D0F8E01821F0A3 +S3152020E8F0FF010A43C0F8E028C0F8F038D0F80034E9 +S3152020E90083F40043C0F80034BBE6D0F8E03843F463 +S3152020E9108033C0F8E038D0F8E03823F0FF031A43DC +S3152020E920C0F8E028D0F8003483F40043C0F800343F +S3152020E930D0F81009BCE61748A9B1D0F8E01821F480 +S3152020E9408031C0F8E018D0F8E01821F0FF010A4302 +S3152020E950C0F8E028C0F8F038D0F8703583F00103ED +S3152020E960C0F870358DE6D0F8E03843F48033C0F80F +S3152020E970E038D0F8E03823F0FF031A43C0F8E02827 +S3152020E980D0F8703583F00103C0F87035D0F800092F +S3152020E9908EE600BF0040C840074AD2F80032D2F89F +S3152020E9A000020222DBB2C0F3C1300130824003488C +S3152020E9B0B0FBF2F0584370470040C84000366E0145 +S3152020E9C002284FEAC1010AD0032810D0002003468E +S3152020E9D0C8401EBFB3FBF0F0122148437047084BB6 +S3152020E9E03F20D3F8703288401840064BF0E7044B7E +S3152020E9F03F20D3F8303288401840034BE8E700BF49 +S3152020EA000040C84000A4781F00389C1C10B51E2842 +S3152020EA1053D8DFE800F010121416141418181C1CF2 +S3152020EA201E2426282A2A2C2E3133353737393B3DAA +S3152020EA303D4242444400224810BD2248FCE7224859 +S3152020EA40FAE72248F8E7BDE81040FFF7A5BF20489F +S3152020EA50F2E700210220BDE81040FFF7B1BF0121D7 +S3152020EA60F8E70221F6E70321F4E71A48E4E71A48F3 +S3152020EA70E2E700210320EEE70121FBE70221F9E767 +S3152020EA800321F7E71548D7E71548D5E71548D3E7F3 +S3152020EA900420BDE81040F4F70FB80520F9E7124C02 +S3152020EAA0124A2368C3F30223D05CFFF7AFFF236803 +S3152020EAB0DBB20133B0FBF3F0BEE70020BCE700BF9A +S3152020EAC00024F400006CDC0200366E010084D71787 +S3152020EAD000A4781F00389C1C001C4E0E00CA9A3BAE +S3152020EAE00065CD1D00C2EB0B0000CC4059592120DA +S3152020EAF037B5002315461B4A52F8044BA04214D0A2 +S3152020EB000133102BF8D1012442698C4022EA0402D9 +S3152020EB10E34342612A78DAB9426813404360AA78EF +S3152020EB2003B0BDE8304005F0ABBD0D2BEBD80E4A27 +S3152020EB30D35C8A2BE7D05A010C4B13441A68D20790 +S3152020EB40E1D401221A60BFF34F8FBFF36F8FDAE72C +S3152020EB506A78019105F08AFD436801991C43446037 +S3152020EB60DDE700BF34542120D15B21200060CC403A +S3152020EB704001074BC9B21A584A40D20706D501F0A0 +S3152020EB8001011950BFF34F8FBFF36F8F704700BF1E +S3152020EB900060CC4008B5436ADB074CBF034B044BCF +S3152020EBA01B689847BFF34F8F08BD00BFE8C32220BC +S3152020EBB0ECC322200649002310B551F8044BDAB2C3 +S3152020EBC0844203D00133072BF7D11A46104610BDB5 +S3152020EBD07454212010B50C46FFF7ECFF014B1C5432 +S3152020EBE010BD00BFBBC622202DE9F74F0446406A40 +S3152020EBF010F00100CDE9002325D0226912F0010270 +S3152020EC0024D000201FE0774486B1009BB3FBF7FC7D +S3152020EC10614507D3A1EB0C0BB3453FBF5E4660464B +S3152020EC20AA4691460135B5F5807FECD10132082AD6 +S3152020EC3000D0A6B9226C019B22F0FF0242EA0A02EA +S3152020EC402264C3F8009003B0BDE8F08FDFF81C8063 +S3152020EC5010464FF0FF0A4FF007094FF0FF3618F8FD +S3152020EC6001EB00254FEA4E07CFE700BFDF5B2120CF +S3152020EC702DE9F341002704460D4616460197FFF756 +S3152020EC8099FF334B01214FF00108185CFFF770FFE5 +S3152020EC90636A204643F0010363622A7E636A083250 +S3152020ECA008FA02F123EA0103697E01FA02F21343EC +S3152020ECB06362EB7EA97E626A9B06090603F0806367 +S3152020ECC022F0E06201F0407122F008020B4329680D +S3152020ECD013433246636201ABFFF786FF6968A76557 +S3152020ECE0424601392B7A2046C1F30B0141EAC371F2 +S3152020ECF0019BDB0603F0605319436B7A9B0703F0D5 +S3152020ED0080431943AB7ADB0503F4000319432B7E9A +S3152020ED101B0603F04073194321662369E96843EAF9 +S3152020ED20080323613346F3F707FF33462969022276 +S3152020ED302046F3F701FF3346032269692046F3F77D +S3152020ED40FBFE39462046FFF745FF02B0BDE8F0819D +S3152020ED50E75B212042692DE9F04F12F0807987B0B8 +S3152020ED6004460E4640F0FD8003694A4623F00103FF +S3152020ED70036105F035FD002800F0F6802369204642 +S3152020ED80D1F80CA043F440732361784B6361CAF316 +S3152020ED908053D1E900B70093FFF70CFF744A1AF489 +S3152020EDA0801F125CD6F808804FEA0240B568616859 +S3152020EDB040EA0220C1F3072140EA020040EA02632A +S3152020EDC04FF0010202FA01F20393D3B2226EC2F36C +S3152020EDD0C802029302F101030193009B59D0B26825 +S3152020EDE001998A4294BF0022012200920199606AE9 +S3152020EDF00429029A00F0407028BF0421B0F1807FB8 +S3152020EE0002FB01F204924FEA1A1202D0B0F1007FDF +S3152020EE1042D1BBFA8BFA4FEA5A1A606A1206009E32 +S3152020EE20002F20F0080002F0407208BF4FF400297E +S3152020EE306062206940F001002061206E20F04F7032 +S3152020EE400243009800052266226E40EA465002437D +S3152020EE5042EA09022266E26DD206FCD15FFA81F9E6 +S3152020EE604E46B8F1000F1AD1009A62B1BAF1000FBE +S3152020EE7009D1E26D029902F01F028A42F9D0226E50 +S3152020EE8022F440122266002F65D163695B05FCD5EA +S3152020EE9063E0CDF80090A9E74FF0000ABDE7C14511 +S3152020EEA088BF5FFA88F9E26D029902F01F028A4232 +S3152020EEB0F9D027B1A5EB080204998A4214D2BAF1D7 +S3152020EEC0000F29D0226E42F480222266009A32B187 +S3152020EED0019A904503D1226E22F450122266019A7D +S3152020EEE0A8EB0208002FBCD0002DBAD0BAF1000F13 +S3152020EEF003D0E26D12F4F81FF8D0E26D12F4F81F59 +S3152020EF00AFD0AE423846616F88BFEEB23246374424 +S3152020EF10AD1B05F017FCF0E7BBF1000F08D01A4611 +S3152020EF20584649460593CB4405F0E8FB1346039003 +S3152020EF30039AA8EB09086266D4E7AE423846616F89 +S3152020EF4088BFEEB23744AD1B324605F0FBFBE26D9F +S3152020EF5012F4F81FF1D1002DF9D1002007B0BDE819 +S3152020EF60F08F4FF4C870F9E70420F7E7033F00013C +S3152020EF70BBC62220024B03485968FFF70BBE00BFB1 +S3152020EF80CCC3222000401140024B03489968FFF74A +S3152020EF9001BE00BFCCC3222000801140024B034873 +S3152020EFA0D968FFF7F7BD00BFCCC3222000C011408F +S3152020EFB0024B03481969FFF7EDBD00BFCCC32220C1 +S3152020EFC000001240024B03485969FFF7E3BD00BFFA +S3152020EFD0CCC3222000C0C2400346054A002052F856 +S3152020EFE0041B994202D001300D28F8D1704700BF6A +S3152020EFF0905421202DE9F84F0B684FF00A0900265E +S3152020F00004460D4609FB02FA4FEA83089E464FF036 +S3152020F010040C37465FFA8CFBBAFBF8F1053198448D +S3152020F020B1FBF9F189B2012938BF01210CFB01F08E +S3152020F0300CF1010CB2FBF0F0834234BFC01A181A2F +S3152020F04070459EBF86465E460F46BCF1210FE1D114 +S3152020F0506422B3FBF2F303EB43037345C0F096809F +S3152020F0602046FFF7B9FF4B4B1A5C4B4B52011344FA +S3152020F0701A68D20705D401221A60BFF34F8FBFF337 +S3152020F0806F8FA368321F013EC7F30C0743F002039C +S3152020F090032A4FEA0666A360A36806F0F85623F0F3 +S3152020F0A00203A360236998BF43F4003323F01F2370 +S3152020F0B023F0FF031E433E432661236923F000539A +S3152020F0C02361A269EB7B22F4E26229791B0222F0DA +S3152020F0D0070203F4E0630A431A43AB7B9B0003F049 +S3152020F0E0040313436A79012A4BD1002946D023F4FD +S3152020F0F00063A361EB7922695B0322F4005203F4B7 +S3152020F1000053134323616A7A2B7A43EA0243E3624C +S3152020F110A36A43F08803A362A36A43F44043A3620D +S3152020F1206B7B2A7B1B01616A520103F0100302F0DC +S3152020F130200213430B436362AB7A1BB1636A43F00D +S3152020F14008036362EB7A1BB1636A43F001036362AF +S3152020F150A979124B124A002918BF1A46636913430C +S3152020F1602A7C6361A3690AB143F400236A7C0AB12D +S3152020F17043F480230020A361BDE8F88F43F4006385 +S3152020F180B7E70029B5D043F01003B2E740F221506B +S3152020F190F2E700BFEE5B21200060CC4000C01FE0DC +S3152020F1A000C01FC010B5C36A13F4E06FFBD14369BA +S3152020F1B05902FCD54369002443F0C02343F4F813B5 +S3152020F1C043618461FFF708FF064B1A5C064B520108 +S3152020F1D013441A68D20704D51C60BFF34F8FBFF3A0 +S3152020F1E06F8F10BDEE5B21200060CC404269836A80 +S3152020F1F003481B0C03F0C30313431840704700BF7A +S3152020F200C3C0FFC1044A0548516808B5044B1B6892 +S3152020F2109847BFF34F8F08BDF0C3222000C0074078 +S3152020F22024C42220044A0548916808B5044B1B684B +S3152020F2309847BFF34F8F08BDF0C322200000084017 +S3152020F24024C42220044A0548D16808B5044B1B68EB +S3152020F2509847BFF34F8F08BDF0C3222000400840B7 +S3152020F26024C42220044A0548116908B5044B1B688A +S3152020F2709847BFF34F8F08BDF0C322200080084057 +S3152020F28024C42220044A0548516908B5044B1B682A +S3152020F2909847BFF34F8F08BDF0C3222000C00840F7 +S3152020F2A024C42220044A0548916908B5044B1B68CA +S3152020F2B09847BFF34F8F08BDF0C322200000094096 +S3152020F2C024C42220044A0548D16908B5044B1B686A +S3152020F2D09847BFF34F8F08BDF0C322200040094036 +S3152020F2E024C42220044A0548116A08B5044B1B6809 +S3152020F2F09847BFF34F8F08BDF0C3222000800940D6 +S3152020F30024C42220044A0548516A08B5044B1B68A8 +S3152020F3109847BFF34F8F08BDF0C3222000C0094075 +S3152020F32024C42220044A0548916A08B5044B1B6848 +S3152020F3309847BFF34F8F08BDF0C3222000000A4014 +S3152020F34024C42220044A0548D16A08B5044B1B68E8 +S3152020F3509847BFF34F8F08BDF0C322200040C240FC +S3152020F36024C422200F4B1A6811060AD50E4A5A6049 +S3152020F3704FF6FF729A601A6822F0A00242F020020D +S3152020F3801A600A4B1A6812060AD5074A5A604FF69F +S3152020F390FF729A601A6822F0A00242F020021A60B8 +S3152020F3A0704700BF0080034020C528D90000C140F7 +S3152020F3B008B5FFF7D7FF054AD2F8883043F4700303 +S3152020F3C0C2F88830BDE80840F4F72ABA00ED00E0FC +S3152020F3D0002307B5182101AA0C488DF804308DF892 +S3152020F3E005308DF80630FFF783FB094A05230949A6 +S3152020F3F0C2F87031D1F8AC3023F48073C1F8AC3028 +S3152020F4000C23C2F8B43303B05DF804FB004013404C +S3152020F41000800E4000400E40074B0022C3F86C218E +S3152020F420C3F82026C3F87021C3F81C260E22C3F861 +S3152020F430B023C3F8B423704700800E40074B002228 +S3152020F440C3F86C21C3F82026C3F87021C3F81C26E4 +S3152020F4500222C3F8B023C3F8B423704700800E409D +S3152020F4600129064B4FF4801201D11A607047C3F848 +S3152020F4708020BFF34F8FBFF36F8F704700E100E0EE +S3152020F480044B0548D3F8A03913F0040F034B18BFBB +S3152020F4901846704700C0CA4000366E0100F8240185 +S3152020F4A0044BD3F8A03913F0080F14BF3C20AA2010 +S3152020F4B0704700BF00C0CA4070B5D0B91C4B1D4D47 +S3152020F4C01D4E2B60D6F8A04900F05EFE1B4AC4F3E1 +S3152020F4D00114A8B1FFF7E4FF0223AA2803FA04F4B3 +S3152020F4E008D14FF40173C2F8803C154BB3FBF4F3DB +S3152020F4F02B6070BD40F20243C2F8803C114BF5E7E9 +S3152020F500FFF7CEFFAA2808D14FF40173C2F8803C1A +S3152020F5100B4B23FA04F42C60EBE740F20243C2F8AB +S3152020F520803CD6F870385B074CBF074B074BF0E77B +S3152020F53000366E019009222000C0CA400000CC402F +S3152020F5400084D71700389C1C0065CD1D001E7C2901 +S3152020F550274AD2F8403143F0020310B5254CC2F891 +S3152020F56040314FF00043A363236B23F08043236372 +S3152020F570236B43F440432363236B43F4C013236359 +S3152020F580D4F8A03043F40013C4F8A030D4F8A02037 +S3152020F590FFF776FF184B22F0E07298424FF0640076 +S3152020F5A00CBF42F4400242F0A072C4F8A020D4F846 +S3152020F5B0A03043F44053C4F8A030FBF74FFED4F8D4 +S3152020F5C0A0300B4A012043F04003C4F8A0304FF46A +S3152020F5D08033C4F8A830236B23F080432363002391 +S3152020F5E02360D2F8403123F00103C2F8403110BD08 +S3152020F5F0000043400040434000366E01072893BF59 +S3152020F600064B082305221A5C9CBF054B1B5C013B3D +S3152020F61043EA0223034AC2F800327047FB5B2120CB +S3152020F620035C21200000CC40024B0122C3F8202479 +S3152020F630704700BF0060CC40024B0022C3F8202434 +S3152020F640704700BF0060CC40084BD3F80031DAB2B7 +S3152020F650C3F30223023B0132052B96BF04490548FA +S3152020F66051F82300B0FBF2F0704700BF0000CC40D9 +S3152020F670C454212000366E010048704700B4C404CB +S3152020F68010B51446002A41D003293FD8431E012B0A +S3152020F6903CD8012909D002290AD0002936D11D209B +S3152020F6A0FFF7B4F92060002010BDFFF7CDFFF9E762 +S3152020F6B0174B184A012818BF1A4613681068C3F337 +S3152020F6C00223C0B2013B421C062B1DD8DFE803F0E3 +S3152020F6D0081A1816141204000F48B0FBF2F0E1E7BE +S3152020F6E00E4B0F48D3F8A03913F0040F0D4B08BF4B +S3152020F6F01846F2E70C48F0E70C48EEE70C48ECE712 +S3152020F7000C48EAE70C48E8E70648E6E70420CBE77A +S3152020F710800ACC40000ACC4000389C1C00C0CA403D +S3152020F72000B0710B00366E01007B9A1700A4781F5B +S3152020F730E04B9D270024F4000084D717431E012B7D +S3152020F7402DE9F74F04460D4600F24E810228D1F8C6 +S3152020F75040A0D1F8608018BF00241AF4807F18BFFB +S3152020F7600134B8F1000F05D1B04B782202FB0433C7 +S3152020F770D3F86880D5F86CE0BEF1000F40F03781D1 +S3152020F780AA4B782202FB0433D3F874906E6E26B9E6 +S3152020F790A64B782202FB0433DE6EAF6E27B9A34B2D +S3152020F7A0782202FB04331F6FD5E91432002B40F058 +S3152020F7B02081002A00F0828078239C4A03FB0422A1 +S3152020F7C01379002B40F02781984A782101FB0421C8 +S3152020F7D00B7A53B19B00497A03F1804341F0100103 +S3152020F7E003F568231961C3F8546278230020634304 +S3152020F7F01A44019394469CF814109CF815B089005D +S3152020F80001F1804101F56821C1F810B0C1F8547288 +S3152020F8109CF8161031B19CF817B001F59371844BE2 +S3152020F82043F821B001300CF1040C0428E3D195F8DB +S3152020F8304510082900F000812A7B02F0FD02012ACA +S3152020F8401FD11AF4007F00F01E81BEF1000F794BE4 +S3152020F85014BFF1464FF008091A7892B192005978D0 +S3152020F86002F1804241F0100102F568221161C2F8AE +S3152020F87054929A782AB1D97802F593726C4B43F830 +S3152020F8802210284604F0FFFBC0B17823674A03FBE9 +S3152020F8900422137B93B19B00517B03F1804341F0DB +S3152020F8A0100103F568231961C3F85462937B2BB1A9 +S3152020F8B0D17B03F593735E4A42F82310D5E916319E +S3152020F8C0002B40F0E480002900F08E807823574AD0 +S3152020F8D003FB042292F83830002B40F0ED80DFF82D +S3152020F8E04C81782303FB048393F834201AB993F8A8 +S3152020F8F03830002B78D0782202FB048292F83C30D4 +S3152020F9005BB19B0092F83D2003F1804342F0100228 +S3152020F91003F568231A61C3F8546278230021DFF89F +S3152020F92010C103FB0483184690F8482090F849E03C +S3152020F930920002F1804202F56822C2F810E0C2F855 +S3152020F940547290F84A202AB190F84BE002F593722F +S3152020F9504CF822E0013104300429E5D195F84520E0 +S3152020F960082A00F0B4802B7B03F0FD03012B1BD14A +S3152020F970782202FB048292F84430ABB19B0092F8A5 +S3152020F980451003F1804341F0100103F568231961E6 +S3152020F990C3F8549292F8463033B192F8471003F5C3 +S3152020F9A09373234A42F82310284604F06CFBD8B1DF +S3152020F9B0782000FB048494F84030ABB19B0094F867 +S3152020F9C0412003F1804342F0100203F568231A6197 +S3152020F9D0C3F8546294F8423033B194F8431003F5B7 +S3152020F9E09373134A42F8231003B0BDE8F08FF146F3 +S3152020F9F0CCE678230D486343C118C35C9B00497825 +S3152020FA0003F1804303F568231961C3F85482002A41 +S3152020FA103FF4DAAED0E69B00527903F1804303F51A +S3152020FA2068231A61C3F85482CEE600BF14552120DC +S3152020FA3000800E400B5C212037494FF0780C0CFBC0 +S3152020FA40041191F8241000293FF4F6AEDFF8D0C037 +S3152020FA5092F8241092F825B0890001F1804101F511 +S3152020FA606821C1F810B0C1F8547292F8261029B135 +S3152020FA7092F827B001F593714CF821B00130043269 +S3152020FA800828E5D1D8E6254A019B1344E4E67823C5 +S3152020FA90214A03FB042292F834304BB19B0092F882 +S3152020FAA0352003F1804303F568231A61C3F8548275 +S3152020FAB000293FF414AF09E79B0092F8392003F17F +S3152020FAC0804303F568231A61C3F8548207E7782216 +S3152020FAD002FB048292F85820002A3FF444AF1048B3 +S3152020FAE093F8582093F859C0920002F1804202F5EB +S3152020FAF06822C2F810C0C2F8547293F85A202AB14C +S3152020FB0093F85BC002F5937240F822C0013104338A +S3152020FB100829E5D127E700BF145521202455212087 +S3152020FB2000800E4038B504461D200D46FEF76EFF98 +S3152020FB30074BB0FBF3F0013054EA050300D138BD62 +S3152020FB40034600BF013BFCD1013C65F10005F3E7EC +S3152020FB5000093D00014BD861002070470040C0407D +S3152020FB60024BDB6903600020704700BF0040C04085 +S3152020FB7019B1034B00200B6070470420704700BF4B +S3152020FB8080F5E409012809D0022806D1044B012258 +S3152020FB901A60BFF34F8FBFF36F8F7047014BF6E785 +S3152020FBA0A063CC408063CC40012809D0022806D10E +S3152020FBB0044B00221A60BFF34F8FBFF36F8F70471D +S3152020FBC0014BF6E7A063CC408063CC40012A2DE987 +S3152020FBD0F047044698B00E4666D8002964D0431EC6 +S3152020FBE0012B61D83D4B0DF1100C3D4D3D4FE0468C +S3152020FBF0012818BF1D4607F128092B68C3F30223C5 +S3152020FC003868083757F8041CE6464F45AEE8030007 +S3152020FC10F446F5D1344F0DF1380C07F1280AE14688 +S3152020FC203868083757F8041CE6465745AEE80300DF +S3152020FC30F446F5D1032B3AD8DFE803F04B024D4B9F +S3152020FC401A46561E1B02294A03F4E063F6B207CA57 +S3152020FC501E4301AB83E80700254BA100254A012C32 +S3152020FC6008BF13461B6853B118AB20460B4453F8E4 +S3152020FC705C2C136843F002031360FFF795FF2B6873 +S3152020FC80B34200D02E602046FFF77CFF18AB1944E4 +S3152020FC9051F85C2C0221136823F002031360002301 +S3152020FCA06A460093FFF7ECFC18B0BDE8F0870023E6 +S3152020FCB01421012A01FB03F301D0434400E04B44E5 +S3152020FCC00A2E28BF012603EB460213F81630527857 +S3152020FCD0B7E70122B5E70123EAE700BF800ACC4037 +S3152020FCE0000ACC40EC4A2120144B2120E04A212036 +S3152020FCF0A063CC408063CC4010B5094C0122A36878 +S3152020FD00C3F30023013302FA03F303600020A36820 +S3152020FD1003F00303063302FA03F30B6010BD00BF82 +S3152020FD200040C04030B589B01022002104466846E4 +S3152020FD3004F068FE102200210DEB020004F062FE82 +S3152020FD4000F0E2F90228054640F0A1804FF4E07247 +S3152020FD500021204604F056FE4E4B4F48012284F8BF +S3152020FD604450C4E900034D4B9B6884F84520642207 +S3152020FD70C3F340132267C3F10203494A84F846306D +S3152020FD804FF08053236503236373A373D2F8801C1B +S3152020FD90090E02D0D2F8803C1B0E43F0416343F477 +S3152020FDA0806300933F4B0193D2F8803C13F47F0F5E +S3152020FDB057D0D2F8803CC3F307433B4A01256946F6 +S3152020FDC004F180001A43354B04929B68C3F3001339 +S3152020FDD003F10C020B33E27305FA03F305FA02F260 +S3152020FDE0C4F8C031C4F8C421102204F0FDFD10222D +S3152020FDF004F598700DEB020104F0F6FD284BD3F89C +S3152020FE00802C11042FD41022284904F1900004F0CC +S3152020FE10EBFD234DD5F8803C13F480432ED11022C0 +S3152020FE20234904F5A87084F8CD3104F0DDFDD5F8FA +S3152020FE30803C1B0605D5D5F8803CC3F3C013A4F817 +S3152020FE407C30164B9B68C3F34123022B1AD0032BFD +S3152020FE501BD0012B14BF6423C8230020636709B05D +S3152020FE6030BD1323A9E784F8CC51D3F8803C1A045B +S3152020FE7054BF4B230A23A4F8D231CAE7012384F89E +S3152020FE80CD31D4E74FF4C873E7E73223E5E70420E2 +S3152020FE90E5E700BF00040156464346420040C040E5 +S3152020FEA000C0CA4008300424000418080457212022 +S3152020FEB0F45621203E4B0C22002110B51961C3F89F +S3152020FEC054225961C3F858229961C3F85C22D9611A +S3152020FED0C3F860221962C3F864225962C3F86822E3 +S3152020FEE09962C3F86C22D962C3F87022027A2AB1A9 +S3152020FEF0012A25D190F82120102A21D100210C2257 +S3152020FF00C3F88810C3F8CC22C3F88C10C3F8D022AB +S3152020FF10C3F89010C3F8D422C3F89410C3F8D8227B +S3152020FF20C3F89810C3F8DC22C3F89C10C3F8E0224B +S3152020FF30C3F8A010C3F8E422C3F8A410C3F8E8221B +S3152020FF401B4B00210C220424D965C3F8A022196654 +S3152020FF50C3F8A4229966C3F8AC22C3F8B010C3F81C +S3152020FF60F4429965C3F89C2290F830000138032882 +S3152020FF7019D8DFE800F0120C06025965C3F898223A +S3152020FF8010BD0221C3F87C11C3F8C023F8E7022153 +S3152020FF90C3F87811C3F8BC23F2E70221C3F8741101 +S3152020FFA0C3F8B823ECE7C3F8B410C3F8F822E7E780 +S3152020FFB000800E40013803280CD8074B53F8201018 +S3152020FFC0064B185C0123834012B1C1F88830704754 +S3152020FFD0C1F88430704700BF145721200F5C2120A0 +S3152020FFE0431E032B05D82A30024B40F20922C0019A +S3152020FFF01A5070470000CC400378013B032B45D88C +S31520210000DFE803F00223455F3E4B00210B2201202E +S31520210010C3F87C11C3F8C023C3F88811C3F8CC23B5 +S31520210020C3F8D405C3F884110521C3F8C823C3F81E +S315202100308011C3F8C42303F598235A6842F08052CD +S315202100405A601A6842F080521FE02E4B0C2206215C +S315202100500120C3F8D011C3F81424C3F8DC11C3F846 +S315202100602024C3F8E805C3F8D8110521C3F81C2498 +S31520210070C3F8D411C3F8182403F5A0235A6842F4EF +S3152021008000325A601A6842F400321A6070471D4BBA +S3152021009009210C220120C3F8F411C3F83824C3F80E +S315202100A0F811C3F83C24C3F80406C3F8FC11052132 +S315202100B0C3F84024C3F80012C3F8442403F5A0232F +S315202100C0BBE7104B0C2209210120C3F84412C3F8A7 +S315202100D08824C3F84812C3F88C24C3F81406C3F81D +S315202100E04C120521C3F89024C3F85012C3F8942446 +S315202100F003F5A8235A6842F480325A601A6842F4DA +S315202101008032C2E700800E40034B044A9B68C3F32A +S315202101100313D05C704700BF0040C040135C2120F0 +S31520210120064BD3F8602ED20706D50022C3F8602EBF +S31520210130BFF34F8FBFF36F8F704700BF0060CC4056 +S31520210140104BD3F8D02812F0F00FC2F3031017D199 +S31520210150D3F8E028D3F86019C2F3400201F0020156 +S315202101600A43012A0DD0D3F8E028D3F86039C2F307 +S31520210170400203F00203134314BF012000207047DD +S315202101800020704700C0CA40044B40F624401B681B +S31520210190C3F30B131B1A58425841704700ED00E058 +S315202101A030B5C5B04FF487721E49684604F01CFC51 +S315202101B01D4BD3F8702CC2F305422C2A0CD9BFF340 +S315202101C04F8F1A491A4BCA6802F4E0621343CB6057 +S315202101D0BFF34F8F00BFFDE7FFF7D6FF0623154C50 +S315202101E05A430DEB02018B8804EB8324124B50B129 +S315202101F01249134A5961C3E900129A61114AC3E986 +S315202102000A2445B030BD49883DF802504FF00052AE +S31520210210890218605A616FF06042013902EB85220A +S315202102205960EAE73C4B212000C0CA4000ED00E09E +S315202102300400FA05FFFF37200C0A22200000FE1FAA +S31520210240FFFF01200000202008B50020FFF734F908 +S31520210250FFF7A6FF064BD3F8602ED20706D401223C +S31520210260C3F8602EBFF34F8FBFF36F8F08BD00BF3A +S315202102700060CC4010B5064CA369DB0107D5054BA0 +S315202102805B6823B1012098474FF08073A36110BD8D +S315202102900040134028C4222010B50A4B04220A4CC0 +S315202102A059601821204604F0EBF96369102243F0A6 +S315202102B080736361054B83F869234FF40072DA60FA +S315202102C010BD00BF28C422200040134000E100E0D9 +S315202102D00A4B4FF4007210B5C3F88C20BFF34F8F11 +S315202102E0BFF36F8F00241821054883F869432246DE +S315202102F004F0C6F9034B5C6010BD00BF00E100E0AD +S315202103000040134028C422201E4B984207B51CD1F9 +S315202103101D4A05230221C2F898310123C2F8DC3374 +S3152021032001AA8DF80430194BD3F8703983F00403D0 +S31520210330C3F380038DF8053000238DF80630144849 +S31520210340FEF7D6FB03B05DF804FB124B9842F9D198 +S31520210350A3F54D1305220F21C3F8CC210C22C3F876 +S315202103601024012301AA8DF80430084BD3F87039C3 +S3152021037083F00203C3F340038DF8053000238DF863 +S315202103800630DCE70080414000800E4000C0CA4094 +S315202103900080134000C04140064B0A46984203D1B3 +S315202103A00221054804F062B9044B984201D10F215C +S315202103B0F7E77047008041400080134000C041404C +S315202103C00B4B984208D1A3F54C130422C3F8942150 +S315202103D00D22C3F8D8237047064B984207D1A3F59F +S315202103E04D130B22C3F87C210D22C3F8C02370475D +S315202103F00080414000C04140334B984226D10229FA +S3152021040010D891B1314B0022C3F8A821C3F8AC21D1 +S31520210410C3F8B0210422C3F8EC23C3F8F023C3F890 +S31520210420F42302E005390129ECD9284B1022C3F8FF +S315202104309C210022C3F8A021C3F8A4210422C3F8B9 +S31520210440E023C3F8E423C3F8E8237047204B9842DE +S3152021045039D10139052926D8DFE801F016032525CA +S3152021046016031A4B0022C3F8D421C3F8D821C3F886 +S31520210470DC21C3F8E0210422C3F81824C3F81C2464 +S31520210480C3F82024C3F82424104B0022C3F8BC210E +S31520210490C3F8B821C3F8B4210422C3F80024C3F831 +S315202104A0FC23C3F8F823094B1022C3F8C8210022C4 +S315202104B0C3F8C421C3F8C0210422C3F80C24C3F8ED +S315202104C00824C3F8042470470080414000800E4050 +S315202104D000C041402A4B984227D189B101294ED1CA +S315202104E0A3F54C130022C3F8A821C3F8AC21C3F8E5 +S315202104F0B0210422C3F8EC23C3F8F023C3F8F42354 +S31520210500204B1022C3F89C210022C3F8A021C3F836 +S31520210510A4210422C3F8E023C3F8E423C3F8E82363 +S3152021052069BB0C22C3F8F4237047174B984226D176 +S3152021053089B1012923D1A3F54D130022C3F8BC216A +S31520210540C3F8B821C3F8B4210422C3F80024C3F880 +S31520210550FC23C3F8F8230B4B1022C3F8C821002211 +S31520210560C3F8C421C3F8C0210422C3F80C24C3F83C +S315202105700824C3F8042411B90C22C3F8F8237047A0 +S315202105800080414000800E4000C0414010B50A4CF9 +S315202105900123A26802F0010203FA02F20260A26894 +S315202105A012F01E0F06D0A268C2F343029340002008 +S315202105B00B6010BD4023FAE70040C04010B5634CC4 +S315202105C0634BA2686FEA122202F0010280F85220C0 +S315202105D0D3F8801CC1F3001180F85510D3F8801C64 +S315202105E011F0080F14BF1021082180F82110A168CD +S315202105F06FEA512101F0010180F82010D3F8801CE7 +S31520210600C1F3401180F83110D3F8801CC1F3801139 +S3152021061080F85C10D3F8801CC1F3C0110631017318 +S31520210620D3F8801CC1F30221023905291CD8DFE821 +S3152021063001F0031315151719022180F82210D3F87A +S31520210640803CC3F3C223013B062B38D8DFE803F0D5 +S315202106500E2B2D2F313335000421EEE70121ECE736 +S315202106600321EAE70721E8E70021E6E709233849BC +S3152021067080F82330D1F8803CC3F3803380F85D3075 +S31520210680324B9B686FEA932303F001034372D1F81F +S31520210690803CC3F30243072B44D8DFE803F03B1207 +S315202106A0353739433D400A23E1E70B23DFE70D2385 +S315202106B0DDE70E23DBE70F23D9E71023D7E70C232A +S315202106C0D5E70823C0F8A830D1F8803CC3F3C2432C +S315202106D0022B04D0032B02D0012B18BF002380F834 +S315202106E030302AB31A4AD2F8803CC3F3006380F80B +S315202106F05630D2F8803CC3F34263052B23D8DFE85A +S3152021070003F014181A1C1E201023DBE72023D9E717 +S315202107104023D7E78023D5E74FF40073D2E74FF460 +S315202107208063CFE74FF48073CCE7012380F85330E1 +S3152021073010BD0223FAE70323F8E70423F6E705236E +S31520210740F4E70623F2E70723F0E700BF0040C04085 +S3152021075000C0CA4038B54FF480720021044604F007 +S3152021076051F906230025204623732C4B84F8555016 +S315202107702362402384F83150C4F8A83040F2011373 +S31520210780A4F85C50A4F8523084F856506572FFF7CD +S3152021079015FF4FF4007394F82120A3654FF47A7343 +S315202107A0082AA4F85050A4F85E304FF0010384F8AB +S315202107B05450A4F860302AD194F823209340C4F8C9 +S315202107C0A030D4F8A0304FF480624FF01E4500208F +S315202107D05B09134984F8E000C4F8A4300123A06101 +S315202107E0237284F83000C4E92B23FF234FF480326F +S315202107F06373E3814FF00073C4E904534FF0004340 +S31520210800E3614023C4E9001284F8243038BD102A3C +S31520210810D7D194F823200132D0E700BF0108000C5C +S3152021082053454D43C36803F1200203F5007103614B +S31520210830F0B51A6020321B688A42FAD100218568D8 +S3152021084000F1140400F15407196010234FF0010E12 +S315202108504FF0400C80F894304368D3F8402122F49D +S315202108607F02C3F84021D3F84021C3F84021D3F891 +S31520210870A82142F00802C3F8A821D3F8A82122F002 +S315202108800402C3F8A8212A46C2F808E0403252F8C9 +S31520210890406C6CF31A4642F8406C12F8086C44F806 +S315202108A0041BA74261F30006E16302F8086CEBD131 +S315202108B04722C3F85851C3F85411C3F8482180F868 +S315202108C09610F0BD01F00F0141F08001F2F7B6B983 +S315202108D001F00F01F2F7B2B9CA0883682DE9F04178 +S315202108E002F0100201F00F04012605462243CF090A +S315202108F09640620042EAD11203EB82134FEA821814 +S3152021090093F838206FF3000283F83820F2F79EFB04 +S315202109106B68D3F8B021324224D1D3F8B8213240A2 +S3152021092020D1A96841F808206CB9002FD3F8C0211D +S3152021093014BF6FF40D016FF08D010A40C3F8C02159 +S315202109402046BDE8F08103EB8403002F1446D3F81B +S31520210950C01114BF6FF40D006FF08D000140C3F854 +S31520210960C011EDE70224EBE72DE9F84F0C46154699 +S315202109700746002800F06D81142900F26C81DFE8FA +S3152021098011F015001F002800A700AF00EB001A0167 +S31520210990200126006A016A016A016A016A01500161 +S315202109A063016A016A016A016A0147014268D2F834 +S315202109B0403143F00103C2F840312046BDE8F88F8B +S315202109C04268D2F8403123F00103C2F84031002495 +S315202109D0F3E7002A00F03F8192F802A0B2F800B096 +S315202109E04FEADA090AF00F085146D67809F010099C +S315202109F049EA08034FF0010909FA03F9F2F726FB20 +S31520210A007A68D2F8B03119EA030FD6D1D2F8B831A3 +S31520210A1019EA0309D1D106F003064FEA4800BB683B +S31520210A20CBF30A0E40EADA10012E4FEADA1C4FEAFE +S31520210A30801403EB80102BD12988BEF5806F1F5996 +S31520210A40C1F3C12128BF4FF4806E013161F39F7715 +S31520210A501F5119596EF31A411951297990F8385095 +S31520210A6061F3410580F83850B8F1000F15D1195995 +S31520210A7041F000511951195941F400411951D2F827 +S31520210A80C011BCF1000F16D1B30043F0C00315E00D +S31520210A90195969F39F711951DBE7B1FA81F11D5972 +S31520210AA002EB8802490961F35D751D5119596FF3CE +S31520210AB0CF311951E3E7B30443F440030B43C2F882 +S31520210AC0C03190F8383043F0010380F838307EE782 +S31520210AD0002A00F0C0801178BDE8F84FFFF7FCBE50 +S31520210AE0002A00F0B880117801F00F04CE096500A4 +S31520210AF045EAD115F2F7AAFABB68AD0179685B59A7 +S31520210B0013F4004FC3F3C03210D034B9D1F8C03119 +S31520210B1043F00113C1F8C0314FE701EB8401D1F82D +S31520210B20C03143F00113C1F8C03150E744B9002E3A +S31520210B30D1F8C03114BF4FF4803201221343E9E7A3 +S31520210B40002E01EB840118BF4FF48030D1F8C0313B +S31520210B5008BF01200343E6E7002A7CD011787B6871 +S31520210B6011F00F024FEAD1100ED10028D3F8C0215F +S31520210B7014BF6FF480306FF0010002403846C3F86D +S31520210B80C021F2F763FA22E7002803EB820318BF7C +S31520210B906FF48030D3F8C02108BF6FF0010002EA3C +S31520210BA0000214BF4FF480004020C3F8C021D3F89F +S31520210BB0C0210243E2E70124002A3FF4FEAE14803D +S31520210BC005E7002A47D0147814F0080043D1E2091A +S31520210BD014F00F047B680ED06F34002A03EB8403B4 +S31520210BE0596814BF4FF480330123194214BF0123BE +S31520210BF000236B80EBE6002AD3F8C01114BF4FF4F3 +S31520210C0080330123194214BF012300236B80D4E6AC +S31520210C100AB32B7842685B0643F08073C2F85431BD +S31520210C20D5E6002464F07F01E5B238460134C9B205 +S31520210C30FFF752FE29463846FFF74EFE082CF1D102 +S31520210C403846FFF7EFFDC2E62AB190F898301370A7 +S31520210C50BDE60324B1E60124AFE62DE9F04F89B0A4 +S31520210C60002857D004686368D3F84411D3F8482163 +S31520210C7001EA020A1AF0400FC3F844A118D0D3F88A +S31520210C80AC214FF0FF11C3F8AC21D3F8BC21C3F816 +S31520210C90BC21C3F8B411D3F8B02112F0FF1FF8D12B +S31520210CA0D3F8843113F4807337D0012384F8963016 +S31520210CB01AF0010F0BD06368D3F8AC61002E36D120 +S31520210CC06268D2F8BC31C2F8BC31002B76D11AF039 +S31520210CD0040F1FD000238DF81D306268D2F884516D +S31520210CE015F48075CDE9053314D1D2F8843113F466 +S31520210CF0007F14BF0223002384F8983094F896307D +S31520210D0043B1102305A98DF81C30206800F0F7FB8C +S31520210D1084F8965009B0BDE8F08FCDE9053310232C +S31520210D2005A9ADF81C30206800F0E9FBC0E70025B5 +S31520210D30012726FA05F35FFA85F8D8073AD5A3685D +S31520210D40414620464FEAC51903EBC51B1BF8302F18 +S31520210D50D2090192F2F784F8019A2046414682F07F +S31520210D600102F2F77DF808238DF81C8007FA05F297 +S31520210D708DF81D7006936368CDF814B0C3F8AC21A5 +S31520210D80A2684A44D2E90A0CD3F8401141F4005111 +S31520210D90C3F84011D3F840118904F5D505A9C2E934 +S31520210DA00C0CD3F84021206822F40052C3F84021AC +S31520210DB000F0A5FB0135082DBBD181E74FF0000BB3 +S31520210DC023FA0BF25FFA8BF7D60705D40BF1010B29 +S31520210DD0BBF1200FF4D17AE7BBF10F0F85BF103F6E +S31520210DE001220022FFB2072FF0D802EB470600216D +S31520210DF0F6B2CDE9051167B95AB1A16891F8780003 +S31520210E00850706D5086C800003D4086C40F0005075 +S31520210E100864B100029104EB8601B6014D6947EAC7 +S31520210E20C21107EB0217012225F01F05019102FAB3 +S31520210E3007F7002DCAD0029A04EB0208D8F81450DD +S31520210E4025F01F052A465AB15168090602D4516850 +S31520210E50080408D551680906B8D452681204B5D5B4 +S31520210E604FF000096CE0126822F01F02EBE7696857 +S31520210E700806DED4059949B9A968A88B21F47F6192 +S31520210E80C0F30B0021F00F01014305916868E96940 +S31520210E90C0F30E40C1F31231091A06980144D8F83D +S31520210EA054000691D8F8141081424CD1C8F81490D8 +S31520210EB00122C8F85490A16831448A60C1F80C9067 +S31520210EC06968090404D4D8F8141031F01F020CD112 +S31520210ED0039305A9019B8DF81D908DF81C30206860 +S31520210EE000F00DFB039BCDE905992169C5F80490F6 +S31520210EF0296094F894102561013184F89410D8F84A +S31520210F00141031F01F013FF461AF48680D460206E7 +S31520210F1016D56268C2F8B071D2F8B80107420FD14E +S31520210F20D2F8B0010742FBD1D2F8B80117EA000E58 +S31520210F3006D1A06830448160C0F80CE0C2F8B071B7 +S31520210F40002D94D142E70968C8F81410B8E72DE995 +S31520210F50F341174691F900201E460023002A054613 +S31520210F608DF807300C460B7803DB052002B0BDE84F +S31520210F70F08103F01F03022BF7D14B88002BF4D1EC +S31520210F80B1F80680B8F1020FEFD10DF10702062143 +S31520210F90006800F089FB9DF80730002BE5D1A38856 +S31520210FA02C460821286824F80C3F224600F07CFB99 +S31520210FB03C60C6F80080D9E72DE9F74F1E4600236D +S31520210FC005468B468DF80330174691F90030002BC4 +S31520210FD003DB052003B0BDE8F08F4C88002CF8D127 +S31520210FE0B1F806A0BAF1020FF3D10DF103020621C1 +S31520210FF0006800F059FB9DF80330012BE9D89BF8B6 +S31520211000009005F10C0819F01F090DD14246042143 +S31520211010286800F049FBAB8903F00303AB81C6F8AE +S3152021102000A0C7F80080D5E7B9F1010F04D1AC8122 +S315202110302046C6F800A0F4E7B9F1020F12D1BBF879 +S31520211040043001AA052128688DF80430ADF8064020 +S3152021105000F02AFBBDF8063003F00303AB81C6F866 +S315202110600090DEE70520DCE72DE9F341164691F9CC +S3152021107000201F460023002A05468DF807300C46FE +S315202110800B7803DB052002B0BDE8F08103F01F03B6 +S31520211090012BF7D14B88002BF4D1B1F80680B8F17A +S315202110A0010FEFD10DF107020621006800F0FCFAAD +S315202110B09DF80730002BE5D1A38805F10C02C7F84E +S315202110C0008016211B0232602868AB8100F04CFD7E +S315202110D0D9E7F7B5154691F900201E460023002AA7 +S315202110E004468DF807300B7802DB052003B0F0BDCE +S315202110F0DB06FAD14B88002BF7D18B88002BF4D134 +S31520211100CF88012FF1D10DF107020621006800F0C9 +S31520211110CBFA9DF80730012BE7D804F10C02376072 +S3152021112015212A60206800F01FFDDFE72DE9FF4108 +S315202111301C46002307460E468DF80330154691F9A5 +S315202111400030002B03DB052004B0BDE8F081B1F887 +S3152021115002800DF103020621006800F0A5FA9DF810 +S315202111600330022BEFD84FEA1821F2885FFA88F351 +S315202111700129029211D1327802F01F02134352D152 +S31520211180B388002B4FD101AA0B21386800F0ECFC43 +S31520211190019B2B60029B2360D6E70229CAB20AD182 +S315202111A03278D1063FD1B288002A3CD101AA0C211E +S315202111B08DF80C30E9E7032A0AD13278D20632D1CA +S315202111C08DF80E3001AAB3880D21ADF80C30DCE75D +S315202111D0212A0BD1327802F01F02012A23D113BBF7 +S315202111E0B38801AA0E218DF80C30CEE7222A0BD105 +S315202111F0327802F01F02012A15D1A3B9B38801AA98 +S315202112000F218DF80C30C0E7232A0CD1327802F039 +S315202112101F02012A07D18DF80C3001AAB38810218B +S315202112208DF80D30B1E70520B2E77FB591F9002081 +S31520211230002305460C46002A8DF80F300B7802DA5A +S31520211240052004B070BDDB06FAD18B88002BF7D19F +S31520211250CE88002EF4D10DF10F020621006800F070 +S3152021126023FA9DF80F30012BEAD80DF10F02062122 +S3152021127028688DF80F6000F038FA638843B9012376 +S315202112800DF10F02062128688DF80F3000F02DFA76 +S31520211290A21C03212868019200F037FC019A09211A +S315202112A0286800F061FCCCE773B591F90020002372 +S315202112B005460C46002A8DF807300B7802DA0520E0 +S315202112C002B070BDDB06FAD18B88002BF7D1CE88F0 +S315202112D0002EF4D10DF107020621006800F0E4F971 +S315202112E09DF80730032B0BD0022BE8D863880DF10C +S315202112F0070207218DF80730286800F0F6F9DFE785 +S3152021130032460721286800F0F0F90028D8D1012398 +S315202113100DF1070206218DF80730EDE7002337B5B9 +S315202113208DF8063005468DF807300C4691F90030A8 +S31520211330002B02DA052003B030BDCB88002BF9D152 +S315202113400DF106020621006800F0AEF99DF806305F +S31520211350012BEFD86378032B04BF01238DF80730A7 +S31520211360237813F01F0309D16388012BE2D10DF1D4 +S3152021137007021421286800F0F7FBDCE7022BD9D1DC +S315202113806388002BD6D1A1880B0706D19DF807307B +S31520211390C9B2286853B100F069F99DF80730221D9A +S315202113A0286833B1052100F0B0FBC4E700F06DF9C0 +S315202113B0F3E70621F7E770B50D46114604461A468E +S315202113C00529049B08D1802100F050F920460021CF +S315202113D0BDE8704000F04AB9E8881E68864288BF79 +S315202113E0186089B91B681268204600F0F7F878B989 +S315202113F095F90030002B0BDA03460246014620469A +S31520211400BDE8704000F0F0B800231A461946EBE7F4 +S3152021141070BD37B591F90020002305460C46002AD8 +S315202114208DF807300B7802DA052003B030BD03F0A2 +S315202114301F03012BF8D1CB88002BF5D10DF1070203 +S315202114400621006800F030F99DF80730002BEBD1FA +S31520211450A2880421A3782C46286843EA022324F86B +S315202114600C3F224600F051FB22460A21286800F033 +S315202114707BFBDAE720B1436823B15B690068184713 +S315202114800320704706207047F0B585B00D460446E7 +S31520211490CDE9003268B3416869B3EE090C2746EAE3 +S315202114A04506F6B207FB0607397D31BB03A803F0B3 +S315202114B00FFA01210398397503F00FFA15F0800FE1 +S315202114C06168206814BF8F68CF682946DDE900321C +S315202114D0B847054650B103A803F0FAF90C2000239A +S315202114E000FB06440398237503F0F7F9284605B037 +S315202114F0F0BD0325FAE70625F8E70225F6E77FB5AD +S315202115000446002949D0002847D08368002B46D09D +S315202115100A7A102A1FD1012300220E21002580F8C4 +S31520211520CF30FFF7A7FF022304F1C00284F8CC5065 +S3152021153084F8CE3023461D75C3E903550C339A42D0 +S31520211540F9D1A3680022012120469847002084F85A +S31520211550CF5004B070BD12F0080020D1530003F003 +S315202115601E0343EAD2130C2202FB0342D568B5B1EE +S315202115700E6801964E68497A02968DF80C1051B163 +S31520211580207584F820000C2201A9204602FB034362 +S315202115901A69A847DDE71175F5E70320D9E7012068 +S315202115A0D7E700221146FFF765BF37B5044698B124 +S315202115B0436823B15B680068984700236360002550 +S315202115C001A803F085F90198256084F8CD5003F010 +S315202115D084F9284603B030BD0320FBE701F00F0133 +S315202115E041F08001FFF750BF01F00F01FFF74CBFFB +S315202115F0F0B4B8B1C9B1C2B18D7815F0080614D1AD +S315202116006C000C2704F01E0444EAD5141568526890 +S3152021161007FB0403DD601A610A461E750221F0BC10 +S31520211620FFF728BF0320F0BC70470420FBE737B51E +S3152021163004468DF80710A8B1CDB20DF1070203217A +S31520211640FFF718FF15F008020ED16B000C2103F0CD +S315202116501E0343EAD51301FB0343C3E903221A756B +S3152021166003B030BD0320FBE70420F9E70B0707B5BC +S315202116708DF8071007D40DF107020421FFF7FAFE92 +S3152021168003B05DF804FB0420FAE70B0707B58DF8B4 +S31520211690071007D40DF107020521FFF7EBFE03B052 +S315202116A05DF804FB0420FAE7DAB1023906291AD8B3 +S315202116B0DFE801F004071113090E15000F21FFF7AA +S315202116C0D9BE1021FBE790F8CE3000201370704749 +S315202116D090F8CC30F9E70621F1E70721EFE7092138 +S315202116E0EDE7042070470120704703390B292BD8B9 +S315202116F0DFE801F0062A2A090F2A2A2628222A2467 +S315202117001121FFF7B7BEFAB1137880F8CE30002029 +S31520211710704790F8CE30032B0AD0AAB11378142122 +S3152021172000F1CC0280F8CC30032380F8CE30E8E7D4 +S3152021173000F1CC020821E4E70A21E2E70B21E0E7C8 +S315202117400C21DEE70D21DCE70120704710464AB146 +S31520211750002382F82130536833B11B6823B10A460E +S3152021176001211847032070470120704710464AB1AE +S31520211770002382F82230536833B11B6823B10A46ED +S31520211780022118470320704701207047836870B5CE +S31520211790044693B1002501200626A3681A7995428D +S315202117A002D30023A36070BD9A6806FB05F3206847 +S315202117B00135D15CFFF73BFFEFE70120F3E72DE968 +S315202117C0F04F044685B01646002A00F053810028A2 +S315202117D000F05081C9B20139052900F24F81DFE895 +S315202117E011F0C8000600110027003A005F000025ED +S315202117F0057780F8215080F822508560284605B04B +S31520211800BDE8F08F4368002B00F03881037F1278E2 +S315202118109A4200F031810BB1FFF7B8FF3378237755 +S315202118200023A377204605B0BDE8F04FF1F73CBE53 +S315202118304368002B00F022811588437FB3EB152FB7 +S3152021184040F01C81EDB2837FAB4200F01581FFF77A +S315202118509DFFA577E6E74368002B00F00F8183687B +S31520211860002B00F00B81012500274FF00608A94601 +S31520211870A3681A79BA42C1D99A6808FB07F3D25CC0 +S31520211880337893420AD1DB09206814BF84F82330A8 +S3152021189084F824903178FFF7E9FE05460137E7E7FA +S315202118A04368002B00F0EA808368002B00F0E68055 +S315202118B04FF0000801254FF0060B6FF0010A47462D +S315202118C0A3681A79424599D90BFB08F99B68327886 +S315202118D013F80910914227D12068FFF7D6FE3378D5 +S315202118E00546DB09A36822D094F82320E2B1E268D9 +S315202118F084F82370901C17D09B68206813F8091050 +S31520211900236901F00F01FFF769FE054650B1E3680F +S31520211910224601A92068019323698DF80C70029330 +S31520211920FFF714FFC4E903A708F10108C8E794F8D3 +S315202119302420002AF8D0626984F82470911CF3D0DF +S315202119409B68206813F80910A36901F00F01FFF79E +S315202119504BFE054650B16369224601A920680193B1 +S31520211960A3698DF80C700293FFF700FFC4E905A740 +S31520211970DAE713681A7802F01F05012D7ED1407F00 +S31520211980197988427FF43AAF597801390A2977D8CB +S31520211990DFE801F0061A2C767676767638536400BF +S315202119A012066DD5DA88002A6AD05B8801AA03211E +S315202119B05BBAADF80C3063681B6820469847019BBB +S315202119C005467360029B0FE0170659D5DB88002B4D +S315202119D056D004F11F07636804211B683A46204626 +S315202119E09847012305467760B36007E7150647D553 +S315202119F0DB88002B44D004F12007636805211B686E +S31520211A003A46ECE710063BD4DA88002A38D05B88A0 +S31520211A10317B5BBAB268ADF80C3063681B6819B1AB +S31520211A200292092101AAC8E771682046CDE901124F +S31520211A3001AA062198470546E0E6110620D4DA8830 +S31520211A40F2B95B88224607211B0A02F81F3F6368E9 +S31520211A501B68204605B0BDE8F04F184712060FD463 +S31520211A60DA886AB95B882246082102F8203F636812 +S31520211A701B68EEE70325C1E60025BFE60125BDE665 +S31520211A800525BBE610B5044638B1FFF77FFE0023B6 +S31520211A90C4E900332377A37710BD0320FCE7F8B5EB +S31520211AA0044698B190F8210090B9012784F8217035 +S31520211AB094F8237017B1C4E90323F8BD2068FFF7F2 +S31520211AC08DFD0028F9D084F82170F6E70320F4E76C +S31520211AD00220F2E7F8B5044698B190F8220090B991 +S31520211AE0012784F8227094F8247017B1C4E90523BC +S31520211AF0F8BD2068FFF778FD0028F9D084F82270F8 +S31520211B00F6E70320F4E70220F2E72DE9F3410D461B +S31520211B10164622B90423184602B0BDE8F08101A950 +S31520211B20F1F74EFD0028F5D1044601274FF00C0888 +S31520211B30019BE2B25B68197A914201D83B46EAE7DA +S31520211B401B6808FB02339A681279012A0AD1586840 +S31520211B5032462946FFF733FE05280346DBD00028E7 +S31520211B6008BF00270134E3E773B50D4601A90446D2 +S31520211B701646F1F725FD88B9012D08D10199204670 +S31520211B80F1F7F4FB019A02212046FFF7BEFF019BC4 +S31520211B903246294620465B685B68984702B070BD6D +S31520211BA0F7B501A90646F1F72BFD044618BB0C27EC +S31520211BB0019BE5B25A68117AA94214D913687D434B +S31520211BC02B449A681279012A02D15868FFF75AFFC5 +S31520211BD0019B5B681B681D44AB681B790BB9686840 +S31520211BE098470134E4E71868FFF7DFFC044610B96B +S31520211BF03046F1F729FD204603B0F0BD1FB50191EE +S31520211C0003A9F1F7FDFC28B9039B0221019A186843 +S31520211C10FFF74AFD05B05DF804FB01607047704768 +S31520211C200520704705207047416A43684A688261CA +S31520211C300A68033A9A42826003D20B8923B9F2F7C2 +S31520211C40E9BA42F27670704742F277707047036E96 +S31520211C5042688360934210D8426ED20707D5C16D60 +S31520211C608269914203D113B1C36000207047B0F835 +S31520211C705A30DB0704D4F2F7CDBA42F27670704798 +S31520211C8042F27C70704738B5C56D04462846FBF76D +S31520211C9055FF80B104F11801606EA847012804D1AF +S31520211CA02046BDE83840F2F7B5BA022802D1F2F72C +S31520211CB043FB002038BD42F27F70FBE7436A30B4F4 +S31520211CC0044600F158050FCB85E80F0004F1670281 +S31520211CD05A2315F8011F95420B44FAD194F858201E +S31520211CE0DBB29A422ED194F859300A2B27D8DFE835 +S31520211CF003F02C0A0E1206162C1A061E220042F278 +S31520211D00127030BC7047204630BCFFF7A0BF20465A +S31520211D1030BCF2F791BA204630BCF2F79FBA204662 +S31520211D2030BCFFF7B0BF204630BCF2F7B9BA204607 +S31520211D3030BCF2F7D9BA204630BCF2F799BA42F232 +S31520211D407B70DEE742F27970DBE70020D9E70138A4 +S31520211D5018280ED8DFE800F010100D0D0D0D100DEE +S31520211D600D1010100D1010100D100D0D0D0D0D1044 +S31520211D70100042F63C00704742F63D007047012094 +S31520211D807047002070474FF40070704737B50446DE +S31520211D9001A80D4602F0C9FB042221460DEB0200C3 +S31520211DA002F0C6FB6288294601A802F0C1FB01A8E0 +S31520211DB00DF1060102F0D3FBBDF8060003B030BDBC +S31520211DC010B50446002201212046F2F797FC48B996 +S31520211DD023785A2BF6D101210A226018BDE810401A +S31520211DE0F2F78CBC10BDF2F7FDBC01207047002014 +S31520211DF0704710B50446FBF7A1FE48B104F2FF1047 +S31520211E00FBF79CFE20B12046BDE81040F3F71CB815 +S31520211E10042010BD12F4706FC2F3032373B5054657 +S31520211E200C4604D0012B15D042F2D87010E001AA1D +S31520211E30F3F768F9D0B9019B1B695E69D6B12146B2 +S31520211E402846F3F7F3F90028EED121462846B04754 +S31520211E5002B070BD01ABF3F779F938B9019B1B6943 +S31520211E60DB683BB1214628469847F1E7002C08BF7D +S31520211E700020EDE742F2E570EAE773B505461646FE +S31520211E800C4689B1F3F7D2F980B901AA2146284611 +S31520211E90F3F738F930B9019B3246214628461B698A +S31520211EA0DB68984702B070BD0846FBE742F2D8703E +S31520211EB0F8E702F087BD08B513460A4601461846BB +S31520211EC002F092FD002008BD08B513460A461946A0 +S31520211ED002F08AFD002008BD10B40C4601231146CC +S31520211EE022465DF8044BF0F725BC10B586B0044692 +S31520211EF004A8019102F051FB019A214604A8FBF77F +S31520211F006FF904A803A9FBF781F9039806B010BD40 +S31520211F1070B50546ADF5806D0C460CB9012017E04C +S31520211F20B4F5806F26466946284628BF4FF4806639 +S31520211F303246F6F71DFA0023B1086A46994202D1A4 +S31520211F40A41B3544E9E752F8040B013003D00020C5 +S31520211F500DF5806D70BD0133F0E710B586B00446CE +S31520211F6004A8019102F019FB019A214604A8FBF746 +S31520211F7037F904A803A9FBF749F9039806B010BD40 +S31520211F80836CF0B5002953D0CE78032E09D1836AEC +S31520211F9023F480338362836A43F4003383620020EF +S31520211FA0F0BD446AA40746D48C68B4F5803F45D257 +S31520211FB0D1E903570FB9002D40D023F036030DB1B7 +S31520211FC043F01003012C03D90D78F5B943F02203F0 +S31520211FD04D78EDB1D0F8C85043F0800345F48055B3 +S31520211FE0C0F8C8500460022E1BD049684568C1F349 +S31520211FF00C0141EA044105F4604421434160116802 +S3152021200041F4001111608364C9E743F02603DFE719 +S31520212010D0F8C85023F0800325F48055C0F8C85045 +S31520212020E1E7816A43F0220341F480118162E6E7E8 +S3152021203023F03603E7E741F66410B1E70420AFE742 +S315202120404A7A30B5BAB10369032ACB6013D14369E1 +S3152021205001F108050B618369C0694B610B4643F881 +S31520212060180F1868000243F80409AB4203D0DC7824 +S3152021207020435860F5E7C86968B1082A0CD84FF47F +S31520212080A37323FA02F2D30706D5CB68184241F669 +S31520212090661008BF002030BD0020FCE730B5446C17 +S315202120A0836CDB0716D44B68E4B29D071EBF23F051 +S315202120B0030304334B60D1E901355D43B4EB950F1E +S315202120C04FEA950303D29B1AA34228BF23461344E2 +S315202120D09A4201D1104630BD056ACC6844F8225077 +S315202120E00132F5E730B5446C836CDB0717D44B6896 +S315202120F0C4F307449D071EBF23F0030304334B601B +S31520212100D1E901355D43B4EB950F4FEA950303D20F +S315202121109B1AA34228BF234613449A4201D1104633 +S3152021212030BD0C6954F8224001320462F5E730B5FE +S31520212130C468436A0D7ADB072DD4042D2DD04A7A23 +S315202121400B6A013A082A08D8DFE802F0051C1F226B +S3152021215022051C05050043F4D0130A68032D24F01B +S315202121607F544FEA026208BF43F4400324F46C14DF +S3152021217002F07C5203F47B03224313434A68826094 +S31520212180C36030BD43F4D813E7E743F41023E4E7D3 +S3152021219043F40033E1E7042DF3D1836B23F00103CC +S315202121A08363EEE710B501F0E063C46A2343C3627B +S315202121B0C36A0B4203D1101E18BF012010BD002A6D +S315202121C0F9D0013AF4E7036C4FF40072C3F30240CD +S315202121D023F0784323F47F23824023F47F638A608C +S315202121E04FF6FF7223F00803CA6043F030030B61D8 +S315202121F07047836C03F00803002B70B50BBF0026B4 +S3152021220001264FF480754FF40075914245D3B1FBD9 +S31520212210F2F4B1FBF4F3934288BF0134102C2FD969 +S315202122202209B5FBF2F302FB135323BB012A22D049 +S31520212230B4FBF2F303FB02F5AC421ED8B1FBF3F15A +S31520212240B1FBF2F103B1013B22B1002E14BF0224CE +S315202122500124E240C46A1B01120224F47F44DBB22A +S3152021226092B224F0F00413432343C362436A1B072B +S31520212270FCD5084670BD0132D3E701331544DBE78F +S315202122801023B3FBF4F36343D3F11003B1FBF4F131 +S315202122901ABF234600222246D4E700231A46D9E72D +S315202122A0C36A43F00063C362C36A1B0103D4081EB9 +S315202122B018BF012070470029F9D00139F4E72DE90B +S315202122C0F041C2F30B04DDF818C021F04041002C67 +S315202122D059D19D074FF6FC761CBF23F00303043307 +S315202122E0B3FBF6F506FB153606B10135BCF1010F18 +S315202122F008D1002604E050F82670FF0725D501369F +S315202123008E42F8D104EB45058D4240D8BCF1000F11 +S3152021231008BF29464FF6FC7E00F104088C4216D3CD +S3152021232004F18044BCF1010F04F1FF3450F824302C +S3152021233043F0020340F8243005D150F8253043F0EC +S31520212340210340F8253000201FE03446DAE7734583 +S3152021235016D8002B14BF1E4604263703002B47F020 +S31520212360110718BF9B1B40F824700CBF002721277B +S31520212370174348F8247026F0030702343A44CDE760 +S315202123804FF6FC76E9E741F66810BDE8F081032097 +S31520212390FBE710B50C78ECB912F0030F1FD1BBB1B6 +S315202123A08265836A240223F0605304F4407423F463 +S315202123B0407383624B78826ADB0603F060532343A2 +S315202123C013438362836C43F001038364002010BD91 +S315202123D00260E6E7002303604B688365E1E741F667 +S315202123E06810F4E7EFB51546D26807460E4602B9BE +S315202123F02A693078012806D002281FD070B141F6EB +S31520212400651004B0E0BDD5E90110009300FB01F36E +S315202124100392D6E90101FFF752FF039A3378032B62 +S31520212420EFD00028EDD1EB78032BEAD06B7831461B +S31520212430384604B0BDE8E040FFF7ABBFD5E901102F +S31520212440009300FB01F30392D6E90101F5F7F2FC93 +S31520212450E3E7836E090223F4FE4301F4FE41194387 +S315202124608166836E13F0802F14BF012000207047D0 +S3152021247010B5CBB1836C120443F0007302F4E02231 +S31520212480836401F07F03D0F8CC40134324F4E02267 +S3152021249022F07F02134343F08073C0F8CC30C36B04 +S315202124A043F44003C36310BDD0F8CC3023F08073AE +S315202124B0C0F8CC30C36B23F44003F3E77FB5054640 +S315202124C00C461022FF21684602F09CFA14B92046B8 +S315202124D004B070BD0F2C6946284694BF2646102687 +S315202124E03246F5F761FF0028F2D13544A41BEDE7EA +S315202124F02DE9F347044616460F46F8F795FEB4F81C +S315202125005E3005464FF47A7088465843F8F79AFE8E +S3152021251081468A46F8F788FE401B61EB08018145F2 +S315202125207AEB010326D394F85C3093B938468DF89B +S315202125300730F8F793FE0DF107012046F5F7E0FF66 +S31520212540D0B99DF807305B06E4D5012E08D00020AE +S3152021255012E0012BDED1F6F729FF0028DAD0F4E7A5 +S3152021256094F85C30002BF2D1204602B0BDE8F0472A +S3152021257000F005B845F2D02002B0BDE8F08737B586 +S315202125800022054611460192FFF7B2FF044650B9B3 +S315202125900222014600F059F92246014601ABA869DB +S315202125A0F6F70CFF0446204603B030BD37B5B0F808 +S315202125B054400546A4B90DF107018DF80740F5F7DA +S315202125C09FFF20B99DF80740E44304F001042846E3 +S315202125D0FFF7D5FF002818BF0124204603B030BDC0 +S315202125E00124FAE773B50E4600240422012105466B +S315202125F03078019400F029F92246014601AB7088F2 +S31520212600F6F7DCFE0446C8B93378EF2B19D104221C +S3152021261001232846B11800F0B7F8044670B995F879 +S315202126205C30012B06D1024601462846FFF760FF82 +S31520212630044603E04FF47A70F8F710FE204602B0E4 +S3152021264070BDEE2BFAD195F85C20012A0DD10146D9 +S315202126502846FFF74DFF04460028EFD10422012307 +S315202126602846B11800F051F8E2E74FF47A70F8F7CE +S31520212670F5FDF3E7F8B5D0F8E47005460C46D7B159 +S315202126808E18B44201D10020F8BDD5F8A0303A46A3 +S3152021269021462846F6F774FB0028F5D1D5F8A03037 +S315202126A0FA183B46934201D10134EAE71978FF29EA +S315202126B004D10133F6E745F2DA20E5E745F2D920C0 +S315202126C0E2E770B5D0F8E45014461E4675B12A4685 +S315202126D0F6F756FB48B932462946204602F074F9C8 +S315202126E045F2D823002818BF184670BD45F2DA20B6 +S315202126F0FBE7082802D10120F6F7DCBD102801D1FD +S315202127000220F9E745F20E2070472DE9F743047A96 +S3152021271006460F461546012C984633D1F6F7F6FD87 +S31520212720042823D00420F6F7C5FD0446F0B120461F +S3152021273003B0BDE8F083B8F1000F20D0102B0CBFD9 +S315202127404FF002094FF00409A9453A464FF00A01F4 +S31520212750B06988BF5FFA85F9CDE900384B46F6F78F +S31520212760F7FD044630B9A5EB09054F4496F82130EB +S31520212770002DE0D196F82100FFF7BBFFD7E74FF0D8 +S315202127800409E1E70124D2E72DE9F0479946037AA6 +S3152021279005468846012B164646D1B9F1000F10D0A1 +S315202127A090F82170102F18BF0827F6F7AFFD0428BF +S315202127B009D00420F6F77EFD044628B12046BDE83F +S315202127C0F0870827F1E7012426B995F82100FFF79C +S315202127D090FFF3E7B9F1000F1CD095F82130102B8B +S315202127E014BF4FF0040A4FF0020A0023B2451946BE +S315202127F088BF5FFA86FA1A468A450ED853460B2198 +S31520212800A869F6F78FFD04460028DED1A6EB0A0635 +S31520212810D044D9E74FF0040AE7E718F8010001313F +S3152021282098403B440243E7E70124C7E708B50B4616 +S315202128300146184602F0D8F8002008BD08B502F056 +S31520212840D3F8BDE80840F6F721BD02F00F0242EA8F +S315202128500111C9B241EA002070478369194490F8D1 +S315202128602530012B0BD190F8232021FA02F3501C7D +S3152021287083404FF0FF30904021EA0001194308465A +S31520212880704790F80033072B1CD8DFE803F0040C9F +S315202128900C1B0F121518D0F8E402114481428CBF6B +S315202128A0042000207047D0F8E802F6E7D0F8EC02A1 +S315202128B0F3E7D0F8F002F0E7D0F8F402EDE7D0F80C +S315202128C0F802EAE70420704730B58DB0002104468E +S315202128D0202204A8019102F095F8022301A920685B +S315202128E0039303238DF8153003AB0293A36A9847EC +S315202128F0054650BB102206A904F1540002F074F8B3 +S31520212900099B07991A0E84F87C3284F878221A0AB0 +S31520212910089BA4F87A221A0E84F8803284F87D2224 +S315202129201A0C84F87E221A0A0B0E84F87F2284F848 +S315202129308232069B1A0E1B0A42EA012284F8883229 +S31520212940C4F8842228460DB030BD40F20975F9E736 +S3152021295030B58DB004461C22002105A802F052F87C +S31520212960002301A92068019309230393A36C1B0447 +S31520212970049303238DF8153003AB0293A36A98475A +S315202129800546002840F0C78006A9102204F16400DC +S3152021299002F02AF8236F9A0F84F8903284F88C2239 +S315202129A0C3F3836284F88D221A0C84F88E221A0AA4 +S315202129B084F88F22E26E130DA4F89232C2F30343D8 +S315202129C084F89432130442BFB4F8963243F00103BB +S315202129D0A4F89632500442BFB4F8963243F002034B +S315202129E0A4F89632910440F6FC7142BFB4F896328F +S315202129F043F00403A4F89632D30401EA820242BFAB +S31520212A00B4F8963243F00803A4F89632A36EC3F3A2 +S31520212A10C261C3F3842002EB937284F89A12C3F322 +S31520212A20026184F89F02C3F3441084F89B12C3F3F6 +S31520212A30425184F8A00284F89C12C3F38241A4F85F +S31520212A40982284F89D12C3F3C23103F01F0384F820 +S31520212A509E1284F8A132636E002BBEBFB4F8960273 +S31520212A6040F01000A4F89602C3F3417084F8A20224 +S31520212A70C3F3826084F8A302C3F3835084F8A402AB +S31520212A80980242BFB4F8960240F02000A4F896029C +S31520212A90D80342BFB4F8960240F04000A4F896022B +S31520212AA0180442BFB4F8960240F08000A4F896029A +S31520212AB0580442BFB4F8960240F48070A4F89602D6 +S31520212AC0980442BFB4F8960240F40070A4F8960206 +S31520212AD0D80442BFB4F8960240F48060A4F8960246 +S31520212AE0C3F38120C3F3012384F8A50284F8A632F7 +S31520212AF0236DDB0508D40131022301328B4092B2AA +S31520212B005A43520AC4F8E4224FF40073C4F8E0323F +S31520212B1028460DB030BD40F20975F9E70B46826C87 +S31520212B20816A0068F8F7CAB807B590F80733012BF0 +S31520212B300ED0022B0ED180230A220221CDE900219B +S31520212B401522816A006800F070FB03B05DF804FB52 +S31520212B504023F1E70020F8E72DE9F04104460E460F +S31520212B60154640F2097741F66A18A36A314620684C +S31520212B709847A0F5CB53093B012B15D894F806335A +S31520212B80023B012B19D8404506D142F210724FF053 +S31520212B90B0512068FFF706FB2046FFF7C5FF002826 +S31520212BA0E3D040F2297006E0002818BF384615B137 +S31520212BB0013D0028D9D1BDE8F08140F20970F6E720 +S31520212BC037B590F8B93204460D46DB0703D490F881 +S31520212BD0B632062B0CD803232A4600212046009301 +S31520212BE0B923F7F77BF830B984F8B25203B030BD58 +S31520212BF04FF4E160FAE740F21E70F7E707B5026D60 +S31520212C000346D20505D590F8CE2212B190F8CD12E1 +S31520212C1061B993F8A022002093F89F12013201FB7B +S31520212C200222C3F8FC2203B05DF804FB9202AF23F3 +S31520212C300021C0F8FC2201220092F7F74FF840F23A +S31520212C401E73002818BF1846EDE7032337B50C4617 +S31520212C500A4600930021B7230546F7F73FF818B90E +S31520212C6085F8B14203B030BD40F21E70FAE738B57F +S31520212C7090F82D5004466B1E052B23D8DFE803F050 +S31520212C801203222212030268936A23F0060343F0D9 +S31520212C900403294620469362F6F71EFE48B140F2E8 +S31520212CA0127038BD0268936A23F0060343F00203AB +S31520212CB0EFE729462046FFF7C8FF0028EFD184F801 +S31520212CC00753EEE70020ECE790F8401010B50446B4 +S31520212CD021B10123002084F8403010BDF8F792F865 +S31520212CE00028F6D00120F8E7006800F0FEBA10B5DA +S31520212CF00446FFF7F9FF2046FFF7E6FF20B92046D5 +S31520212D00BDE81040F7F720B840F22E7010BDB0F87C +S31520212D10960200F4C060003818BF0120704773B5B1 +S31520212D2090F8AF4203230E46054604F0F80400939B +S31520212D30B3230C4300212246F6F7D0FF28B985F884 +S31520212D40AF4285F8006302B070BD40F21E70FAE7EB +S31520212D50032337B50C460A4600930021B2230546A4 +S31520212D60F6F7BCFF18B985F8AE4203B030BD40F264 +S31520212D701E70FAE7032337B50C460A460093002135 +S31520212D80AD230546F6F7AAFF18B985F8AA4203B05E +S31520212D9030BD40F21E70FAE7F7B590F8B6320446F8 +S31520212DA00D46032B53D90B78032790F8AF22002BFE +S31520212DB04B7802F087024FF0000114BF40260026EF +S31520212DC042EAC3020097B323D2B216433246F6F71C +S31520212DD085FF014600283DD184F8AF6220462B7914 +S31520212DE094F8AD62002BEB7806F0E002009714BF31 +S31520212DF0042600261643AA781E43B12346EAC20694 +S31520212E00F6B23246F6F76AFF0746E8B984F8AD628C +S31520212E106B798BB1EB79A97941EA031194F8AE321A +S31520212E20C9B28B420BD1297A94F8AA328B4203D08C +S31520212E302046FFF79FFF38B9384603B0F0BD20461C +S31520212E40FFF786FF0028EED040F21D77F4E74FF4F6 +S31520212E50E167F1E740F21E77EEE710B58CB000214D +S31520212E600446202204A8019101F0CCFD032301A9C7 +S31520212E702068039308238DF8153003AB0293A36AA8 +S31520212E80984720B9BDF81A3063650CB010BD40F2C1 +S31520212E900970FAE7036C07B501931322C36B0093DC +S31520212EA04023816A006800F0C0F903B05DF804FB75 +S31520212EB030B58DB000210446202204A8019101F0CD +S31520212EC0A1FD022301A92068039303238DF8153040 +S31520212ED003AB0293A36A9847054658BB102206A93D +S31520212EE004F1600001F080FD099B07991A0E84F8F0 +S31520212EF0903084F88C201A0A089BA4F88E201A0E6A +S31520212F0084F8943084F891201A0C84F892201A0A95 +S31520212F100B0E84F8932084F89530069B1A0EC3F362 +S31520212F200B2342EA0122A4F89C30C4F89820284693 +S31520212F300DB030BD40F20975F9E770B58CB000218E +S31520212F4004461C2205A8019101F05CFD092301A953 +S31520212F5020680393636D1B04049303238DF8153096 +S31520212F6003AB0293A36A98470546002840F0D280F6 +S31520212F70102206A904F1700001F036FD099BBDF847 +S31520212F8024209E0F1B0C52BA84F8A06084F8A1300D +S31520212F90089BA4F8A2201A0DC3F30340A4F8A42069 +S31520212FA01A0484F8A60042BFB4F8A82042F00102F0 +S31520212FB0A4F8A8205A0442BFB4F8A82042F001025E +S31520212FC0A4F8A8209A0442BFB4F8A82042F004020B +S31520212FD0A4F8A820DA0442BFB4F8A82042F00802B7 +S31520212FE0A4F8A820079A002E4AD0012E79D0510480 +S31520212FF042BFB4F8A83043F01003A4F8A830C2F396 +S31520213000C61302F07F0284F8B530069B84F8B620D9 +S31520213010C3F3826284F8B720C3F3835284F8B8209D +S315202130209A0242BFB4F8A82042F04002A4F8A82070 +S315202130301E0442BFB4F8A82042F08002A4F8A8209A +S31520213040580442BFB4F8A82042F48072A4F8A820DC +S31520213050990442BFB4F8A82042F40072A4F8A8200B +S31520213060DA04C3F3812348BFB4F8A82084F8B93001 +S3152021307044BF42F48062A4F8A82028460CB070BD33 +S3152021308040F6FC71092801EA8303C2F3C26184F860 +S31520213090B010C2F3026143EA927384F8B1104FEA69 +S315202130A01251C4F8AC3003F1010301F00E0184F86A +S315202130B0B210C2F3824184F8B310C2F3C23184F82C +S315202130C0B41001F1020103FA01F34FF40071C4F89F +S315202130D0C830C4F8CC108AD083405B0AC4F8C830E3 +S315202130E085E71B044FF4007103F47C13C4F8CC103C +S315202130F04FF6FE7143EA12438B42C4F8AC3003F1FA +S31520213100010388BFE16D4FEA832384BF41F010017B +S31520213110E165E3E740F20975AFE70B46426D816A27 +S315202131200068F7F7CBBDB0F8A80000F4C0600038DE +S3152021313018BF0120704790F84C3010B5044623B1B2 +S315202131400123002084F84C3010BD416CF7F75AFE3C +S315202131500028F5D00120F7E7006800F0C6B810B5A1 +S315202131600446FFF7F9FF2046FFF7E5FF20B9204661 +S31520213170BDE81040F7F720BC40F22E7010BD30B5C7 +S315202131808DB005460C46002103AB24220191184619 +S3152021319001F038FC01A902902846A04740F2097384 +S315202131A0002818BF18460DB030BD30B58DB00D465C +S315202131B000210446202204A8019101F023FC0B239F +S315202131C001A92046039301238DF8153003AB0293E1 +S315202131D0A847054630BB636A13F0706F1DD1D4F81A +S315202131E0C03041F2883043F00203C4F8C030F8F7EA +S315202131F035F8D4F8C0304FF47A7043F48073C4F88C +S31520213200C030F8F72BF8D4F8C03023F48073C4F8F3 +S31520213210C030636A13F0706F01D140F22A752846B7 +S315202132200DB030BD40F20975F9E72DE9F04FB1B067 +S315202132301746202204460DF1080A0DF1400B0DEB0D +S3152021324002000E4600211D46DDE93A8901F0DAFB0E +S3152021325014220021504601F0D5FB80220021584618 +S3152021326001F0D0FB07AA01234146204607978DF876 +S315202132702530CDF814B08DF80B30CDE900A24A4681 +S31520213280CDE90353FFF7F4F869462046B0470546B2 +S31520213290A0B9E36B5902F7D4A36E13F0802F17D070 +S315202132A04146204601234A46FFF7E2F80A212046D5 +S315202132B0FFF7CFF869462046B04728B140F2097575 +S315202132C0284631B0BDE8F08FE36B5A02F2D4A36EC3 +S315202132D0E36B1B0206D5236C23F470632364236CD2 +S315202132E02364EDE740F22975EAE7D0F8C03023F0D0 +S315202132F00203C0F8C030836C23F0080383640023C3 +S3152021330010B504461A461946FFF7B2F8A36C23F0E6 +S315202133108063A364236F23F001032367A36C23F027 +S315202133201003A36410BD82B00190019B0BB902B09A +S315202133307047019B013B0193F7E770B5F8230D24D4 +S315202133400C2508260246C0F80841C0F80851C0F8C5 +S315202133500861C0F808314FF47A700B68052158436B +S31520213360FFF7E1FF38230120C2F80831FFF7DBFF01 +S31520213370C2F80861FFF7D7FF0923C2F80851C2F81E +S315202133800841C2F80831C2F80841C2F80811C2F82A +S3152021339008010020C2F80811C2F80841C2F80831F4 +S315202133A070BD4FF4C87310B5044603601E20FBF789 +S315202133B02DFB606010BDB2F5956F10B51FD38B071D +S315202133C01DD1836ADC071CD502230360036A13F00F +S315202133D0050FFBD011448C1A036A13F0010F036ADF +S315202133E005D19B0710D5101E18BF012010BD1B0625 +S315202133F0F2D5032A836CEFD9043A2360EBE7042024 +S31520213400F4E742F60510F1E70120EFE7B2F5956FD3 +S3152021341010B51ED311F003031BD1846AA4071AD534 +S3152021342004240460046A14F0050FFBD0046AE4071F +S3152021343005D4006A80F00200C0F3400010BD046A62 +S315202134406406F3D5032A84BF51F8043B043A436426 +S31520213450ECE70420F2E742F60610EFE770B5856A1D +S31520213460049C6E0732D5A2F10805B5F5FC7F2FD82D +S3152021347003F0030502F00706354329D1D500FF3590 +S3152021348025F0FF05A035B4EBD50F21D30F291FD861 +S31520213490D2088260082241600260026A12F0050F7A +S315202134A0FBD0224623449C1A016AC90705D4006A07 +S315202134B080F00200C0F3400070BD016A0D06F3D5ED +S315202134C0032A816CF0D9043A2160ECE70120F3E745 +S315202134D00420F1E7F0B5846A6407DDE9057644D551 +S315202134E0A3F10804B4F5FC7F41D807F0030403F0C7 +S315202134F007052C433BD1DD00FF3525F0FF05A035FF +S31520213500B6EBD50F33D30F2931D8DD08856041603D +S3152021351011B923F003052A4410250560056A15F003 +S31520213520050FFBD0056AED0705D4006A80F002005D +S31520213530C0F34000F0BD056AED0608D5032B05D959 +S3152021354079B952F8044C013B043A24BA0464056A39 +S315202135502D06E7D5032E846C84BF043E47F8044B01 +S31520213560E0E752F8044B043BF0E70120E2E7042090 +S31520213570E0E72DE9F04106464FF47A70F7F762FE2F +S315202135806423A0FB037403FB0144F7F74DFE054694 +S315202135908846336813F4806302D11846BDE8F0814A +S315202135A0F7F742FE431B61EB0801BB4271EB040393 +S315202135B0EFD344F6EB60F1E708B501F091F900204D +S315202135C008BD0144002210B5884201D1104610BD04 +S315202135D010F8013B002BF7D003F001045B082244AD +S315202135E0F8E7F0B5064687B017460C4629B391F879 +S315202135F0CC21022A0ED101F19005102202A8019395 +S31520213600294601F0F1F9102204F1A001284601F002 +S31520213610EBF9019B3A462146304600F0F8FE94F814 +S31520213620CC310546022B05D1102202A904F19000A6 +S3152021363001F0DAF9284607B0F0BD0425FAE72DE98D +S31520213640F04106468AB0174698460C46002942D0B4 +S3152021365091F8CD3113BB94F8CC31022B0CD104F146 +S31520213660B005102201A8294601F0BEF9102204F145 +S31520213670C001284601F0B8F943463A46214630464C +S3152021368000F099FE94F8CC310546022B1FD1102249 +S3152021369001A904F1B00001F0A7F918E000230125C2 +S315202136A08DF8142001F5B8728DF804300F232946A0 +S315202136B0CDF80880CDE903352B46F9F7E5FB01A99D +S315202136C03046039500F06DFD05460028C3D02846D7 +S315202136D00AB0BDE8F0810425F9E72DE9F0418AB049 +S315202136E004460E4690461F46FFF7A9FFA0B901259D +S315202136F00E238DF8040006F5B072294620468DF852 +S3152021370014800297CDE903352B46F9F7BDFB01A994 +S315202137102046039500F045FD0AB0BDE8F081F7B5B6 +S31520213720054617460C4691B391F8C8317BB30E6CEA +S3152021373000F014FD94F8C811C6F380164FBB39B199 +S3152021374028463246FCF742FA21462846F9F78EFAD0 +S3152021375094F8CE311BB10121284600F0D6FE6A46C7 +S3152021376002212846FBF78CFF16B1009B5B080093AC +S3152021377001AA00212846FBF783FFDDE90023B3FBBD +S31520213780F2F20A2302FB03339B08013B12D203B038 +S31520213790F0BD49B194F8461028463246FCF716FA70 +S315202137A021462846F9F762FA94F8CE31002BD6D055 +S315202137B00021D1E700BFE8E7F0B58BB004460D46DE +S315202137C017460021242201A81E4601F01BF90323B6 +S315202137D001A920468DF8043001230295CDE9033332 +S315202137E0CDE9087600F0DDFC0BB0F0BD70B50646BC +S315202137F00D46F9F777FB044650B90123014605F119 +S3152021380080023046F9F740FB6B7C012B08BF2C74D4 +S31520213810204670BD2DE9F04306468BB00D4608465D +S315202138209046994600F02BFC074600222946304631 +S31520213830FFF775FF43463A4629463046FFF7FFFEF6 +S31520213840044600283CD1022301228DF80430092385 +S31520213850CDE9033295F8473033B195F890311BB134 +S3152021386095F89121CDE90323039A0121D5F8C03179 +S31520213870304605EB0212CDF8088007938032049B4F +S315202138808DF81470CDF81890F9F7FEFA012301A9C5 +S315202138903046039300F085FC044688B943463A46D0 +S315202138A029463046FFF79DFE044648B995F8CF3183 +S315202138B033B143463A4629463046FFF70EFF0446A2 +S315202138C0304600F054FC304601222946FFF727FFD7 +S315202138D020460BB0BDE8F0832DE9F04F00230D469D +S315202138E00B22012106462DED028B8DB08DF80C3051 +S315202138F08DF81C3095F84730CDE9052133B195F85F +S3152021390094311BB195F89521CDE90523DDE90543B0 +S3152021391005F1500705F1600A05EB04144FF0000864 +S31520213920B946002204F1800B2946304608EE103A8A +S31520213930FFF7F5FE59F8043B01937BB9019BD1454D +S315202139409844F7D14FF0000857F8049BB9F1000F9E +S315202139502CD15745C844F7D1002419E043460022EB +S3152021396029463046FFF76BFE044688B918EE103AF1 +S315202139705A4601213046CDF81080F9F785FA0123E0 +S3152021398003A93046059300F00CFC04460028D5D027 +S31520213990304600F0ECFB304601222946FFF7BFFED8 +S315202139A020460DB0BDEC028BBDE8F08F43460022A8 +S315202139B029463046FFF715FE04460028E8D195F81A +S315202139C0CF31002BC5D00246434629463046FFF744 +S315202139D084FE04460028BCD0DAE72DE9F0410646CC +S315202139E08AB00D460846904600F049FB074600223C +S315202139F029463046FFF793FE43463A462946304626 +S31520213A00FFF71DFE0446B0BB05230122CDF8088011 +S31520213A108DF804008DF81470CDE9033295F84730DE +S31520213A2033B195F88C311BB195F88D21CDE903233E +S31520213A30039A0121049B304605EB02128032F9F7C5 +S31520213A4023FA012301A93046039300F0AAFB044659 +S31520213A5088B943463A4629463046FFF7C2FD0446F1 +S31520213A6048B995F8CF3133B143463A4629463046AF +S31520213A70FFF733FE0446304600F079FB304601221B +S31520213A802946FFF74CFE20460AB0BDE8F0812DE9F4 +S31520213A90F04106468AB00D460846904600F0EFFAD8 +S31520213AA00746002229463046FFF739FE43463A4645 +S31520213AB029463046FFF7C3FD0446B0BB0823012221 +S31520213AC0CDF808808DF804008DF81470CDE90332E5 +S31520213AD095F8473033B195F89C311BB195F89D2146 +S31520213AE0CDE90323039A0121049B304605EB0212DB +S31520213AF08032F9F7C9F9012301A93046039300F051 +S31520213B0050FB044688B943463A4629463046FFF7B4 +S31520213B1068FD044648B995F8CF3133B143463A4634 +S31520213B2029463046FFF7D9FD0446304600F01FFBD3 +S31520213B30304601222946FFF7F2FD20460AB0BDE88C +S31520213B40F0812DE9F047CC6800F16007002CBBBF3E +S31520213B5024F0004401250134033CACBFE40805FAD6 +S31520213B6004F400F15005A8460435D8F8006066BB58 +S31520213B70BD42F8D10420BDE8F0874FF4807430E0AF +S31520213B8001EB450595F8250020280BD0D8280CD007 +S31520213B9001EB440191F82520202A08D0D82A08D0E3 +S31520213BA00020E8E721201060F2E7DC20FBE7212234 +S31520213BB052E0DC2250E001EB450501EB440195F86A +S31520213BC02500106091F8252046E0C8F800404C6871 +S31520213BD03F2CD2D991F8304025090F2DCDD0012463 +S31520213BE0AC400026C0F8C0416FF07F4C01F124097A +S31520213BF035463446B6464FF0010A19F8167067B194 +S31520213C000AFA07F767453CBF3546BC46774504D9AE +S31520213C10B7F5801F3CBF3446BE460136042EECD173 +S31520213C20ACEB0E06C0F8C4C1C0F8D0E1D6F1000C29 +S31520213C304CEB060C80F8C9C1D8F80000B0F1807F82 +S31520213C40B9D991F8580000289AD00D44214495F8E5 +S31520213C506000106091F860201A60A1E72DE9F041FB +S31520213C6006468846E9B3D418D1F8C41198F8C93143 +S31520213C70494264420C4001EA020764422BBBD8F830 +S31520213C80D0310420EBB1A7421DD2D8F8D03137EA62 +S31520213C9003021CD1E21B934219D83A4641463046AB +S31520213CA0FFF7F5FE78B9D8F8D0311F440020EAE78E +S31520213CB03A4641463046FFF790FE20B9D8F8C4311E +S31520213CC01F44A742F4D3BDE8F0810420F9E73A4600 +S31520213CD041463046FFF781FE0028F4D1D8F8C43179 +S31520213CE0E3E70420EFE72DE9F0438BB08046144625 +S31520213CF01F46129E084619B312B30EB300F0BFF920 +S31520213D00032301224FF6FF798DF8043000238DF805 +S31520213D101400CDE903324E45354601A9404628BF38 +S31520213D204D460297CDE9084500F03BFA28B925F002 +S31520213D300303761B2F441C44EDD10BB0BDE8F08341 +S31520213D400420FAE730B505468BB029B30023032496 +S31520213D50029201F1900200938DF8044001248DF8FE +S31520213D60143004232146CDF820D009932346CDE9CA +S31520213D700344F9F789F801A92846039400F011FA9A +S31520213D8040B9009B5A0709D413F0080F44F624633F +S31520213D9018BF18460BB030BD0420FBE744F625603A +S31520213DA0F8E770B506468AB01D460C46002939D05B +S31520213DB00323012102928DF804300D23CDE903310D +S31520213DC000238DF8143094F847302BB194F899318B +S31520213DD0039394F8983104930423039A01213046BE +S31520213DE0099304EB02120023CDF820D080322B70C8 +S31520213DF0049BF9F749F8012301A93046039300F0E2 +S31520213E00D0F950B994F8D0314BB1D4E97532009913 +S31520213E100B40934201D001232B700AB070BD202282 +S31520213E203023F4E70420F8E770B506460D4661B144 +S31520213E30F9F758F8044630B90146012305F18002E5 +S31520213E403046F9F721F8204670BD0424FBE7F0B56A +S31520213E5007468BB016460D46002953D00022D1E9BC +S31520213E6071438DF8032063435E43334600F0A3FA62 +S31520213E700446002843D1012305228DF804008DF81C +S31520213E801400CDE9032395F8473033B195F88C31C9 +S31520213E901BB195F88D21CDE90323039A0121049B9A +S31520213EA0384605EB021202968032F8F7EDFF012300 +S31520213EB001A93846039300F074F9024620BB334604 +S31520213EC02946384600F0A3FA0446C0B93246294687 +S31520213ED03846FFF737FF044688B995F8CD3173B9AF +S31520213EE00DF10303324629463846FFF75AFF70B9AA +S31520213EF09DF8032044F62263002A08BF1C4620464B +S31520213F000BB0F0BD0424FAE744F62564F7E704460E +S31520213F10F5E72DE9F0478AB0064615469846DDF89D +S31520213F2048A00C46002900F08F80002B00F08C80C1 +S31520213F30BAF1000F00F08880D1F8C4714FF0000942 +S31520213F4057434A468DF803903B4600F034FA022324 +S31520213F50092102978DF8043001238DF81490CDE99B +S31520213F60031394F84730CDE9068A33B194F890218A +S31520213F701AB194F89111CDE9031294F8CE217AB190 +S31520213F80D4F8C821B5FBF2F5EA0709D50A2203920E +S31520213F9033B194F8A4311BB194F8A521CDE903239B +S31520213FA0039A0121049B304604EB0212012580321B +S31520213FB0F8F76AFF01A93046039500F0F2F80028A8 +S31520213FC044D10E238DF80400CDE9033594F84730EA +S31520213FD02BB194F89D31039394F89C310493039A41 +S31520213FE00121049B304604EB02128032F8F74CFF64 +S31520213FF0012301A93046039300F0D3F8024640BBA2 +S315202140003B462146304600F002FA0546C0B93A46DB +S3152021401021463046FFF796FE054688B994F8CD31DC +S3152021402073B90DF103033A4621463046FFF7B9FE0F +S3152021403090B99DF8032044F62263002A08BF1D4625 +S3152021404028460AB0BDE8F0870425F9E744F623651A +S31520214050F6E744F62465F3E70546F1E7036843F0DE +S31520214060010303600368DB07FCD47047D0F8E030F6 +S31520214070DA07FBD5D0F8E0309B07FBD57047006CDB +S31520214080C0F380007047006C00F001007047006C7F +S31520214090C0F3C0007047006CC0F340007047006C2D +S315202140A0C0F3801070472DE9F347002681460C4640 +S315202140B00196F8F7D1FD074600284DD000294BD08F +S315202140C001F1500A5AF8043B07EB860820469B0A41 +S315202140D0C8F86030657BE37B6D01DB0205F47875DA +S315202140E003F4F0431D43A37B03F01F031D43FFF776 +S315202140F0CEFF08B145F48065636F6BB16A46022114 +S315202141004846FBF7BDFA0123009A01A8616FF8F70B +S315202141103DFE019B45EA0345C8F8705094F8473087 +S31520214120BBB194F89021530113F0E00F11D094F8EC +S315202141309131013A1B02520303F4706392B2134365 +S315202141400136C8F88030042EBCD1002002B0BDE84B +S31520214150F0874FF41063F3E70420F7E708B5F8F763 +S315202141607BFD18B1D0F8E0309B07FBD508BD08B5FB +S31520214170F8F772FD18B1BDE80840FFF76FBF08BDFB +S3152021418008B5F8F769FD58B1002300EB8301013307 +S31520214190D1F88020042B42F00042C1F88020F4D1AE +S315202141A008BD2DE9F34106460D46F8F755FD04468F +S315202141B018B9042002B0BDE8F0810029F9D00B7886 +S315202141C0032BF6D80F7CFFF751FF3046FFF7D8FF98 +S315202141D062696B6842F01E026261C4F8A0302978B8 +S315202141E002294CD1288BAB680329EA684FEA03437D +S315202141F002F1FF3203F470234FEA026243EAC773C6 +S3152021420002F0E06243EA020343EA0003C4F8A43041 +S315202142103AD02B785A1E012A00F2C4806B699E0758 +S31520214220C7D11C21AA69C4F8BC10D4F8BC1041F00E +S315202142300101C4F8BC10D4F8BC1011F00101FAD147 +S3152021424004F5C07504F5E2760F46002A40F38E80E8 +S315202142506069400640F186803F2A284671DC04F5B4 +S31520214260C270B042A0F1040C70D0002A40F397808E +S3152021427053F804EB043ACCF800E00430F1E70329A3 +S315202142800CBF288C0020AEE7EA69970791D11C2123 +S315202142902B6AC4F8B810D4F8B81041F00101C4F83B +S315202142A0B810D4F8B810CE07FBD4D4F8B01004F542 +S315202142B080766FF0030704F5A07C41F00101C4F854 +S315202142C0B010002BA5D03F2B314614D9606980062A +S315202142D008D51046614509D161694032403B41F0FC +S315202142E0200161616169090793D4EAE751F804EB5A +S315202142F040F804EBEEE7D4F8F010C9B2B3EBC10FC6 +S31520214300F0D823F003014FEA930E304611448A4216 +S3152021431012D107FB0E33002BE4D056F82E200B4466 +S3152021432001A801920A4610F801EB02F801EB93420B +S31520214330F9D10A460023D5E750F8048B42F8048B9D +S31520214340E5E703F1400C634524D1403A29B9D4F855 +S31520214350B01041F00101C4F8B010616941F040016B +S3152021436061610121606900077FF56FAF2046FFF764 +S315202143707DFE606910F008003FF41CAFD4F8E430CC +S3152021438041F6593041F65A32C3F303630E2B08BF47 +S3152021439010460FE753F804EB40F804EBD3E7CCF8AB +S315202143A000706AE7002BE1D1D4F8B03043F0010345 +S315202143B0C4F8B030DAE710B504468AB029B3002014 +S315202143C04FF0010C02938DF80400032091F8473019 +S315202143D08DF81420CDE9030C33B191F888311BB126 +S315202143E091F88921CDE90323039A2046049B01EBE9 +S315202143F0021201218032F8F747FD012301A9204627 +S315202144000393FFF7CEFE0AB010BD0420FBE72DE96A +S31520214410F04F07468FB016460C46002973D0002E42 +S3152021442006934FF003034FF00102B1F87C500DF1B2 +S315202144300C098DF8143014BF0823042302FA05F53C +S31520214440B1F87E800D9391F84730CDF830908DF8D4 +S315202144502460CDE9072233B191F884311BB191F83B +S315202144608521CDE9072307993846089B4FF0000B74 +S3152021447004EB01128032F8F707FDD4F870A05446D8 +S3152021448005A93846FFF78DFEC0B9EEB10DF1040C12 +S3152021449002A904234A4612F802EB013B0CF801EB50 +S315202144A012F801EC01F801EBF5D1DDE90123B8F190 +S315202144B0000F06D0134035EA030310D10FB0BDE813 +S315202144C0F08F13432B42F8E7039BB8F1000F15D049 +S315202144D035EA030314BF01230023002BEED0BAF1C2 +S315202144E0000FCDD054EA0B030AD04FF47A70002165 +S315202144F0FBF718FB013C6BF1000BC1E71D42E9E7F5 +S3152021450041F65A30DAE70420D8E710B5F8F7A4FBAC +S31520214510044630B1FFF7AAFD036819B143F40063BD +S31520214520236010BD23F40063FAE70023038070473C +S3152021453070B503880A4441F221068A4201D10380BB +S3152021454070BD11F8014B83EA042308245D001B0466 +S315202145504CBF85EA06032B46013CF7D1EDE70388BC +S315202145600B80704744F64E730380704770B50388DD +S315202145700A4448F205068A4201D1038070BD11F80A +S31520214580014B83EA042308245D001B044CBF85EAE2 +S3152021459006032B46013CF7D1EDE74FF0FF320023EE +S315202145A0C0E9002370474368B3F5887F10B50446D8 +S315202145B022D00ED8B3F5807F1BD040F20112934230 +S315202145C014D0092B0FD004202178BDE81040F8F70C +S315202145D043BEB3F5907F12D040F221129342F2D1FD +S315202145E0F1F7ACF9F0E7F0F72FFDEDE7F3F72AFB2A +S315202145F0EAE7F2F72FFAE7E7F2F716FDE4E7F1F714 +S3152021460095FBE1E710B50446D0E90101F0F77EFEDE +S315202146102178BDE81040F8F71FBE38B5044640681A +S31520214620F9F78CFA50B101206568F9F71FFBA068CC +S31520214630A8472178BDE83840F8F70EBE0420F8E7D0 +S31520214640436910B49C680023A4461A4619465DF88E +S31520214650044B6047002070474FF47D707047FBF76D +S3152021466037BE00230A461946F9F7E8BF012303FA84 +S3152021467001F112B9C0F888107047C0F8841070472C +S3152021468010B50124C3690F2902F1FF3204FA01F47E +S3152021469088BF103923EA0403C36194BF00F10C03B8 +S315202146A000F11003042A0BD8DFE802F0030B151DB5 +S315202146B02400480003211A68814022EA0101196059 +S315202146C010BD4C0003201A680121A04022EA0002D5 +S315202146D0A1401143F3E74C0003201A680221A04090 +S315202146E022EA0002F4E749000322186802FA01F1BE +S315202146F00143E4E7C3691C43C461E1E7013910B5ED +S3152021470003291DD8DFE801F002040A17007810BD1D +S315202147100088002AFBD040BA80B2F8E74378047893 +S3152021472081781B021AB943EA01402043EFE743EA85 +S3152021473004400843EBE70068002AE8D000BAE6E700 +S315202147400020E4E7013A30B5032A04D8DFE802F055 +S3152021475002040E1C017030BDC1F30722C9B213B960 +S3152021476001704270F7E702704170F4E7C1F3074404 +S31520214770C1F30722C9B21BB9017042708470EAE7DE +S31520214780047042708170E6E70D0EC1F30744C1F330 +S315202147900722C9B223B9017042708470C570DAE745 +S315202147A0057044708270C170D5E7022A0BD0032A86 +S315202147B010D0012A0DD1036C090423F47F0301F4BF +S315202147C07F01194304E0036C23F07F4343EA01610F +S315202147D001647047036C090223F47F4389B2F0E711 +S315202147E0F0B5046E456A8B6893B30F680FB94B6891 +S315202147F073B3C4F30B030833272B4FEAD30407D80B +S315202148008B68B3FBF4F604FB16333BB100231FE080 +S3152021481014F0030315D08B68A342F7D105F040731A +S31520214820B3F1807F02D0B3F1007F03D197B14B68DA +S31520214830002BEBD19AB104F00300C31E18BF01232C +S3152021484006E08E68B6FBF4FC04FB1C66002EE5D040 +S315202148501846F0BD436A43F080634362EAE70123A9 +S31520214860F6E71422002110B5044600F0CBF80023E8 +S315202148704FF4E132C4E90233C4E90023238210BD77 +S315202148800B02026903F44043134301F4407221F0E1 +S3152021489070410361836A21F4732123F4403321F487 +S315202148A07F61134321F00F0183628369194381615B +S315202148B070470A44914204D143695B02FCD500200A +S315202148C0704743691B02FCD511F8013BC361F1E70F +S315202148D0EFF3108372B60360704780F31088704718 +S315202148E0FAF7B2BEFAF7B0BE70470020704741B141 +S315202148F0C90001F0380141F00103C1660366C0E910 +S3152021490019337047002070477047012904D00229A6 +S3152021491004D029B9FAF792BDFAF75ABDFAF77CBD28 +S31520214920704701207047012070470A780378534049 +S3152021493003700A7853400B700278534003707047F6 +S31520214940092810B50C4609D1F0F7ACFB40B1F0F798 +S3152021495065F800F500602060002010BD0420FCE7EA +S3152021496042F2DD70F9E702284FF000000FBF102335 +S3152021497008601060042004BF0B6013607047022A70 +S315202149802DE9F0410F4607D1044645180026BB1BC9 +S31520214990A5F104089E4201D3BDE8F0812046414677 +S315202149A0FFF7C3FFE91E601C0436FFF7BEFFA91ED1 +S315202149B0A01CFFF7BAFF691EE01C45460434FFF709 +S315202149C0B4FFE4E70020704710B501390244904234 +S315202149D001D1002005E0037811F8014FA34201D02F +S315202149E0181B10BD0130F2E70A44914200F1FF3332 +S315202149F000D1704710B511F8014B03F8014F9142B0 +S31520214A00F9D110BD02440346934200D1704703F8E1 +S31520214A10011BF9E7000000000040114000801140F1 +S31520214A2000C011400000124000C0C2400000C34017 +S31520214A3000112233445566778899AABBCCDDEEFF37 +S31520214A409F04032400000000000000000000000055 +S31520214A509F076007200B04270000000000000000AC +S31520214A609F876087208B04A700000000000000009C +S31520214A705A0418080830FF24000000000000000016 +S31520214A805A07208BFFA7000000000000000000002D +S31520214A905A0418080830FF240000000000000000F6 +S31520214AA05A06180AFF260000000000000000000018 +S31520214AB05A07180BFF270000000000000000000005 +S31520214AC05A06188AFFA600000000000000000000F8 +S31520214AD05A07208BFFA700000000000000000000DD +S31520214AE00000000000C00C4000000D40000007100F +S31520214AF00608050807060604070405040404060219 +S31520214B000000020D02080206020502040203020326 +S31520214B100203020200000708060405040703060211 +S31520214B20070205020402060100000206020402030E +S31520214B300203020202020202020202010001000114 +S31520214B4000004001C0000000800180000000C0015B +S31520214B5040000000000200000000C00040010000CB +S31520214B608000800100004000C001000000000002FA +S31520214B7000000001C000400040018000400080016B +S31520214B8040004000C00100004000C000000140005C +S31520214B908000400140004000800140000000C0010B +S31520214BA04000C000C0008000000180008000480134 +S31520214BB040008000800100008000800000018000EC +S31520214BC0400040018000000080018000C00080005C +S31520214BD0C00000014000C00040010000C00080004C +S31520214BE0C000C00040000001C00000004001C000FC +S31520214BF0800080000001C00040000001000100006B +S31520214C0000014000C00000010000000100018000D9 +S31520214C1040004001C00000004001400080004001CA +S31520214C200000C000400140004000800180000000BB +S31520214C30800100008000800140000000C0010000AA +S31520214C404000C0010000000000020000000000001A +S31520214C50B90F21201D132120000000001D13212022 +S31520214C6000000000A91221202D1121200000000082 +S31520214C70D31021202B122120691021201314212029 +S31520214C804F0F2120312F202001302020C50821201F +S31520214C90D10821204D30202069092120090080B00A +S31520214CA0080CC0146655100000000000100000F00A +S31520214CB000000000400000F80000000008000D87D9 +S31520214CC0090080B00800A012040302010807060586 +S31520214CD004045082010000A2040088100100000073 +S31520214CE00010508279442020B1442020E9452020FB +S31520214CF04F1D21209C2822200E480F49006B8842D7 +S31520214D0002D10020C04370470C480D49C069884212 +S31520214D1007D10C48008CC00501D5032070470220FD +S31520214D20704709480949006B884201D10120704703 +S31520214D3000207047006121000020287340B72200FF +S31520214D40024A10680049C840C08F210005E0137827 +S31520214D50831D2120194920200D482020CD462020A1 +S31520214D60E71D2120871D2120A94620200002015050 +S31520214D700000AAEAEF1D2120554B2020414D20205D +S31520214D80A94D2020E94B2020414B2020F31D212015 +S31520214D9000000000EB1D2120554B2020AD4C20206A +S31520214DA0594D2020E94B2020A54A2020F31D2120E2 +S31520214DB000000000D9502020A55120207952202002 +S31520214DC07B1E2120B1502020C5502020151E2120B8 +S31520214DD07D592020C953202011552020E9552020F6 +S31520214DE0AD562020D5552020695320203D592020FD +S31520214DF0B31E2120B71E2120C91E2120D91E2120E4 +S31520214E00000000000000000000000000000000005B +S31520214E109D5C2020815A2020B95B2020E95C20201E +S31520214E20695D2020895C2020215A20202D5D20208B +S31520214E302D652020C56320209D622020D566202037 +S31520214E40A1672020B563202079672020000000005B +S31520214E503D6B2020E56B2020556C2020D56C202011 +S31520214E60096D2020016C2020000000000000000098 +S31520214E701578202045762020757420204572202003 +S31520214E800579202035762020F97120200000000088 +S31520214E90A086010040420F008096980000E1F5058A +S31520214EA0000000000A0000000C0000000D00000098 +S31520214EB00F000000140000001A0000001E00000050 +S31520214EC023000000280000002D00000034000000EF +S31520214ED0370000003C000000460000005000000082 +S31520214EE080F0FA0200E1F50500D4650C00E1F50514 +S31520214EF0000000040000000800000010000000004F +S31520214F0000000030000000600000000000C00C40BE +S31520214F1000000D4000000000B71DC1046E3B820930 +S31520214F20D926430DDC7604136B6BC517B24D861A31 +S31520214F300550471EB8ED08260FF0C922D6D68A2F4E +S31520214F4061CB4B2B649B0C35D386CD310AA08E3C6D +S31520214F50BDBD4F3870DB114CC7C6D0481EE09345E6 +S31520214F60A9FD5241ACAD155F1BB0D45BC2969756B5 +S31520214F70758B5652C836196A7F2BD86EA60D9B6320 +S31520214F8011105A6714401D79A35DDC7D7A7B9F70B1 +S31520214F90CD665E74E0B6239857ABE29C8E8DA191A7 +S31520214FA0399060953CC0278B8BDDE68F52FBA582FD +S31520214FB0E5E66486585B2BBEEF46EABA3660A9B78A +S31520214FC0817D68B3842D2FAD3330EEA9EA16ADA4A9 +S31520214FD05D0B6CA0906D32D42770F3D0FE56B0DDD8 +S31520214FE0494B71D94C1B36C7FB06F7C32220B4CEB9 +S31520214FF0953D75CA28803AF29F9DFBF646BBB8FBA4 +S31520215000F1A679FFF4F63EE143EBFFE59ACDBCE824 +S315202150102DD07DEC77708634C06D4730194B043DF9 +S31520215020AE56C539AB0682271C1B4323C53D002E10 +S315202150307220C12ACF9D8E1278804F16A1A60C1BD5 +S3152021504016BBCD1F13EB8A01A4F64B057DD008088C +S31520215050CACDC90C07AB9778B0B6567C6990157125 +S31520215060DE8DD475DBDD936B6CC0526FB5E6116294 +S3152021507002FBD066BF469F5E085B5E5AD17D1D57D7 +S315202150806660DC5363309B4DD42D5A490D0B194450 +S31520215090BA16D84097C6A5AC20DB64A8F9FD27A56A +S315202150A04EE0E6A14BB0A1BFFCAD60BB258B23B65C +S315202150B09296E2B22F2BAD8A98366C8E41102F8391 +S315202150C0F60DEE87F35DA9994440689D9D662B9048 +S315202150D02A7BEA94E71DB4E0500075E4892636E957 +S315202150E03E3BF7ED3B6BB0F38C7671F7555032FA98 +S315202150F0E24DF3FE5FF0BCC6E8ED7DC231CB3ECF5B +S3152021510086D6FFCB8386B8D5349B79D1EDBD3ADCC3 +S315202151105AA0FBD8EEE00C6959FDCD6D80DB8E605F +S3152021512037C64F643296087A858BC97E5CAD8A73E1 +S31520215130EBB04B77560D044FE110C54B38368646DA +S315202151408F2B47428A7B005C3D66C158E4408255BD +S31520215150535D43519E3B1D252926DC21F0009F2CA2 +S31520215160471D5E28424D1936F550D8322C769B3F65 +S315202151709B6B5A3B26D6150391CBD40748ED970A2C +S31520215180FFF0560EFAA011104DBDD014949B931901 +S315202151902386521D0E562FF1B94BEEF5606DADF8D3 +S315202151A0D7706CFCD2202BE2653DEAE6BC1BA9EB2D +S315202151B00B0668EFB6BB27D701A6E6D3D880A5DE96 +S315202151C06F9D64DA6ACD23C4DDD0E2C004F6A1CD79 +S315202151D0B3EB60C97E8D3EBDC990FFB910B6BCB474 +S315202151E0A7AB7DB0A2FB3AAE15E6FBAACCC0B8A7E9 +S315202151F07BDD79A3C660369B717DF79FA85BB49230 +S315202152001F4675961A163288AD0BF38C742DB081F4 +S31520215210C330718599908A5D2E8D4B59F7AB0854F1 +S3152021522040B6C95045E68E4EF2FB4F4A2BDD0C4740 +S315202152309CC0CD43217D827B9660437F4F46007261 +S31520215240F85BC176FD0B86684A16476C933004615C +S31520215250242DC565E94B9B115E565A158770191861 +S31520215260306DD81C353D9F0282205E065B061D0BC4 +S31520215270EC1BDC0F51A69337E6BB52333F9D113EE3 +S315202152808880D03A8DD097243ACD5620E3EB152D20 +S3152021529054F6D4297926A9C5CE3B68C1171D2BCC16 +S315202152A0A000EAC8A550ADD6124D6CD2CB6B2FDF0C +S315202152B07C76EEDBC1CBA1E376D660E7AFF023EA9D +S315202152C018EDE2EE1DBDA5F0AAA064F4738627F998 +S315202152D0C49BE6FD09FDB889BEE0798D67C63A8073 +S315202152E0D0DBFB84D58BBC9A62967D9EBBB03E9348 +S315202152F00CADFF97B110B0AF060D71ABDF2B32A6E7 +S315202153006836F3A26D66B4BCDA7B75B8035D36B513 +S31520215310B440F7B1A74521200000000071D32020F9 +S315202153200000000019D92020A9D52020DDD3202056 +S31520215330A5D42020D9D6202000000000000000007E +S3152021534000000000FDD720200000000091D320205E +S31520215350A5D42020F9D62020000000001B4621209C +S315202153600000000031D3202000000000BDD32020E2 +S3152021537000000000000000000000000061D720206E +S31520215380000000008DD9202000000000E9D920202E +S31520215390A9D520200546212000000000000000007C +S315202153A00000000055D820209DD620200000000096 +S315202153B00000000041DA2020B5D620200000000080 +S315202153C000C00740000008400040084000800840F7 +S315202153D000C00840000009400040094000800940E3 +S315202153E000C0094000000A400040C2400080C2405F +S315202153F000000000A5DD202015DD2020F5DC202061 +S31520215400B9DC202000000000E5DD2020F5DF20206A +S3152021541071DF202009DE2020B1DE202019DE202088 +S31520215420D9DE2020414621205546212059462120BA +S31520215430000000000000000000C0124000001340C0 +S31520215440004013400080134000C013400000144048 +S3152021545000C0C5400000C6400040C6400080C6406E +S3152021546000C0C6400000C7400000CA40008000425C +S3152021547000C0004200000000004011400080114081 +S3152021548000C011400000124000C0C2400000C340AD +S315202154900000000000C007400000084000400840EE +S315202154A00080084000C00840000009400040094013 +S315202154B00080094000C0094000000A400040C24047 +S315202154C00080C2400084D7170024F40000389C1C99 +S315202154D000C2EB0B00A4781F40DCB31109000000A9 +S315202154E0C14D2020010100008D7C202000010000DB +S315202154F0B96A2020100100005970202020010000C7 +S31520215500795F202021010000DD59202000000000A4 +S31520215510000000006F0100006509000070013701BD +S315202155206D0138016E012E0271012F0172013001A8 +S3152021553073013101740132016C0133016B01340194 +S315202155406A013501690136016708000066090000F4 +S315202155506D01380100000000680800006C0133014C +S315202155606B0134016A013501690136010000000011 +S315202155700000000000000000000000000C000000D8 +S315202155800C0000000C000000080000005103000060 +S3152021559000000000520337004F03380050032E012C +S315202155A053032F0054033000550331005603320094 +S315202155B04E0333004D0334004C0335004B03360094 +S315202155C00000000000000000000000000000000094 +S315202155D00000000000000000000000000000000084 +S315202155E00000000000000000000000000000000074 +S315202155F0000000000300000003000000030000005B +S3152021560007000000350400000000000034043D009E +S3152021561033040000360400003704390038043A00E8 +S3152021562039043B003A043C003B0400003C040000C2 +S315202156303D0400003E04000032040000000000006A +S315202156403304000000000000310400003004000073 +S315202156502F0400002E0400002D0400002C0400003D +S315202156602B0400002A040000290400000C0000005D +S315202156700C0000000C00000008000000630600005A +S315202156800000000064063D0100000000000000002B +S315202156906506390166063A0167063B0168063C0123 +S315202156A000000000000000000000000000000000B3 +S315202156B000000000000000000000000000000000A3 +S315202156C00000000000000000000000000000000093 +S315202156D00000000000000000000000000000000083 +S315202156E0000000000C0000000C0000000C0000004F +S315202156F0080000000F04C00401240000000000005F +S31520215700000000000F04C004012400000000000056 +S315202157100000000000401340008013400080134009 +S3152021572000C0134001000000010000000B49212088 +S31520215730F8532120F0532120504D21201000000024 +S315202157400000000000000000085421200000000075 +S315202157501854212000000000000000000000000055 +S315202157600000000000000000000000004000800032 +S315202157700001200080FF8500860040008000000176 +S31520215780200080FF880087008A75760000000000AF +S3152021579000000000000000000000040804080001A9 +S315202157A021062121210000020402040001100321E7 +S315202157B01021000002040202000110032110210001 +S315202157C00001030102000110032110210000010222 +S315202157D00101000110032110210000010201010015 +S315202157E0011003211021000000000000000000000C +S315202157F00000004D4943524F4E2020202020205387 +S3152021580050414E53494F4E2020202053414D535530 +S315202158104E47202020202057494E424F4E442020BB +S3152021582020202048594E495820202020202020540D +S315202158304F534849424120202020204D4143524F59 +S315202158404E495820202020000000000000000000A2 +S3152021585000000000555603590C0F5A5A0F0C5903B4 +S31520215860565500653033663C696A3F3F6A693C6616 +S31520215870333065663330653F6A693C3C696A3F65EA +S31520215880303366035655005A0F0C59590C0F5A00BE +S31520215890555603693C3F6A30656633336665306AFF +S315202158A03F3C690C595A0F55000356560300550F94 +S315202158B05A590C0F5A590C56030055550003560CAC +S315202158C0595A0F6A3F3C69336665303065663369BC +S315202158D03C3F6A6A3F3C6933666530306566336989 +S315202158E03C3F6A0F5A590C56030055550003560C56 +S315202158F0595A0F0C595A0F55000356560300550F66 +S315202159005A590C693C3F6A30656633336665306A7D +S315202159103F3C69035655005A0F0C59590C0F5A0012 +S31520215920555603663330653F6A693C3C696A3F6553 +S31520215930303366653033663C696A3F3F6A693C6627 +S3152021594033306500555603590C0F5A5A0F0C5903FB +S315202159505655000201030202040205030007FF0F28 +S31520215960FF02050300140F0918020503000F180969 +S315202159700D02050300140F09180205030018090B4F +S3152021598011020503001018090D0205030010180B3A +S315202159900902050300140F0A18020503000910182D +S315202159A00A020503001018090D0205030010180923 +S315202159B00D020503000F181A0D0205030010180900 +S315202159C00D020503001018090D02050300101813F6 +S315202159D0140205030010181A1C0205030010181AB8 +S315202159E01C020503001018131402050300101813B6 +S315202159F01402050300101813140205030011090CC3 +S31520215A000F0205030011090C0F02050300101809C6 +S31520215A100D020503001018090D02050300140F0DB0 +S31520215A2018020503001018090D0205030010180994 +S31520215A300D020503001018090D020503001018098F +S31520215A400D020503001018090D020503001018097F +S31520215A500D020503001018090D020503001018096F +S31520215A600D020503001018090D020503001018095F +S31520215A700D02050300140F0D1802050300140F0D46 +S31520215A8018020503001018090D0205030010180934 +S31520215A900D020503001018090D020503001018092F +S31520215AA00D02050300140F0D1802050300140F0D16 +S31520215AB018020503001318090D02050300131809FE +S31520215AC00D020503001318090D02050300131809F9 +S31520215AD00D02050300140F131802050300140F13DA +S31520215AE018020503001018090D02050300101809D4 +S31520215AF00D02050300171A180B02050300171A18A1 +S31520215B000BFFFFFFFFFFFFFFFF02050300171A18F8 +S31520215B100B02050300171A180B02050300171A1882 +S31520215B200BFFFFFFFFFFFFFFFF020503000C0A18F3 +S31520215B3007020503000C0A18070205030018101A8C +S31520215B400D0205030018101A0D02050300140F1A61 +S31520215B5018020503001A0F130D020503001A131844 +S31520215B600D020503001A13180D020503001A131836 +S31520215B700D02050300140F1A1802050300090B0F45 +S31520215B801C02050300090C111C02050300090C1136 +S31520215B901C02050300090A111C02050300090A112A +S31520215BA01C020503000C0F0A1C020503000C0F0A18 +S31520215BB01C020503000C0F0A1C020503000C0F1200 +S31520215BC01C020503000C091218020503000D0112FF +S31520215BD01A8A333333333333333333333333330142 +S31520215BE0020408102040808A68696A6B6C6D8A5687 +S31520215BF05758595A5B5C5D5E5F606105060605054F +S31520215C00070706100F0C080505040312062E001C93 +S31520215C10111C1001FF0808080808080808080802AE +S30920215C200202020033 +S30D20215C24BCCBFE7F010000002C +S31520215C2CCD38202000000000180022200000222040 +S31520215C3CB5E02020010000003000222001010000C7 +S31520215C4C0000000002000000980A2220000000001B +S31520215C5C0100000038002220030000002000222011 +S31520215C6C01000000370B2220040000007C0022209A +S31520215C7C01000000040000003A0000002A00000068 +S31520215C8C2E00000022000000370B22203B0B222065 +S31520215C9C750B22209F0B2220CD0B2220680022203F +S31520215CAC540022200904000070110000000000007D +S31520215CBC0000000000000000000000000000000091 +S31520215CCC0000000000000000000000000000000081 +S31520215CDC0000000000000000000000000000000071 +S31520215CEC0000000000000000000000000000000061 +S31520215CFC0000000000000000000000000000000051 +S31520215D0C0000000000000000000000000000000040 +S31520215D1C0000000000000000000000000000000030 +S31520215D2C0000000000000000000000000000000020 +S31520215D3C0000000000000000000000000000000010 +S31520215D4C0000000000000000000000000000000000 +S31520215D5C00000000000000000000000000000000F0 +S31520215D6C00000000000000000000000000000000E0 +S31520215D7C00000000000000000000000000000000D0 +S31520215D8C00000000000000000000000000000000C0 +S31520215D9C00000000000000000000000000000000B0 +S31520215DAC00000000000000000000000000000000A0 +S31520215DBC0000000000000000000000000000000090 +S31520215DCC0000000000000000000000000000000080 +S31520215DDC0000000000000000000000000000000070 +S31520215DEC0000000000000000000000000000000060 +S31520215DFC0000000000000000000000000000000050 +S31520215E0C000000000000000000000000000000003F +S31520215E1C000000000000000000000000000000002F +S31520215E2C000000000000000000000000000000001F +S31520215E3C000000000000000000000000000000000F +S31520215E4C00000000000000000000000000000000FF +S31520215E5C00000000000000000000000000000000EF +S31520215E6C00000000000000000000000000000000DF +S31520215E7C00000000000000000000000000000000CF +S31520215E8C00000000000000000000000000000000BF +S31520215E9C00000000000000000000000000000000AF +S31520215EAC000000000000000000000000000000009F +S31520215EBC000000000000000000000000000000008F +S31520215ECC000000000000000000000000000000007F +S31520215EDC000000000000000000000000000000006F +S31520215EEC000000000000000000000000000000005F +S31520215EFC000000000000000000000000000000004F +S31520215F0C000000000000000000000000000000003E +S31520215F1C000000000000000000000000000000002E +S31520215F2C000000000000000000000000000000001E +S31520215F3C000000000000000000000000000000000E +S31520215F4C00000000000000000000000000000000FE +S31520215F5C00000000000000000000000000000000EE +S31520215F6C00000000000000000000000000000000DE +S31520215F7C00000000000000000000000000000000CE +S31520215F8C00000000000000000000000000000000BE +S31520215F9C00000000000000000000000000000000AE +S31520215FAC000000000000000000000000000000009E +S31520215FBC000000000000000000000000000000008E +S31520215FCC000000000000000000000000000000007E +S31520215FDC000000000000000000000000000000006E +S31520215FEC000000000000000000000000000000005E +S31520215FFC000000000000000000000000000000004E +S3152021600C000000000000000000000000000000003D +S3152021601C000000000000000000000000000000002D +S3152021602C000000000000000000000000000000001D +S3152021603C000000000000000000000000000000000D +S3152021604C00000000000000000000000000000000FD +S3152021605C00000000000000000000000000000000ED +S3152021606C00000000000000000000000000000000DD +S3152021607C00000000000000000000000000000000CD +S3152021608C00000000000000000000000000000000BD +S3152021609C00000000000000000000000000000000AD +S315202160AC000000000000000000000000000000009D +S315202160BC000000000000000000000000000000008D +S315202160CC000000000100000000000000000000007C +S315202160DC000000000000000000000000000000006D +S315202160EC000000000000000000000000000000005D +S315202160FC000000000000000000000000000000004D +S3152021610C000000000000000000000000000000003C +S3152021611C000000000000000000000000000000002C +S3152021612C000000000000000000000000000000001C +S3152021613C000000000000000000000000000000000C +S3152021614C00000000000000000000000000000000FC +S3152021615C00000000000000000000000000000000EC +S3152021616C00000000000000000000000000000000DC +S3152021617C00000000000000000000000000000000CC +S3152021618C00000000000000000000000000000000BC +S3152021619C00000000000000000000000000000000AC +S315202161AC000000000000000000000000000000009C +S315202161BC000000000000000000000000000000008C +S315202161CC000000000000000000000000000000007C +S315202161DC000000000000000000000000000000006C +S315202161EC000000000000000000000000000000005C +S315202161FC000000000000000000000000000000004C +S3152021620C000000000000000000000000000000003B +S3152021621C000000000000000000000000000000002B +S3152021622C000000000000000000000000000000001B +S3152021623C000000000000000000000000000000000B +S3152021624C00000000000000000000000000000000FB +S3152021625C00000000000000000000000000000000EB +S3152021626C00000000000000000000000000000000DB +S3152021627C00000000000000000000000000000000CB +S3152021628C00000000000000000000000000000000BB +S3152021629C00000000000000000000000000000000AB +S315202162AC000000000000000000000000000000009B +S315202162BC000000000000000000000000000000008B +S315202162CC000000000000000000000000000000007B +S315202162DC000000000000000000000000000000006B +S315202162EC000000000000000000000000000000005B +S315202162FC000000000000000000000000000000004B +S3152021630C000000000000000000000000000000003A +S3152021631C000000000000000000000000000000002A +S3152021632C000000000000000000000000000000001A +S3152021633C000000000000000000000000000000000A +S3152021634C00000000000000000000000000000000FA +S3152021635C00000000000000000000000000000000EA +S3152021636C00000000000000000000000000000000DA +S3152021637C00000000000000000000000000000000CA +S3152021638C00000000000000000000000000000000BA +S3152021639C00000000000000000000000000000000AA +S315202163AC000000000000000000000000000000009A +S315202163BC000000000000000000000000000000008A +S315202163CC000000000000000000000000000000007A +S315202163DC000000000000000000000000000000006A +S315202163EC000000000000000000000000000000005A +S315202163FC000000000000000000000000000000004A +S3152021640C0000000000000000000000000000000039 +S3152021641C0000000000000000000000000000000029 +S3152021642C0000000000000000000000000000000019 +S3152021643C0000000000000000000000000000000009 +S3152021644C00000000000000000000000000000000F9 +S3152021645C00000000000000000000000000000000E9 +S3152021646C00000000000000000000000000000000D9 +S3152021647C00000000000000000000000000000000C9 +S3152021648C00000000000000000000000000000000B9 +S3152021649C00000000000000000000000000000000A9 +S315202164AC0000000000000000000000000000000099 +S315202164BC0000000000000000000000000000000089 +S315202164CC0000000000000000000000000000000079 +S315202164DC00000000496B2020000000000000000075 +S315202164EC0000000000000000000000000000000059 +S315202164FC0000000000000000000000000000000049 +S3152021650C0000000000000000000000000000080030 +S3152021651C0000100000002000000040000000800038 +S3152021652C0000000100000002000000040000000809 +S3152021653C0000001000000020000000400080000018 +S3152021654C00000100000002000000040000010000F0 +S3152021655C0002000000040000200000004000000082 +S3152021656C80000000001000000020000000800000A8 +S3152021657C00000100000002000000040000000000C1 +S3152021658C35D2202081D220201453212048AF2220FD +S3152021659CB44D21200C0A222094092220E44C2120BE +S315202165AC6009222024572120000000000000000031 +S315202165BC00A4781F0101000000000000000001004A +S315202165CC00080000704E2120100100000000000060 +S315202165DC0000010000010000504E21202001000066 +S315202165EC000000000000000000020000104E2120B7 +S315202165FC2101000000000000000000000002000024 +S3152021660CD04D2120000100000000000000000100D7 +S3152021661C00080000304E2120000000000000000060 +S3152021662C0000000000000000000000000000000017 +S3152021663C000000001100000000000000F04D212078 +S3152021664C00000020000000001100000000000000C6 +S3152021665CF04D212000002020000000001100000018 +S3152021666C00000000F04D2120000000300000000029 +S3152021667C0000000009000000944D21200000000894 +S3152021668C000000000000000009000000744D2120AC +S3152021669C000000600000000000000000090000003E +S315202166AC944D212000000000000000000000000075 +S315202166BC00000000000000008103400000000203BE +S315202166CC400000008302400000000402400000002C +S315202166DC09022900010100C032090400000203002D +S315202166EC0003092100010001224C000705810340EA +S315202166FC00010705020340000112010002000000DF +S3152021670C40A21573000200010200010600FF0901B7 +S3152021671CA101850119012901150026FF007528954E +S3152021672CCB9102850219012901150026FF00752816 +S3152021673C95CB9102850319012901150026FF007598 +S3152021674C2895CB8102850419012901150026FF00E4 +S3152021675C752895CB8102C0040309043A03460052BD +S3152021676C00450045005300430041004C00450020C4 +S3152021677C00530045004D00490043004F004E004474 +S3152021678C005500430054004F005200200049004E72 +S3152021679C0043002E002A03550053004200200043BB +S315202167AC004F004D0050004F005300490054004526 +S315202167BC0020004400450056004900430045002E88 +S315202167CC034D004300550020004800490044002079 +S315202167DC00470045004E0045005200490043002049 +S315202167EC004400450056004900430045002203423F +S315202167FC0041004400200053005400520049004E11 +S3152021680C00470000000000000000000000000000EE +S7052020240195 diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/gen_hab_certs/SRK_hash.bin b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/gen_hab_certs/SRK_hash.bin new file mode 100644 index 0000000000000000000000000000000000000000..4a819e3339505e02194f221020cd220b50ba6617 GIT binary patch literal 1088 zcmV-G1i$;&1VBLH0S_Sn004ji000BHJ<*D;0Qm&MHxMjC+KSWvu4nfyI8v{JMpo^4 z3?XL*pGE(L=dSX_E^xp!_4Ty4G#h2<2@P($p=V+7Zir*44rTq#X_TLbv`U!K2uNcv z2lHp~l!2wZLSt+<%GVh=3mDgF#qa^mcb>^|-cJE|UL2fI$^m`^omrcA+8uijbAq0G zekx)cks5db*0zrBO-$6pVk77FqHkL9kKd=|b-r)iK*d^g6t4&%O;8JFqBX&WVusX@ z<)ax}5{v;%U}*V3G0Vn)GipSBwf!}>Ed{f*w6L%UsjaL!`Fq4Gs-p;qJM|#fVoc4x zC5IEC%ldYK#R1@%ugrZRJ=O;S00H3v4ShA zbRHnmntgQxr?y?#57**-$gzm9KXUb&D%kxmU|3|Qja(Wo)42Zh*)0Q~V1B$wuU*Mf zLnm$$g$o-OB)zL_jFf*?yqsNpzhtE{FO)Hu9t9V1olrV{oCRu&BX^&$nEjI(!QING zn@P1Dq=H{qnYU4A3$)HQ3Vz0lOAYQVf5flL{g(j%0pS4;ApigXfB^si1KYeeYAh{# z)B7q~=%o3WA9sgfDYCKSLE$tB$1JIMf&ZaOp3b4lCz`16KoR7~lKwys0J%`|zT@k| zZHmssnomfdF}41B#rZk!#ESZ3XZ{aLt$iVAmMXhf(9sh`rD-{=*Xm7?$6y-$ZMVNW z1bqQF39>NmWS>rnLfc^C>yUNIw3mitYXlyfU5MiTDgXf^-}ZGKwWKDi zQH>2_q>(qp_o-%pb->r|X>Qj13cxBkn_)bGrj88;B+Rz*K<4~vqZph^zA3n&`Xf8p znRz?&bEUn>(o@3$cIyh7^PVix+e}wCg!7M!Uie|88{~gp70)0MX@3W{*gi0K<_C2l G0RREs`w5f) literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..c83f375b --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIdi/0V8NCoksCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECL8tgUuPznT5BIIEyHhGq4g/Npl8 +ZgZxxq1VjEjLNNHS/Ou0bv2/suXnYPyDTNkCYl/bnCbXIVjFfMwdP1WIDE2tOTW3 +0OGQubJUVj+Be5o4RxKVhGnbiW4ZZVtCmhnA4EFU4oaRYndq8NRPRH5l8SMiPgG8 +6CPvnc9IV1TM6BKPPgRgvW99zQkox3ulSIZjdy7dEMHJav0WNzo8R8e+614WxoiA +/gXCXa6FUlIJNGJujYS+MPcggbMS0QTTFhNeofcYzNNAsmBwjRyq96c11Dx9mpct +PinQN3Et1XP84A30McZOFrKKC/kinvGzpoouGAMNGXbLrwHMpG1Sb3H+OO/ZQEDr +n5rFDCFGVwmQ9dhPvlpy0IzfA6cLlpu0UU1pgn81YChhOtnAVi4VjUCpdUxdngQU ++1Q1EfeZeERI1iofjwR7X+uSYaB9FN5wQiwNfgu03Oobl2ghSJtDtuTkLlG/sRtx +cU0qTvLkWttEBxc+5FDrARBAfObRgq4sYr/fjwFaqHz+faJ8FJYzoj2nkY5OCBKY +DjuNT42Qet3qhbkUsu2YE61TS8vVlD8ycxKSg+egg9dNMlNoMGTrSVtIn29EeR2j +9sjhC5TjPJTHsG5guYLRzNgnElOPhmsMAD/zr3psRMxafmFgR/RTSy/C45sMEEjN +6YfZhXKqcO3FHa7vJqSo1fGaTvBq92jwYgl/HMyzdDPIiRte5OBh35O/v03yE3Ms +TFVEz2eDZFgG4nNMRwaR5V7V50jgypBFZzpOHihukPQ9JcarCd0T6+TsAmbmcYJk +LzWpKYpd36FBKVJUTnl69bF87+L6CA41EVqfavxyuC3wFxg0Glus8zPHRJL5tUdw +b2JUWzMrkP6mW9uoTX8MTrlTW4zrIn+Qht9x7IhV+s4nIAp4irDjBDu+fI0OenAa +B5HfKQ4WlcZRxw1EITSkD80XIbshF/WD6NRSFlIHUQdvqBmHNAVti0x4TQwRr96X +zQlXsQ+4qW6502E3wtc9Z29z+h4ed5Ia9IsmCKTuJ41YtSZnXRwGYnI/TjN+LG4s +Gpk2H5Qeknk5MDCv0rKSv5kRNqqOeIjZa0GCKZ4a3OHnRdGy5zLAneyuflI3OHN5 +RaH6Zstynku+dWcOUJY4V0bonccOYok11HyAWTUliznPV2wMWmpLvapRFwn7JEvc +XBZUWSXaSC7zQvT+2/S49+5J8SofX4gw1h+NbnogfOl+3ejZgj/VCHgEirfte3yI +oNOh6N5zLc07UkOG8qC9um0j4JEGvRrZ93rEcgWFsg9rI6HumxHpjYRaaDYGlILz +dgxTR427b9IaWEdMW7bSvcb87yOrMkW4yqxmKv9Q4p7ucRxxBeB0hqA4VoVA9pxt ++lPVnCFPBI6d7dhVM9VsinePfpeY2Xsk8zkSvzx89S+2Taw2tONYodKnv893TnrF +BYR8sHK3eDsZm5h+LJzjAq7WT4eHjjta2LDoJXWSidscAQtU+GsWK+p9IGpNqGbK +FKRNqH1mYogoJX3qGxphVWyL9ZL5HmO9wM3vf+NvR35LDBZDqCHLps9OOUIPQ7PX +b6IlB0eroQMruBnesvTGsYNGdDQ/PpMpwguKZ34cA2b9AU8FoVkz21uApO5P5fEl +z8ol2l8j0h2EPJYnHaXXAQ== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..b00a4e58 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIvXzlrAaQI2gCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECI+FLYDFYwyOBIIEyGURKoTjjTBI +IQGK0cSJiq2zH7+KgxBZyLQtbYOICQQvaebsZ3E83gOrnvIaA5APTiBEfL3vIWTU +LyfLbhSjoOoOLdybYgbvId7xWL6Ym8joJaOL1AX3W9Yhne3lNW4ZRbjbrjDdZ20b +fD0n5RfYWe2sJfpHxoYUZjxb/8qLer87EDe7XF1H/XuPnFZKWgGqARMHwD5RYaep +CmBR+MY4l2vtpTIFxJyPOHkgn3M7t8l4B/0g5HGaLhvTB5grkFRRG7Di3NJS3wpm +WmqGt/pjTPMuOxZtPm59ZMiX8iy8E5eaBjglwzpGT8+b2BfS8npvHtTsuysZqDQf +fBG1J6Bkfd/+2b6WTwBbpayxyKBgB+/9s1Z3k+2sYqFnFbK17jM6o/p1mcHFsVHh +ThlSjX+4j1nHIV/0vaD/a4TvGuOcnVZi1L7FtM2yrFBLvrWaIlSAmM2+VMniMvgG +IdzwDO8xpCgn2wBIpUle0t7XMZlXKai51JMiQI8hoDxLbMvnAzE4xmJ38hzV4qLQ +8gQmWOuJPEmcwUz5Ksv1jh9kW46Yb2hb2/TtkX+n1OsLsYtfsUtgUAbHkD9hTbSs +mozsUsgQoKQU9F11RqO1rX/R5YVagJsatRJxn773djsgAapD4HTGkk0a90eF0F2p +GqMyfMwcmQQGN1M5LrTOlIaGHadzQAbat3OCb/Pp/BB7R+BXTAKM2h++J4mqYqWK +dp/hhN/7VY4n8Y85d0cN77FTBWF4+x41zsUMqckYp48XApm45kO4rMgMXK4bKm7K +KZHp+/bC/9WB3HqD1UwaQbUCmJsrx8vr/iAD4Rx4cXni548N4ZBgvXUx07VGzLvt +42Qrs1kGfbSh4riwjQB+3EAy6csb2CVw+ubJUNuV/FuZhD2v4I4pX2KnKMBj3OVi +i36Szq91fgQv6I9o0V5yAKZ0er7LG+HORCxBVcF8ZYBWRNeC8ogQHD8+hiqBk5cj +BXu3MPoma33jKDRqms+MQ+AW1x1syGjFNADn4gItOedN1LB3K0cIbJKnWhrK/ayK +SOhvhHoqG0FoVM/hiX4lCUDpXVP7SxubxP1pH8ecRyahrKvilEo1X4k2ibfPFQqy +NpMoqXbf3BX0kkaL8aPAk2owr48Rs44E3fzMFe2c4cNT/6pqN6UBiwB6gp4vNpln +DfEgP7DHOcI1+WuvGFUQiUZWLUciv1QvYiDo/xAS6ASN5xHAG+yPWER0qoWlCcR0 +9iZmlixLRs5/d3CowMVjBY5lQQ3eu3aPUPR19koQet87pgFL5ZmhZMNV00/NQXrh +RRuPkV0j2lJFZ3YFdn1OXZya6U6J66n0RGJwlFrJT1lTsJUVAz5fYxhgblQ9/1HA +WP7Fi4ZGwnY3Md+vV4CxI98D/BosFPL12SBPqSL5dBqYDIVHfwGlYvUqYUbpnJqf +S4oISmUyXNUpJt8zUVLQlGGiUiNEozouL3mKjHt9OVtLjwYIkCmlBT6W99IX/ITX +8xh5il93PN6r0COjVo4ZEXocpaT8C7KntZU1NKU+e4pYLgWhJ7W5l9n4qdKGqzs4 +P3RV/y2A9sjVAWioNBArR+cjI4bSSS/atrR2haifE1peEuBZP5bY079yhWoqsrpk +B28Ngk7Bl+ktb/bT4bqf0Q== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/key_pass.txt b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/key_pass.txt new file mode 100644 index 00000000..76afcce7 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/keys/key_pass.txt @@ -0,0 +1,2 @@ +test +test \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/output.bin b/tests/nxpimage/data/hab/export/rt1165_flashloader_authenticated/output.bin new file mode 100644 index 0000000000000000000000000000000000000000..b7534ef0a30ed5cc68dfc4ebb56e8d20cd6d081d GIT binary patch literal 102400 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 literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/config.bd b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/config.bd new file mode 100644 index 00000000..1dbca743 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/config.bd @@ -0,0 +1,87 @@ +options { + flags = 0x08; + startAddress = 0x80001000; + ivtOffset = 0x400; + initialLoadSize = 0x1000; + DCDFilePath = "dcd_files\evkmimxrt1166_SDRAM_dcd.bin"; + entryPointAddress = 0x800041f5; + signatureTimestamp = "04/05/2023 22:10:56"; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_SET_ENGINE; + SetEngine_HashAlgorithm = "sha256", + SetEngine_Engine = "ANY", + SetEngine_EngineConfiguration = "0") +{ +} + +section (SEC_UNLOCK; + Unlock_Engine = "SNVS", + Unlock_Features = "ZMK WRITE" + ) +{ +} \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d7f75092 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419897 (0x12345679) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:42 2023 GMT + Not After : May 1 22:08:42 2033 GMT + Subject: CN=CSF1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:bb:3f:d1:a8:e4:c8:53:99:62:e9:83:ab:03:b8: + d1:20:f8:c1:ca:8a:91:a9:85:bc:c7:f1:6f:83:bd: + b3:3e:79:39:52:f5:64:0a:6a:a3:46:90:f5:fb:e7: + 84:80:e8:d5:a7:47:e9:8e:20:42:0c:5c:c4:90:03: + 60:c3:22:d5:96:9c:39:b2:41:36:fd:99:24:4d:52: + 77:63:39:b2:9d:a6:87:c2:60:a3:1a:79:c4:ab:17: + af:b6:88:a7:0a:27:78:2a:39:0b:33:38:24:6c:f8: + b2:6d:2a:50:33:3e:bd:3b:5f:b1:d7:84:43:a7:87: + 95:15:bd:7d:1a:6d:f3:43:df:a6:28:ad:5d:11:aa: + a4:a1:67:e0:70:3f:06:8e:f4:58:6e:45:92:fe:3b: + 66:71:b9:49:2b:74:12:20:2c:2c:1c:84:0d:fe:bc: + 76:a9:58:af:04:d6:2a:34:45:8a:25:04:fe:b9:0f: + 83:2f:76:5f:32:27:a1:29:ca:ac:b4:69:b4:11:75: + c2:4c:fc:13:a3:f0:b8:59:16:6a:5f:9c:99:6e:3b: + 01:c4:7c:da:ad:46:80:de:d6:68:0c:7c:6d:e1:92: + 96:73:01:ab:4b:51:3b:8c:17:6f:ea:ba:58:3c:d3: + dd:c5:29:64:59:70:25:26:24:48:79:cc:b9:a2:ba: + 73:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + C0:37:D2:B0:28:92:CD:2B:8C:29:E9:E0:30:19:29:C3:B5:8A:6E:E5 + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + 08:93:8f:bb:9c:0e:21:70:97:75:2e:c3:c3:f8:a2:95:2f:bf: + 67:35:67:68:7e:c5:ef:7d:b7:6f:fc:ca:61:b9:60:b5:18:9f: + 44:40:ef:01:d7:f6:9d:41:0c:9a:17:8f:d6:aa:ca:01:76:80: + 8f:b4:fd:ef:8a:8e:bb:7c:64:24:32:87:d5:03:e5:8b:1e:ed: + 31:51:48:10:7a:77:81:82:c7:37:ec:0c:b1:97:25:cb:0e:65: + c9:54:6e:90:99:db:06:10:d1:cc:c1:a5:0f:55:4c:53:0b:a4: + 59:ba:64:02:ee:e1:15:ff:34:94:fb:d7:1e:16:44:eb:3b:fc: + af:31:9d:62:d7:08:69:2f:20:50:f6:21:e7:8f:ff:f1:da:e6: + 82:da:36:bc:27:cc:a4:06:db:b1:40:a7:05:ce:7c:fd:21:ef: + 7d:c0:99:79:a4:cb:18:89:ae:bb:ff:e1:82:ad:be:fc:17:b0: + ce:91:8b:7b:9f:56:35:84:a9:48:d7:85:d8:f1:88:ad:49:66: + d8:07:a4:e6:df:d7:3c:bc:1b:19:a3:9e:d3:85:1c:40:48:36: + 74:97:27:5b:5f:7a:8d:e8:47:46:30:6f:4d:5f:27:c6:e1:de: + 1b:27:4a:3e:a6:f5:9d:a3:33:20:e4:60:4d:03:c1:a8:b0:eb: + bf:73:a4:35 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWeTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0MloXDTMz +MDUwMTIyMDg0MlowKjEoMCYGA1UEAxQfQ1NGMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALs/0ajkyFOZ +YumDqwO40SD4wcqKkamFvMfxb4O9sz55OVL1ZApqo0aQ9fvnhIDo1adH6Y4gQgxc +xJADYMMi1ZacObJBNv2ZJE1Sd2M5sp2mh8Jgoxp5xKsXr7aIpwoneCo5CzM4JGz4 +sm0qUDM+vTtfsdeEQ6eHlRW9fRpt80PfpiitXRGqpKFn4HA/Bo70WG5Fkv47ZnG5 +SSt0EiAsLByEDf68dqlYrwTWKjRFiiUE/rkPgy92XzInoSnKrLRptBF1wkz8E6Pw +uFkWal+cmW47AcR82q1GgN7WaAx8beGSlnMBq0tRO4wXb+q6WDzT3cUpZFlwJSYk +SHnMuaK6c58CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFMA30rAoks0rjCnp +4DAZKcO1im7lMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQAIk4+7nA4hcJd1LsPD+KKVL79nNWdofsXvfbdv/MphuWC1 +GJ9EQO8B1/adQQyaF4/WqsoBdoCPtP3vio67fGQkMofVA+WLHu0xUUgQeneBgsc3 +7AyxlyXLDmXJVG6QmdsGENHMwaUPVUxTC6RZumQC7uEV/zSU+9ceFkTrO/yvMZ1i +1whpLyBQ9iHnj//x2uaC2ja8J8ykBtuxQKcFznz9Ie99wJl5pMsYia67/+GCrb78 +F7DOkYt7n1Y1hKlI14XY8YitSWbYB6Tm39c8vBsZo57ThRxASDZ0lydbX3qN6EdG +MG9NXyfG4d4bJ0o+pvWdozMg5GBNA8GosOu/c6Q1 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d487da3f --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419898 (0x1234567a) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:43 2023 GMT + Not After : May 1 22:08:43 2033 GMT + Subject: CN=IMG1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:ba:27:0e:03:0a:53:4f:cb:d3:04:6c:a9:b9:c5: + aa:38:13:b5:b4:c4:e5:9d:60:e3:68:8a:80:c2:d5: + b5:0b:b7:44:2d:82:f5:de:07:c9:f5:d6:05:52:1b: + 16:b7:92:52:83:e8:60:df:eb:bc:22:78:f9:66:73: + 24:26:09:b7:54:51:f0:ff:fa:7f:36:da:d6:21:1d: + ff:2e:eb:f3:94:16:65:97:94:4d:7f:8e:a6:98:93: + 6c:dc:c1:2e:92:8c:d8:de:95:7b:72:93:a7:e9:76: + 38:97:62:dd:1d:83:ff:61:21:db:16:c9:d4:22:aa: + 25:86:75:93:09:2c:3e:b7:f5:21:14:e4:a0:8e:53: + 1e:a3:9b:4c:d2:46:b1:92:9b:84:6c:73:99:d8:cb: + 6d:b6:f2:d5:51:d0:ee:b0:2e:79:48:07:6e:87:6c: + 47:0d:a2:7e:05:46:64:7f:18:16:bb:86:48:e5:84: + 16:c8:5f:15:b7:86:8f:ad:5d:70:59:64:0d:24:17: + c0:a9:4b:cd:08:3e:76:96:67:93:60:46:e3:12:96: + bf:87:7b:34:3b:e4:9c:09:75:1d:c8:67:97:9e:08: + bd:25:59:e3:6a:62:b2:16:62:49:d0:de:99:9c:c7: + 8f:40:9f:ac:fa:7e:ed:38:95:a5:d2:3b:7d:17:d0: + 6e:3d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 33:50:6A:02:FA:C4:D4:4A:0B:DE:0A:9E:45:2A:05:80:BE:FE:DC:CC + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + a8:a6:13:36:28:a2:01:8f:16:58:48:2e:fd:59:86:bf:f0:94: + 90:17:98:a7:39:d8:df:74:a0:46:8d:61:e6:d1:45:60:84:5e: + a9:d0:1d:03:3d:a5:47:85:80:f9:86:a0:80:a6:bf:ce:80:f4: + bc:e7:2d:c3:bd:c6:ae:ef:fc:ae:90:e0:28:dd:b5:85:b7:9d: + 97:b0:93:d6:da:29:c0:21:0a:30:6e:6d:75:50:ff:05:5c:56: + 63:5e:17:aa:fc:56:8c:61:f1:e6:ba:10:d2:06:4a:49:5b:c0: + 78:37:c6:3c:08:6f:3d:f2:c5:2a:04:f6:d7:8a:9c:7f:80:dd: + 1a:29:60:09:97:85:41:d9:e6:c1:72:17:4c:08:48:f4:a0:96: + aa:7b:54:da:d4:91:fe:be:3d:8d:54:20:17:f8:b8:95:1d:cc: + cb:b4:c1:1a:2d:0a:5f:54:7e:db:90:ab:e3:cf:0e:00:00:30: + aa:00:3a:c5:b5:b5:f9:3e:de:0e:04:e6:f8:f0:d3:b5:5a:6a: + 8d:7c:7b:5d:37:da:4e:70:10:1f:eb:f1:93:f1:32:da:99:c1: + 38:fc:f0:52:8b:4c:51:cf:ad:e7:23:af:11:d7:e4:ac:f5:3f: + 18:b9:35:ae:20:d0:65:bc:d8:ad:34:87:f8:0b:93:02:db:a4: + 57:fc:c3:a9 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWejANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0M1oXDTMz +MDUwMTIyMDg0M1owKjEoMCYGA1UEAxQfSU1HMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALonDgMKU0/L +0wRsqbnFqjgTtbTE5Z1g42iKgMLVtQu3RC2C9d4HyfXWBVIbFreSUoPoYN/rvCJ4 ++WZzJCYJt1RR8P/6fzba1iEd/y7r85QWZZeUTX+OppiTbNzBLpKM2N6Ve3KTp+l2 +OJdi3R2D/2Eh2xbJ1CKqJYZ1kwksPrf1IRTkoI5THqObTNJGsZKbhGxzmdjLbbby +1VHQ7rAueUgHbodsRw2ifgVGZH8YFruGSOWEFshfFbeGj61dcFlkDSQXwKlLzQg+ +dpZnk2BG4xKWv4d7NDvknAl1Hchnl54IvSVZ42pishZiSdDemZzHj0CfrPp+7TiV +pdI7fRfQbj0CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDNQagL6xNRKC94K +nkUqBYC+/tzMMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQCophM2KKIBjxZYSC79WYa/8JSQF5inOdjfdKBGjWHm0UVg +hF6p0B0DPaVHhYD5hqCApr/OgPS85y3Dvcau7/yukOAo3bWFt52XsJPW2inAIQow +bm11UP8FXFZjXheq/FaMYfHmuhDSBkpJW8B4N8Y8CG898sUqBPbXipx/gN0aKWAJ +l4VB2ebBchdMCEj0oJaqe1Ta1JH+vj2NVCAX+LiVHczLtMEaLQpfVH7bkKvjzw4A +ADCqADrFtbX5Pt4OBOb48NO1WmqNfHtdN9pOcBAf6/GT8TLamcE4/PBSi0xRz63n +I68R1+Ss9T8YuTWuINBlvNitNIf4C5MC26RX/MOp +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/dcd_files/evkmimxrt1166_SDRAM_dcd.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/dcd_files/evkmimxrt1166_SDRAM_dcd.bin new file mode 100644 index 0000000000000000000000000000000000000000..78d9059b3d3b699cc6435bdfce277826043d1cd3 GIT binary patch literal 1288 zcma*kFH8bq7{~EfJ?F{fPaqI*LuX))z?48BoEw2)Fc6p{5DWx^!A*nV&i+-;@Q-i{Tp zL-M1*?Bf83IKnZ$ql**##3{~jjtl(4 zZ(QOE*ZAZ4BItX4G0?;V3}F}}7{wT#U>p;e#1y762-|_POmXZw^mfzCr z6;ZEiL$*?fqNP;uOw6i>(_=BGwtRl^^61Dg#hUafu`X^|-cJE|UL2fI$^m`^omrcA+8uijbAq0G zekx)cks5db*0zrBO-$6pVk77FqHkL9kKd=|b-r)iK*d^g6t4&%O;8JFqBX&WVusX@ z<)ax}5{v;%U}*V3G0Vn)GipSBwf!}>Ed{f*w6L%UsjaL!`Fq4Gs-p;qJM|#fVoc4x zC5IEC%ldYK#R1@%ugrZRJ=O;S00H3v4ShA zbRHnmntgQxr?y?#57**-$gzm9KXUb&D%kxmU|3|Qja(Wo)42Zh*)0Q~V1B$wuU*Mf zLnm$$g$o-OB)zL_jFf*?yqsNpzhtE{FO)Hu9t9V1olrV{oCRu&BX^&$nEjI(!QING zn@P1Dq=H{qnYU4A3$)HQ3Vz0lOAYQVf5flL{g(j%0pS4;ApigXfB^si1KYeeYAh{# z)B7q~=%o3WA9sgfDYCKSLE$tB$1JIMf&ZaOp3b4lCz`16KoR7~lKwys0J%`|zT@k| zZHmssnomfdF}41B#rZk!#ESZ3XZ{aLt$iVAmMXhf(9sh`rD-{=*Xm7?$6y-$ZMVNW z1bqQF39>NmWS>rnLfc^C>yUNIw3mitYXlyfU5MiTDgXf^-}ZGKwWKDi zQH>2_q>(qp_o-%pb->r|X>Qj13cxBkn_)bGrj88;B+Rz*K<4~vqZph^zA3n&`Xf8p znRz?&bEUn>(o@3$cIyh7^PVix+e}wCg!7M!Uie|88{~gp70)0MX@3W{*gi0K<_C2l G0RREs`w5f) literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..c83f375b --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIdi/0V8NCoksCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECL8tgUuPznT5BIIEyHhGq4g/Npl8 +ZgZxxq1VjEjLNNHS/Ou0bv2/suXnYPyDTNkCYl/bnCbXIVjFfMwdP1WIDE2tOTW3 +0OGQubJUVj+Be5o4RxKVhGnbiW4ZZVtCmhnA4EFU4oaRYndq8NRPRH5l8SMiPgG8 +6CPvnc9IV1TM6BKPPgRgvW99zQkox3ulSIZjdy7dEMHJav0WNzo8R8e+614WxoiA +/gXCXa6FUlIJNGJujYS+MPcggbMS0QTTFhNeofcYzNNAsmBwjRyq96c11Dx9mpct +PinQN3Et1XP84A30McZOFrKKC/kinvGzpoouGAMNGXbLrwHMpG1Sb3H+OO/ZQEDr +n5rFDCFGVwmQ9dhPvlpy0IzfA6cLlpu0UU1pgn81YChhOtnAVi4VjUCpdUxdngQU ++1Q1EfeZeERI1iofjwR7X+uSYaB9FN5wQiwNfgu03Oobl2ghSJtDtuTkLlG/sRtx +cU0qTvLkWttEBxc+5FDrARBAfObRgq4sYr/fjwFaqHz+faJ8FJYzoj2nkY5OCBKY +DjuNT42Qet3qhbkUsu2YE61TS8vVlD8ycxKSg+egg9dNMlNoMGTrSVtIn29EeR2j +9sjhC5TjPJTHsG5guYLRzNgnElOPhmsMAD/zr3psRMxafmFgR/RTSy/C45sMEEjN +6YfZhXKqcO3FHa7vJqSo1fGaTvBq92jwYgl/HMyzdDPIiRte5OBh35O/v03yE3Ms +TFVEz2eDZFgG4nNMRwaR5V7V50jgypBFZzpOHihukPQ9JcarCd0T6+TsAmbmcYJk +LzWpKYpd36FBKVJUTnl69bF87+L6CA41EVqfavxyuC3wFxg0Glus8zPHRJL5tUdw +b2JUWzMrkP6mW9uoTX8MTrlTW4zrIn+Qht9x7IhV+s4nIAp4irDjBDu+fI0OenAa +B5HfKQ4WlcZRxw1EITSkD80XIbshF/WD6NRSFlIHUQdvqBmHNAVti0x4TQwRr96X +zQlXsQ+4qW6502E3wtc9Z29z+h4ed5Ia9IsmCKTuJ41YtSZnXRwGYnI/TjN+LG4s +Gpk2H5Qeknk5MDCv0rKSv5kRNqqOeIjZa0GCKZ4a3OHnRdGy5zLAneyuflI3OHN5 +RaH6Zstynku+dWcOUJY4V0bonccOYok11HyAWTUliznPV2wMWmpLvapRFwn7JEvc +XBZUWSXaSC7zQvT+2/S49+5J8SofX4gw1h+NbnogfOl+3ejZgj/VCHgEirfte3yI +oNOh6N5zLc07UkOG8qC9um0j4JEGvRrZ93rEcgWFsg9rI6HumxHpjYRaaDYGlILz +dgxTR427b9IaWEdMW7bSvcb87yOrMkW4yqxmKv9Q4p7ucRxxBeB0hqA4VoVA9pxt ++lPVnCFPBI6d7dhVM9VsinePfpeY2Xsk8zkSvzx89S+2Taw2tONYodKnv893TnrF +BYR8sHK3eDsZm5h+LJzjAq7WT4eHjjta2LDoJXWSidscAQtU+GsWK+p9IGpNqGbK +FKRNqH1mYogoJX3qGxphVWyL9ZL5HmO9wM3vf+NvR35LDBZDqCHLps9OOUIPQ7PX +b6IlB0eroQMruBnesvTGsYNGdDQ/PpMpwguKZ34cA2b9AU8FoVkz21uApO5P5fEl +z8ol2l8j0h2EPJYnHaXXAQ== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..b00a4e58 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIvXzlrAaQI2gCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECI+FLYDFYwyOBIIEyGURKoTjjTBI +IQGK0cSJiq2zH7+KgxBZyLQtbYOICQQvaebsZ3E83gOrnvIaA5APTiBEfL3vIWTU +LyfLbhSjoOoOLdybYgbvId7xWL6Ym8joJaOL1AX3W9Yhne3lNW4ZRbjbrjDdZ20b +fD0n5RfYWe2sJfpHxoYUZjxb/8qLer87EDe7XF1H/XuPnFZKWgGqARMHwD5RYaep +CmBR+MY4l2vtpTIFxJyPOHkgn3M7t8l4B/0g5HGaLhvTB5grkFRRG7Di3NJS3wpm +WmqGt/pjTPMuOxZtPm59ZMiX8iy8E5eaBjglwzpGT8+b2BfS8npvHtTsuysZqDQf +fBG1J6Bkfd/+2b6WTwBbpayxyKBgB+/9s1Z3k+2sYqFnFbK17jM6o/p1mcHFsVHh +ThlSjX+4j1nHIV/0vaD/a4TvGuOcnVZi1L7FtM2yrFBLvrWaIlSAmM2+VMniMvgG +IdzwDO8xpCgn2wBIpUle0t7XMZlXKai51JMiQI8hoDxLbMvnAzE4xmJ38hzV4qLQ +8gQmWOuJPEmcwUz5Ksv1jh9kW46Yb2hb2/TtkX+n1OsLsYtfsUtgUAbHkD9hTbSs +mozsUsgQoKQU9F11RqO1rX/R5YVagJsatRJxn773djsgAapD4HTGkk0a90eF0F2p +GqMyfMwcmQQGN1M5LrTOlIaGHadzQAbat3OCb/Pp/BB7R+BXTAKM2h++J4mqYqWK +dp/hhN/7VY4n8Y85d0cN77FTBWF4+x41zsUMqckYp48XApm45kO4rMgMXK4bKm7K +KZHp+/bC/9WB3HqD1UwaQbUCmJsrx8vr/iAD4Rx4cXni548N4ZBgvXUx07VGzLvt +42Qrs1kGfbSh4riwjQB+3EAy6csb2CVw+ubJUNuV/FuZhD2v4I4pX2KnKMBj3OVi +i36Szq91fgQv6I9o0V5yAKZ0er7LG+HORCxBVcF8ZYBWRNeC8ogQHD8+hiqBk5cj +BXu3MPoma33jKDRqms+MQ+AW1x1syGjFNADn4gItOedN1LB3K0cIbJKnWhrK/ayK +SOhvhHoqG0FoVM/hiX4lCUDpXVP7SxubxP1pH8ecRyahrKvilEo1X4k2ibfPFQqy +NpMoqXbf3BX0kkaL8aPAk2owr48Rs44E3fzMFe2c4cNT/6pqN6UBiwB6gp4vNpln +DfEgP7DHOcI1+WuvGFUQiUZWLUciv1QvYiDo/xAS6ASN5xHAG+yPWER0qoWlCcR0 +9iZmlixLRs5/d3CowMVjBY5lQQ3eu3aPUPR19koQet87pgFL5ZmhZMNV00/NQXrh +RRuPkV0j2lJFZ3YFdn1OXZya6U6J66n0RGJwlFrJT1lTsJUVAz5fYxhgblQ9/1HA +WP7Fi4ZGwnY3Md+vV4CxI98D/BosFPL12SBPqSL5dBqYDIVHfwGlYvUqYUbpnJqf +S4oISmUyXNUpJt8zUVLQlGGiUiNEozouL3mKjHt9OVtLjwYIkCmlBT6W99IX/ITX +8xh5il93PN6r0COjVo4ZEXocpaT8C7KntZU1NKU+e4pYLgWhJ7W5l9n4qdKGqzs4 +P3RV/y2A9sjVAWioNBArR+cjI4bSSS/atrR2haifE1peEuBZP5bY079yhWoqsrpk +B28Ngk7Bl+ktb/bT4bqf0Q== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/key_pass.txt b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/key_pass.txt new file mode 100644 index 00000000..76afcce7 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/keys/key_pass.txt @@ -0,0 +1,2 @@ +test +test \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/output.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_authenticated/output.bin new file mode 100644 index 0000000000000000000000000000000000000000..ad4503edafd8b1d68e82f5774708ca8fd4960221 GIT binary patch literal 23552 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 Noe}7az<){v{tF=EJf{Ev literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/config.bd b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/config.bd new file mode 100644 index 00000000..36ea1f18 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/config.bd @@ -0,0 +1,91 @@ +options { + flags = 0x0c; + startAddress = 0x80001000; + ivtOffset = 0x400; + initialLoadSize = 0x1000; + DCDFilePath = "dcd_files\evkmimxrt1166_SDRAM_dcd.bin"; + entryPointAddress = 0x800041f5; + signatureTimestamp = "11/05/2023 11:58:00"; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_CSF_INSTALL_SECRET_KEY; + SecretKey_Name="gen_hab_encrypt\evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin", + SecretKey_Length=256, + SecretKey_VerifyIndex=0, + SecretKey_TargetIndex=0, + SecretKey_ReuseDek=true) +{ +} + +section (SEC_CSF_DECRYPT_DATA; + Decrypt_Engine="ANY", + Decrypt_EngineConfiguration="0", + Decrypt_VerifyIndex=0, + Decrypt_MacBytes=16, + Decrypt_Nonce="gen_hab_encrypt\nonce.bin") +{ +} \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d7f75092 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419897 (0x12345679) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:42 2023 GMT + Not After : May 1 22:08:42 2033 GMT + Subject: CN=CSF1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:bb:3f:d1:a8:e4:c8:53:99:62:e9:83:ab:03:b8: + d1:20:f8:c1:ca:8a:91:a9:85:bc:c7:f1:6f:83:bd: + b3:3e:79:39:52:f5:64:0a:6a:a3:46:90:f5:fb:e7: + 84:80:e8:d5:a7:47:e9:8e:20:42:0c:5c:c4:90:03: + 60:c3:22:d5:96:9c:39:b2:41:36:fd:99:24:4d:52: + 77:63:39:b2:9d:a6:87:c2:60:a3:1a:79:c4:ab:17: + af:b6:88:a7:0a:27:78:2a:39:0b:33:38:24:6c:f8: + b2:6d:2a:50:33:3e:bd:3b:5f:b1:d7:84:43:a7:87: + 95:15:bd:7d:1a:6d:f3:43:df:a6:28:ad:5d:11:aa: + a4:a1:67:e0:70:3f:06:8e:f4:58:6e:45:92:fe:3b: + 66:71:b9:49:2b:74:12:20:2c:2c:1c:84:0d:fe:bc: + 76:a9:58:af:04:d6:2a:34:45:8a:25:04:fe:b9:0f: + 83:2f:76:5f:32:27:a1:29:ca:ac:b4:69:b4:11:75: + c2:4c:fc:13:a3:f0:b8:59:16:6a:5f:9c:99:6e:3b: + 01:c4:7c:da:ad:46:80:de:d6:68:0c:7c:6d:e1:92: + 96:73:01:ab:4b:51:3b:8c:17:6f:ea:ba:58:3c:d3: + dd:c5:29:64:59:70:25:26:24:48:79:cc:b9:a2:ba: + 73:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + C0:37:D2:B0:28:92:CD:2B:8C:29:E9:E0:30:19:29:C3:B5:8A:6E:E5 + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + 08:93:8f:bb:9c:0e:21:70:97:75:2e:c3:c3:f8:a2:95:2f:bf: + 67:35:67:68:7e:c5:ef:7d:b7:6f:fc:ca:61:b9:60:b5:18:9f: + 44:40:ef:01:d7:f6:9d:41:0c:9a:17:8f:d6:aa:ca:01:76:80: + 8f:b4:fd:ef:8a:8e:bb:7c:64:24:32:87:d5:03:e5:8b:1e:ed: + 31:51:48:10:7a:77:81:82:c7:37:ec:0c:b1:97:25:cb:0e:65: + c9:54:6e:90:99:db:06:10:d1:cc:c1:a5:0f:55:4c:53:0b:a4: + 59:ba:64:02:ee:e1:15:ff:34:94:fb:d7:1e:16:44:eb:3b:fc: + af:31:9d:62:d7:08:69:2f:20:50:f6:21:e7:8f:ff:f1:da:e6: + 82:da:36:bc:27:cc:a4:06:db:b1:40:a7:05:ce:7c:fd:21:ef: + 7d:c0:99:79:a4:cb:18:89:ae:bb:ff:e1:82:ad:be:fc:17:b0: + ce:91:8b:7b:9f:56:35:84:a9:48:d7:85:d8:f1:88:ad:49:66: + d8:07:a4:e6:df:d7:3c:bc:1b:19:a3:9e:d3:85:1c:40:48:36: + 74:97:27:5b:5f:7a:8d:e8:47:46:30:6f:4d:5f:27:c6:e1:de: + 1b:27:4a:3e:a6:f5:9d:a3:33:20:e4:60:4d:03:c1:a8:b0:eb: + bf:73:a4:35 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWeTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0MloXDTMz +MDUwMTIyMDg0MlowKjEoMCYGA1UEAxQfQ1NGMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALs/0ajkyFOZ +YumDqwO40SD4wcqKkamFvMfxb4O9sz55OVL1ZApqo0aQ9fvnhIDo1adH6Y4gQgxc +xJADYMMi1ZacObJBNv2ZJE1Sd2M5sp2mh8Jgoxp5xKsXr7aIpwoneCo5CzM4JGz4 +sm0qUDM+vTtfsdeEQ6eHlRW9fRpt80PfpiitXRGqpKFn4HA/Bo70WG5Fkv47ZnG5 +SSt0EiAsLByEDf68dqlYrwTWKjRFiiUE/rkPgy92XzInoSnKrLRptBF1wkz8E6Pw +uFkWal+cmW47AcR82q1GgN7WaAx8beGSlnMBq0tRO4wXb+q6WDzT3cUpZFlwJSYk +SHnMuaK6c58CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFMA30rAoks0rjCnp +4DAZKcO1im7lMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQAIk4+7nA4hcJd1LsPD+KKVL79nNWdofsXvfbdv/MphuWC1 +GJ9EQO8B1/adQQyaF4/WqsoBdoCPtP3vio67fGQkMofVA+WLHu0xUUgQeneBgsc3 +7AyxlyXLDmXJVG6QmdsGENHMwaUPVUxTC6RZumQC7uEV/zSU+9ceFkTrO/yvMZ1i +1whpLyBQ9iHnj//x2uaC2ja8J8ykBtuxQKcFznz9Ie99wJl5pMsYia67/+GCrb78 +F7DOkYt7n1Y1hKlI14XY8YitSWbYB6Tm39c8vBsZo57ThRxASDZ0lydbX3qN6EdG +MG9NXyfG4d4bJ0o+pvWdozMg5GBNA8GosOu/c6Q1 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d487da3f --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419898 (0x1234567a) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:43 2023 GMT + Not After : May 1 22:08:43 2033 GMT + Subject: CN=IMG1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:ba:27:0e:03:0a:53:4f:cb:d3:04:6c:a9:b9:c5: + aa:38:13:b5:b4:c4:e5:9d:60:e3:68:8a:80:c2:d5: + b5:0b:b7:44:2d:82:f5:de:07:c9:f5:d6:05:52:1b: + 16:b7:92:52:83:e8:60:df:eb:bc:22:78:f9:66:73: + 24:26:09:b7:54:51:f0:ff:fa:7f:36:da:d6:21:1d: + ff:2e:eb:f3:94:16:65:97:94:4d:7f:8e:a6:98:93: + 6c:dc:c1:2e:92:8c:d8:de:95:7b:72:93:a7:e9:76: + 38:97:62:dd:1d:83:ff:61:21:db:16:c9:d4:22:aa: + 25:86:75:93:09:2c:3e:b7:f5:21:14:e4:a0:8e:53: + 1e:a3:9b:4c:d2:46:b1:92:9b:84:6c:73:99:d8:cb: + 6d:b6:f2:d5:51:d0:ee:b0:2e:79:48:07:6e:87:6c: + 47:0d:a2:7e:05:46:64:7f:18:16:bb:86:48:e5:84: + 16:c8:5f:15:b7:86:8f:ad:5d:70:59:64:0d:24:17: + c0:a9:4b:cd:08:3e:76:96:67:93:60:46:e3:12:96: + bf:87:7b:34:3b:e4:9c:09:75:1d:c8:67:97:9e:08: + bd:25:59:e3:6a:62:b2:16:62:49:d0:de:99:9c:c7: + 8f:40:9f:ac:fa:7e:ed:38:95:a5:d2:3b:7d:17:d0: + 6e:3d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 33:50:6A:02:FA:C4:D4:4A:0B:DE:0A:9E:45:2A:05:80:BE:FE:DC:CC + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + a8:a6:13:36:28:a2:01:8f:16:58:48:2e:fd:59:86:bf:f0:94: + 90:17:98:a7:39:d8:df:74:a0:46:8d:61:e6:d1:45:60:84:5e: + a9:d0:1d:03:3d:a5:47:85:80:f9:86:a0:80:a6:bf:ce:80:f4: + bc:e7:2d:c3:bd:c6:ae:ef:fc:ae:90:e0:28:dd:b5:85:b7:9d: + 97:b0:93:d6:da:29:c0:21:0a:30:6e:6d:75:50:ff:05:5c:56: + 63:5e:17:aa:fc:56:8c:61:f1:e6:ba:10:d2:06:4a:49:5b:c0: + 78:37:c6:3c:08:6f:3d:f2:c5:2a:04:f6:d7:8a:9c:7f:80:dd: + 1a:29:60:09:97:85:41:d9:e6:c1:72:17:4c:08:48:f4:a0:96: + aa:7b:54:da:d4:91:fe:be:3d:8d:54:20:17:f8:b8:95:1d:cc: + cb:b4:c1:1a:2d:0a:5f:54:7e:db:90:ab:e3:cf:0e:00:00:30: + aa:00:3a:c5:b5:b5:f9:3e:de:0e:04:e6:f8:f0:d3:b5:5a:6a: + 8d:7c:7b:5d:37:da:4e:70:10:1f:eb:f1:93:f1:32:da:99:c1: + 38:fc:f0:52:8b:4c:51:cf:ad:e7:23:af:11:d7:e4:ac:f5:3f: + 18:b9:35:ae:20:d0:65:bc:d8:ad:34:87:f8:0b:93:02:db:a4: + 57:fc:c3:a9 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWejANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0M1oXDTMz +MDUwMTIyMDg0M1owKjEoMCYGA1UEAxQfSU1HMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALonDgMKU0/L +0wRsqbnFqjgTtbTE5Z1g42iKgMLVtQu3RC2C9d4HyfXWBVIbFreSUoPoYN/rvCJ4 ++WZzJCYJt1RR8P/6fzba1iEd/y7r85QWZZeUTX+OppiTbNzBLpKM2N6Ve3KTp+l2 +OJdi3R2D/2Eh2xbJ1CKqJYZ1kwksPrf1IRTkoI5THqObTNJGsZKbhGxzmdjLbbby +1VHQ7rAueUgHbodsRw2ifgVGZH8YFruGSOWEFshfFbeGj61dcFlkDSQXwKlLzQg+ +dpZnk2BG4xKWv4d7NDvknAl1Hchnl54IvSVZ42pishZiSdDemZzHj0CfrPp+7TiV +pdI7fRfQbj0CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDNQagL6xNRKC94K +nkUqBYC+/tzMMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQCophM2KKIBjxZYSC79WYa/8JSQF5inOdjfdKBGjWHm0UVg +hF6p0B0DPaVHhYD5hqCApr/OgPS85y3Dvcau7/yukOAo3bWFt52XsJPW2inAIQow +bm11UP8FXFZjXheq/FaMYfHmuhDSBkpJW8B4N8Y8CG898sUqBPbXipx/gN0aKWAJ +l4VB2ebBchdMCEj0oJaqe1Ta1JH+vj2NVCAX+LiVHczLtMEaLQpfVH7bkKvjzw4A +ADCqADrFtbX5Pt4OBOb48NO1WmqNfHtdN9pOcBAf6/GT8TLamcE4/PBSi0xRz63n +I68R1+Ss9T8YuTWuINBlvNitNIf4C5MC26RX/MOp +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/dcd_files/evkmimxrt1166_SDRAM_dcd.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/dcd_files/evkmimxrt1166_SDRAM_dcd.bin new file mode 100644 index 0000000000000000000000000000000000000000..78d9059b3d3b699cc6435bdfce277826043d1cd3 GIT binary patch literal 1288 zcma*kFH8bq7{~EfJ?F{fPaqI*LuX))z?48BoEw2)Fc6p{5DWx^!A*nV&i+-;@Q-i{Tp zL-M1*?Bf83IKnZ$ql**##3{~jjtl(4 zZ(QOE*ZAZ4BItX4G0?;V3}F}}7{wT#U>p;e#1y762-|_POmXZw^mfzCr z6;ZEiL$*?fqNP;uOw6i>(_=BGwtRl^^61Dg#hUafu`X^|-cJE|UL2fI$^m`^omrcA+8uijbAq0G zekx)cks5db*0zrBO-$6pVk77FqHkL9kKd=|b-r)iK*d^g6t4&%O;8JFqBX&WVusX@ z<)ax}5{v;%U}*V3G0Vn)GipSBwf!}>Ed{f*w6L%UsjaL!`Fq4Gs-p;qJM|#fVoc4x zC5IEC%ldYK#R1@%ugrZRJ=O;S00H3v4ShA zbRHnmntgQxr?y?#57**-$gzm9KXUb&D%kxmU|3|Qja(Wo)42Zh*)0Q~V1B$wuU*Mf zLnm$$g$o-OB)zL_jFf*?yqsNpzhtE{FO)Hu9t9V1olrV{oCRu&BX^&$nEjI(!QING zn@P1Dq=H{qnYU4A3$)HQ3Vz0lOAYQVf5flL{g(j%0pS4;ApigXfB^si1KYeeYAh{# z)B7q~=%o3WA9sgfDYCKSLE$tB$1JIMf&ZaOp3b4lCz`16KoR7~lKwys0J%`|zT@k| zZHmssnomfdF}41B#rZk!#ESZ3XZ{aLt$iVAmMXhf(9sh`rD-{=*Xm7?$6y-$ZMVNW z1bqQF39>NmWS>rnLfc^C>yUNIw3mitYXlyfU5MiTDgXf^-}ZGKwWKDi zQH>2_q>(qp_o-%pb->r|X>Qj13cxBkn_)bGrj88;B+Rz*K<4~vqZph^zA3n&`Xf8p znRz?&bEUn>(o@3$cIyh7^PVix+e}wCg!7M!Uie|88{~gp70)0MX@3W{*gi0K<_C2l G0RREs`w5f) literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin new file mode 100644 index 00000000..6f632062 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin @@ -0,0 +1 @@ +ߺ�Q!?aOܬVb bvߞg�Qo�i<�j�M�G�$ \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/nonce.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/nonce.bin new file mode 100644 index 00000000..1bddf436 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/gen_hab_encrypt/nonce.bin @@ -0,0 +1 @@ +%�4ħ��sI-� \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..c83f375b --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIdi/0V8NCoksCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECL8tgUuPznT5BIIEyHhGq4g/Npl8 +ZgZxxq1VjEjLNNHS/Ou0bv2/suXnYPyDTNkCYl/bnCbXIVjFfMwdP1WIDE2tOTW3 +0OGQubJUVj+Be5o4RxKVhGnbiW4ZZVtCmhnA4EFU4oaRYndq8NRPRH5l8SMiPgG8 +6CPvnc9IV1TM6BKPPgRgvW99zQkox3ulSIZjdy7dEMHJav0WNzo8R8e+614WxoiA +/gXCXa6FUlIJNGJujYS+MPcggbMS0QTTFhNeofcYzNNAsmBwjRyq96c11Dx9mpct +PinQN3Et1XP84A30McZOFrKKC/kinvGzpoouGAMNGXbLrwHMpG1Sb3H+OO/ZQEDr +n5rFDCFGVwmQ9dhPvlpy0IzfA6cLlpu0UU1pgn81YChhOtnAVi4VjUCpdUxdngQU ++1Q1EfeZeERI1iofjwR7X+uSYaB9FN5wQiwNfgu03Oobl2ghSJtDtuTkLlG/sRtx +cU0qTvLkWttEBxc+5FDrARBAfObRgq4sYr/fjwFaqHz+faJ8FJYzoj2nkY5OCBKY +DjuNT42Qet3qhbkUsu2YE61TS8vVlD8ycxKSg+egg9dNMlNoMGTrSVtIn29EeR2j +9sjhC5TjPJTHsG5guYLRzNgnElOPhmsMAD/zr3psRMxafmFgR/RTSy/C45sMEEjN +6YfZhXKqcO3FHa7vJqSo1fGaTvBq92jwYgl/HMyzdDPIiRte5OBh35O/v03yE3Ms +TFVEz2eDZFgG4nNMRwaR5V7V50jgypBFZzpOHihukPQ9JcarCd0T6+TsAmbmcYJk +LzWpKYpd36FBKVJUTnl69bF87+L6CA41EVqfavxyuC3wFxg0Glus8zPHRJL5tUdw +b2JUWzMrkP6mW9uoTX8MTrlTW4zrIn+Qht9x7IhV+s4nIAp4irDjBDu+fI0OenAa +B5HfKQ4WlcZRxw1EITSkD80XIbshF/WD6NRSFlIHUQdvqBmHNAVti0x4TQwRr96X +zQlXsQ+4qW6502E3wtc9Z29z+h4ed5Ia9IsmCKTuJ41YtSZnXRwGYnI/TjN+LG4s +Gpk2H5Qeknk5MDCv0rKSv5kRNqqOeIjZa0GCKZ4a3OHnRdGy5zLAneyuflI3OHN5 +RaH6Zstynku+dWcOUJY4V0bonccOYok11HyAWTUliznPV2wMWmpLvapRFwn7JEvc +XBZUWSXaSC7zQvT+2/S49+5J8SofX4gw1h+NbnogfOl+3ejZgj/VCHgEirfte3yI +oNOh6N5zLc07UkOG8qC9um0j4JEGvRrZ93rEcgWFsg9rI6HumxHpjYRaaDYGlILz +dgxTR427b9IaWEdMW7bSvcb87yOrMkW4yqxmKv9Q4p7ucRxxBeB0hqA4VoVA9pxt ++lPVnCFPBI6d7dhVM9VsinePfpeY2Xsk8zkSvzx89S+2Taw2tONYodKnv893TnrF +BYR8sHK3eDsZm5h+LJzjAq7WT4eHjjta2LDoJXWSidscAQtU+GsWK+p9IGpNqGbK +FKRNqH1mYogoJX3qGxphVWyL9ZL5HmO9wM3vf+NvR35LDBZDqCHLps9OOUIPQ7PX +b6IlB0eroQMruBnesvTGsYNGdDQ/PpMpwguKZ34cA2b9AU8FoVkz21uApO5P5fEl +z8ol2l8j0h2EPJYnHaXXAQ== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..b00a4e58 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIvXzlrAaQI2gCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECI+FLYDFYwyOBIIEyGURKoTjjTBI +IQGK0cSJiq2zH7+KgxBZyLQtbYOICQQvaebsZ3E83gOrnvIaA5APTiBEfL3vIWTU +LyfLbhSjoOoOLdybYgbvId7xWL6Ym8joJaOL1AX3W9Yhne3lNW4ZRbjbrjDdZ20b +fD0n5RfYWe2sJfpHxoYUZjxb/8qLer87EDe7XF1H/XuPnFZKWgGqARMHwD5RYaep +CmBR+MY4l2vtpTIFxJyPOHkgn3M7t8l4B/0g5HGaLhvTB5grkFRRG7Di3NJS3wpm +WmqGt/pjTPMuOxZtPm59ZMiX8iy8E5eaBjglwzpGT8+b2BfS8npvHtTsuysZqDQf +fBG1J6Bkfd/+2b6WTwBbpayxyKBgB+/9s1Z3k+2sYqFnFbK17jM6o/p1mcHFsVHh +ThlSjX+4j1nHIV/0vaD/a4TvGuOcnVZi1L7FtM2yrFBLvrWaIlSAmM2+VMniMvgG +IdzwDO8xpCgn2wBIpUle0t7XMZlXKai51JMiQI8hoDxLbMvnAzE4xmJ38hzV4qLQ +8gQmWOuJPEmcwUz5Ksv1jh9kW46Yb2hb2/TtkX+n1OsLsYtfsUtgUAbHkD9hTbSs +mozsUsgQoKQU9F11RqO1rX/R5YVagJsatRJxn773djsgAapD4HTGkk0a90eF0F2p +GqMyfMwcmQQGN1M5LrTOlIaGHadzQAbat3OCb/Pp/BB7R+BXTAKM2h++J4mqYqWK +dp/hhN/7VY4n8Y85d0cN77FTBWF4+x41zsUMqckYp48XApm45kO4rMgMXK4bKm7K +KZHp+/bC/9WB3HqD1UwaQbUCmJsrx8vr/iAD4Rx4cXni548N4ZBgvXUx07VGzLvt +42Qrs1kGfbSh4riwjQB+3EAy6csb2CVw+ubJUNuV/FuZhD2v4I4pX2KnKMBj3OVi +i36Szq91fgQv6I9o0V5yAKZ0er7LG+HORCxBVcF8ZYBWRNeC8ogQHD8+hiqBk5cj +BXu3MPoma33jKDRqms+MQ+AW1x1syGjFNADn4gItOedN1LB3K0cIbJKnWhrK/ayK +SOhvhHoqG0FoVM/hiX4lCUDpXVP7SxubxP1pH8ecRyahrKvilEo1X4k2ibfPFQqy +NpMoqXbf3BX0kkaL8aPAk2owr48Rs44E3fzMFe2c4cNT/6pqN6UBiwB6gp4vNpln +DfEgP7DHOcI1+WuvGFUQiUZWLUciv1QvYiDo/xAS6ASN5xHAG+yPWER0qoWlCcR0 +9iZmlixLRs5/d3CowMVjBY5lQQ3eu3aPUPR19koQet87pgFL5ZmhZMNV00/NQXrh +RRuPkV0j2lJFZ3YFdn1OXZya6U6J66n0RGJwlFrJT1lTsJUVAz5fYxhgblQ9/1HA +WP7Fi4ZGwnY3Md+vV4CxI98D/BosFPL12SBPqSL5dBqYDIVHfwGlYvUqYUbpnJqf +S4oISmUyXNUpJt8zUVLQlGGiUiNEozouL3mKjHt9OVtLjwYIkCmlBT6W99IX/ITX +8xh5il93PN6r0COjVo4ZEXocpaT8C7KntZU1NKU+e4pYLgWhJ7W5l9n4qdKGqzs4 +P3RV/y2A9sjVAWioNBArR+cjI4bSSS/atrR2haifE1peEuBZP5bY079yhWoqsrpk +B28Ngk7Bl+ktb/bT4bqf0Q== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/key_pass.txt b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/key_pass.txt new file mode 100644 index 00000000..76afcce7 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/keys/key_pass.txt @@ -0,0 +1,2 @@ +test +test \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/output.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted/output.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d291a4d838a9437108fce1bfe8b6f6a86d0ea72 GIT binary patch literal 23552 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 literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/config.bd b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/config.bd new file mode 100644 index 00000000..4c92c507 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/config.bd @@ -0,0 +1,88 @@ +options { + flags = 0x0c; + startAddress = 0x80001000; + ivtOffset = 0x400; + initialLoadSize = 0x1000; + DCDFilePath = "dcd_files\evkmimxrt1166_SDRAM_dcd.bin"; + entryPointAddress = 0x800041f5; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_CSF_INSTALL_SECRET_KEY; + SecretKey_Name="gen_hab_encrypt\evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin", + SecretKey_Length=256, + SecretKey_VerifyIndex=0, + SecretKey_TargetIndex=0) +{ +} + +section (SEC_CSF_DECRYPT_DATA; + Decrypt_Engine="ANY", + Decrypt_EngineConfiguration="0", + Decrypt_VerifyIndex=0, + Decrypt_MacBytes=16) +{ +} \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d7f75092 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419897 (0x12345679) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:42 2023 GMT + Not After : May 1 22:08:42 2033 GMT + Subject: CN=CSF1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:bb:3f:d1:a8:e4:c8:53:99:62:e9:83:ab:03:b8: + d1:20:f8:c1:ca:8a:91:a9:85:bc:c7:f1:6f:83:bd: + b3:3e:79:39:52:f5:64:0a:6a:a3:46:90:f5:fb:e7: + 84:80:e8:d5:a7:47:e9:8e:20:42:0c:5c:c4:90:03: + 60:c3:22:d5:96:9c:39:b2:41:36:fd:99:24:4d:52: + 77:63:39:b2:9d:a6:87:c2:60:a3:1a:79:c4:ab:17: + af:b6:88:a7:0a:27:78:2a:39:0b:33:38:24:6c:f8: + b2:6d:2a:50:33:3e:bd:3b:5f:b1:d7:84:43:a7:87: + 95:15:bd:7d:1a:6d:f3:43:df:a6:28:ad:5d:11:aa: + a4:a1:67:e0:70:3f:06:8e:f4:58:6e:45:92:fe:3b: + 66:71:b9:49:2b:74:12:20:2c:2c:1c:84:0d:fe:bc: + 76:a9:58:af:04:d6:2a:34:45:8a:25:04:fe:b9:0f: + 83:2f:76:5f:32:27:a1:29:ca:ac:b4:69:b4:11:75: + c2:4c:fc:13:a3:f0:b8:59:16:6a:5f:9c:99:6e:3b: + 01:c4:7c:da:ad:46:80:de:d6:68:0c:7c:6d:e1:92: + 96:73:01:ab:4b:51:3b:8c:17:6f:ea:ba:58:3c:d3: + dd:c5:29:64:59:70:25:26:24:48:79:cc:b9:a2:ba: + 73:9f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + C0:37:D2:B0:28:92:CD:2B:8C:29:E9:E0:30:19:29:C3:B5:8A:6E:E5 + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + 08:93:8f:bb:9c:0e:21:70:97:75:2e:c3:c3:f8:a2:95:2f:bf: + 67:35:67:68:7e:c5:ef:7d:b7:6f:fc:ca:61:b9:60:b5:18:9f: + 44:40:ef:01:d7:f6:9d:41:0c:9a:17:8f:d6:aa:ca:01:76:80: + 8f:b4:fd:ef:8a:8e:bb:7c:64:24:32:87:d5:03:e5:8b:1e:ed: + 31:51:48:10:7a:77:81:82:c7:37:ec:0c:b1:97:25:cb:0e:65: + c9:54:6e:90:99:db:06:10:d1:cc:c1:a5:0f:55:4c:53:0b:a4: + 59:ba:64:02:ee:e1:15:ff:34:94:fb:d7:1e:16:44:eb:3b:fc: + af:31:9d:62:d7:08:69:2f:20:50:f6:21:e7:8f:ff:f1:da:e6: + 82:da:36:bc:27:cc:a4:06:db:b1:40:a7:05:ce:7c:fd:21:ef: + 7d:c0:99:79:a4:cb:18:89:ae:bb:ff:e1:82:ad:be:fc:17:b0: + ce:91:8b:7b:9f:56:35:84:a9:48:d7:85:d8:f1:88:ad:49:66: + d8:07:a4:e6:df:d7:3c:bc:1b:19:a3:9e:d3:85:1c:40:48:36: + 74:97:27:5b:5f:7a:8d:e8:47:46:30:6f:4d:5f:27:c6:e1:de: + 1b:27:4a:3e:a6:f5:9d:a3:33:20:e4:60:4d:03:c1:a8:b0:eb: + bf:73:a4:35 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWeTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0MloXDTMz +MDUwMTIyMDg0MlowKjEoMCYGA1UEAxQfQ1NGMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALs/0ajkyFOZ +YumDqwO40SD4wcqKkamFvMfxb4O9sz55OVL1ZApqo0aQ9fvnhIDo1adH6Y4gQgxc +xJADYMMi1ZacObJBNv2ZJE1Sd2M5sp2mh8Jgoxp5xKsXr7aIpwoneCo5CzM4JGz4 +sm0qUDM+vTtfsdeEQ6eHlRW9fRpt80PfpiitXRGqpKFn4HA/Bo70WG5Fkv47ZnG5 +SSt0EiAsLByEDf68dqlYrwTWKjRFiiUE/rkPgy92XzInoSnKrLRptBF1wkz8E6Pw +uFkWal+cmW47AcR82q1GgN7WaAx8beGSlnMBq0tRO4wXb+q6WDzT3cUpZFlwJSYk +SHnMuaK6c58CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFMA30rAoks0rjCnp +4DAZKcO1im7lMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQAIk4+7nA4hcJd1LsPD+KKVL79nNWdofsXvfbdv/MphuWC1 +GJ9EQO8B1/adQQyaF4/WqsoBdoCPtP3vio67fGQkMofVA+WLHu0xUUgQeneBgsc3 +7AyxlyXLDmXJVG6QmdsGENHMwaUPVUxTC6RZumQC7uEV/zSU+9ceFkTrO/yvMZ1i +1whpLyBQ9iHnj//x2uaC2ja8J8ykBtuxQKcFznz9Ie99wJl5pMsYia67/+GCrb78 +F7DOkYt7n1Y1hKlI14XY8YitSWbYB6Tm39c8vBsZo57ThRxASDZ0lydbX3qN6EdG +MG9NXyfG4d4bJ0o+pvWdozMg5GBNA8GosOu/c6Q1 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..d487da3f --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419898 (0x1234567a) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 4 22:08:43 2023 GMT + Not After : May 1 22:08:43 2033 GMT + Subject: CN=IMG1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:ba:27:0e:03:0a:53:4f:cb:d3:04:6c:a9:b9:c5: + aa:38:13:b5:b4:c4:e5:9d:60:e3:68:8a:80:c2:d5: + b5:0b:b7:44:2d:82:f5:de:07:c9:f5:d6:05:52:1b: + 16:b7:92:52:83:e8:60:df:eb:bc:22:78:f9:66:73: + 24:26:09:b7:54:51:f0:ff:fa:7f:36:da:d6:21:1d: + ff:2e:eb:f3:94:16:65:97:94:4d:7f:8e:a6:98:93: + 6c:dc:c1:2e:92:8c:d8:de:95:7b:72:93:a7:e9:76: + 38:97:62:dd:1d:83:ff:61:21:db:16:c9:d4:22:aa: + 25:86:75:93:09:2c:3e:b7:f5:21:14:e4:a0:8e:53: + 1e:a3:9b:4c:d2:46:b1:92:9b:84:6c:73:99:d8:cb: + 6d:b6:f2:d5:51:d0:ee:b0:2e:79:48:07:6e:87:6c: + 47:0d:a2:7e:05:46:64:7f:18:16:bb:86:48:e5:84: + 16:c8:5f:15:b7:86:8f:ad:5d:70:59:64:0d:24:17: + c0:a9:4b:cd:08:3e:76:96:67:93:60:46:e3:12:96: + bf:87:7b:34:3b:e4:9c:09:75:1d:c8:67:97:9e:08: + bd:25:59:e3:6a:62:b2:16:62:49:d0:de:99:9c:c7: + 8f:40:9f:ac:fa:7e:ed:38:95:a5:d2:3b:7d:17:d0: + 6e:3d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 33:50:6A:02:FA:C4:D4:4A:0B:DE:0A:9E:45:2A:05:80:BE:FE:DC:CC + X509v3 Authority Key Identifier: + keyid:FE:1A:03:2C:B3:DB:C8:2F:6F:48:B1:BF:83:D2:26:A2:03:74:AD:0D + + Signature Algorithm: sha256WithRSAEncryption + a8:a6:13:36:28:a2:01:8f:16:58:48:2e:fd:59:86:bf:f0:94: + 90:17:98:a7:39:d8:df:74:a0:46:8d:61:e6:d1:45:60:84:5e: + a9:d0:1d:03:3d:a5:47:85:80:f9:86:a0:80:a6:bf:ce:80:f4: + bc:e7:2d:c3:bd:c6:ae:ef:fc:ae:90:e0:28:dd:b5:85:b7:9d: + 97:b0:93:d6:da:29:c0:21:0a:30:6e:6d:75:50:ff:05:5c:56: + 63:5e:17:aa:fc:56:8c:61:f1:e6:ba:10:d2:06:4a:49:5b:c0: + 78:37:c6:3c:08:6f:3d:f2:c5:2a:04:f6:d7:8a:9c:7f:80:dd: + 1a:29:60:09:97:85:41:d9:e6:c1:72:17:4c:08:48:f4:a0:96: + aa:7b:54:da:d4:91:fe:be:3d:8d:54:20:17:f8:b8:95:1d:cc: + cb:b4:c1:1a:2d:0a:5f:54:7e:db:90:ab:e3:cf:0e:00:00:30: + aa:00:3a:c5:b5:b5:f9:3e:de:0e:04:e6:f8:f0:d3:b5:5a:6a: + 8d:7c:7b:5d:37:da:4e:70:10:1f:eb:f1:93:f1:32:da:99:c1: + 38:fc:f0:52:8b:4c:51:cf:ad:e7:23:af:11:d7:e4:ac:f5:3f: + 18:b9:35:ae:20:d0:65:bc:d8:ad:34:87:f8:0b:93:02:db:a4: + 57:fc:c3:a9 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWejANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwNDIyMDg0M1oXDTMz +MDUwMTIyMDg0M1owKjEoMCYGA1UEAxQfSU1HMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALonDgMKU0/L +0wRsqbnFqjgTtbTE5Z1g42iKgMLVtQu3RC2C9d4HyfXWBVIbFreSUoPoYN/rvCJ4 ++WZzJCYJt1RR8P/6fzba1iEd/y7r85QWZZeUTX+OppiTbNzBLpKM2N6Ve3KTp+l2 +OJdi3R2D/2Eh2xbJ1CKqJYZ1kwksPrf1IRTkoI5THqObTNJGsZKbhGxzmdjLbbby +1VHQ7rAueUgHbodsRw2ifgVGZH8YFruGSOWEFshfFbeGj61dcFlkDSQXwKlLzQg+ +dpZnk2BG4xKWv4d7NDvknAl1Hchnl54IvSVZ42pishZiSdDemZzHj0CfrPp+7TiV +pdI7fRfQbj0CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDNQagL6xNRKC94K +nkUqBYC+/tzMMB8GA1UdIwQYMBaAFP4aAyyz28gvb0ixv4PSJqIDdK0NMA0GCSqG +SIb3DQEBCwUAA4IBAQCophM2KKIBjxZYSC79WYa/8JSQF5inOdjfdKBGjWHm0UVg +hF6p0B0DPaVHhYD5hqCApr/OgPS85y3Dvcau7/yukOAo3bWFt52XsJPW2inAIQow +bm11UP8FXFZjXheq/FaMYfHmuhDSBkpJW8B4N8Y8CG898sUqBPbXipx/gN0aKWAJ +l4VB2ebBchdMCEj0oJaqe1Ta1JH+vj2NVCAX+LiVHczLtMEaLQpfVH7bkKvjzw4A +ADCqADrFtbX5Pt4OBOb48NO1WmqNfHtdN9pOcBAf6/GT8TLamcE4/PBSi0xRz63n +I68R1+Ss9T8YuTWuINBlvNitNIf4C5MC26RX/MOp +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/dcd_files/evkmimxrt1166_SDRAM_dcd.bin b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/dcd_files/evkmimxrt1166_SDRAM_dcd.bin new file mode 100644 index 0000000000000000000000000000000000000000..78d9059b3d3b699cc6435bdfce277826043d1cd3 GIT binary patch literal 1288 zcma*kFH8bq7{~EfJ?F{fPaqI*LuX))z?48BoEw2)Fc6p{5DWx^!A*nV&i+-;@Q-i{Tp zL-M1*?Bf83IKnZ$ql**##3{~jjtl(4 zZ(QOE*ZAZ4BItX4G0?;V3}F}}7{wT#U>p;e#1y762-|_POmXZw^mfzCr z6;ZEiL$*?fqNP;uOw6i>(_=BGwtRl^^61Dg#hUafu`X^|-cJE|UL2fI$^m`^omrcA+8uijbAq0G zekx)cks5db*0zrBO-$6pVk77FqHkL9kKd=|b-r)iK*d^g6t4&%O;8JFqBX&WVusX@ z<)ax}5{v;%U}*V3G0Vn)GipSBwf!}>Ed{f*w6L%UsjaL!`Fq4Gs-p;qJM|#fVoc4x zC5IEC%ldYK#R1@%ugrZRJ=O;S00H3v4ShA zbRHnmntgQxr?y?#57**-$gzm9KXUb&D%kxmU|3|Qja(Wo)42Zh*)0Q~V1B$wuU*Mf zLnm$$g$o-OB)zL_jFf*?yqsNpzhtE{FO)Hu9t9V1olrV{oCRu&BX^&$nEjI(!QING zn@P1Dq=H{qnYU4A3$)HQ3Vz0lOAYQVf5flL{g(j%0pS4;ApigXfB^si1KYeeYAh{# z)B7q~=%o3WA9sgfDYCKSLE$tB$1JIMf&ZaOp3b4lCz`16KoR7~lKwys0J%`|zT@k| zZHmssnomfdF}41B#rZk!#ESZ3XZ{aLt$iVAmMXhf(9sh`rD-{=*Xm7?$6y-$ZMVNW z1bqQF39>NmWS>rnLfc^C>yUNIw3mitYXlyfU5MiTDgXf^-}ZGKwWKDi zQH>2_q>(qp_o-%pb->r|X>Qj13cxBkn_)bGrj88;B+Rz*K<4~vqZph^zA3n&`Xf8p znRz?&bEUn>(o@3$cIyh7^PVix+e}wCg!7M!Uie|88{~gp70)0MX@3W{*gi0K<_C2l G0RREs`w5f) literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..c83f375b --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIdi/0V8NCoksCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECL8tgUuPznT5BIIEyHhGq4g/Npl8 +ZgZxxq1VjEjLNNHS/Ou0bv2/suXnYPyDTNkCYl/bnCbXIVjFfMwdP1WIDE2tOTW3 +0OGQubJUVj+Be5o4RxKVhGnbiW4ZZVtCmhnA4EFU4oaRYndq8NRPRH5l8SMiPgG8 +6CPvnc9IV1TM6BKPPgRgvW99zQkox3ulSIZjdy7dEMHJav0WNzo8R8e+614WxoiA +/gXCXa6FUlIJNGJujYS+MPcggbMS0QTTFhNeofcYzNNAsmBwjRyq96c11Dx9mpct +PinQN3Et1XP84A30McZOFrKKC/kinvGzpoouGAMNGXbLrwHMpG1Sb3H+OO/ZQEDr +n5rFDCFGVwmQ9dhPvlpy0IzfA6cLlpu0UU1pgn81YChhOtnAVi4VjUCpdUxdngQU ++1Q1EfeZeERI1iofjwR7X+uSYaB9FN5wQiwNfgu03Oobl2ghSJtDtuTkLlG/sRtx +cU0qTvLkWttEBxc+5FDrARBAfObRgq4sYr/fjwFaqHz+faJ8FJYzoj2nkY5OCBKY +DjuNT42Qet3qhbkUsu2YE61TS8vVlD8ycxKSg+egg9dNMlNoMGTrSVtIn29EeR2j +9sjhC5TjPJTHsG5guYLRzNgnElOPhmsMAD/zr3psRMxafmFgR/RTSy/C45sMEEjN +6YfZhXKqcO3FHa7vJqSo1fGaTvBq92jwYgl/HMyzdDPIiRte5OBh35O/v03yE3Ms +TFVEz2eDZFgG4nNMRwaR5V7V50jgypBFZzpOHihukPQ9JcarCd0T6+TsAmbmcYJk +LzWpKYpd36FBKVJUTnl69bF87+L6CA41EVqfavxyuC3wFxg0Glus8zPHRJL5tUdw +b2JUWzMrkP6mW9uoTX8MTrlTW4zrIn+Qht9x7IhV+s4nIAp4irDjBDu+fI0OenAa +B5HfKQ4WlcZRxw1EITSkD80XIbshF/WD6NRSFlIHUQdvqBmHNAVti0x4TQwRr96X +zQlXsQ+4qW6502E3wtc9Z29z+h4ed5Ia9IsmCKTuJ41YtSZnXRwGYnI/TjN+LG4s +Gpk2H5Qeknk5MDCv0rKSv5kRNqqOeIjZa0GCKZ4a3OHnRdGy5zLAneyuflI3OHN5 +RaH6Zstynku+dWcOUJY4V0bonccOYok11HyAWTUliznPV2wMWmpLvapRFwn7JEvc +XBZUWSXaSC7zQvT+2/S49+5J8SofX4gw1h+NbnogfOl+3ejZgj/VCHgEirfte3yI +oNOh6N5zLc07UkOG8qC9um0j4JEGvRrZ93rEcgWFsg9rI6HumxHpjYRaaDYGlILz +dgxTR427b9IaWEdMW7bSvcb87yOrMkW4yqxmKv9Q4p7ucRxxBeB0hqA4VoVA9pxt ++lPVnCFPBI6d7dhVM9VsinePfpeY2Xsk8zkSvzx89S+2Taw2tONYodKnv893TnrF +BYR8sHK3eDsZm5h+LJzjAq7WT4eHjjta2LDoJXWSidscAQtU+GsWK+p9IGpNqGbK +FKRNqH1mYogoJX3qGxphVWyL9ZL5HmO9wM3vf+NvR35LDBZDqCHLps9OOUIPQ7PX +b6IlB0eroQMruBnesvTGsYNGdDQ/PpMpwguKZ34cA2b9AU8FoVkz21uApO5P5fEl +z8ol2l8j0h2EPJYnHaXXAQ== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..b00a4e58 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIvXzlrAaQI2gCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECI+FLYDFYwyOBIIEyGURKoTjjTBI +IQGK0cSJiq2zH7+KgxBZyLQtbYOICQQvaebsZ3E83gOrnvIaA5APTiBEfL3vIWTU +LyfLbhSjoOoOLdybYgbvId7xWL6Ym8joJaOL1AX3W9Yhne3lNW4ZRbjbrjDdZ20b +fD0n5RfYWe2sJfpHxoYUZjxb/8qLer87EDe7XF1H/XuPnFZKWgGqARMHwD5RYaep +CmBR+MY4l2vtpTIFxJyPOHkgn3M7t8l4B/0g5HGaLhvTB5grkFRRG7Di3NJS3wpm +WmqGt/pjTPMuOxZtPm59ZMiX8iy8E5eaBjglwzpGT8+b2BfS8npvHtTsuysZqDQf +fBG1J6Bkfd/+2b6WTwBbpayxyKBgB+/9s1Z3k+2sYqFnFbK17jM6o/p1mcHFsVHh +ThlSjX+4j1nHIV/0vaD/a4TvGuOcnVZi1L7FtM2yrFBLvrWaIlSAmM2+VMniMvgG +IdzwDO8xpCgn2wBIpUle0t7XMZlXKai51JMiQI8hoDxLbMvnAzE4xmJ38hzV4qLQ +8gQmWOuJPEmcwUz5Ksv1jh9kW46Yb2hb2/TtkX+n1OsLsYtfsUtgUAbHkD9hTbSs +mozsUsgQoKQU9F11RqO1rX/R5YVagJsatRJxn773djsgAapD4HTGkk0a90eF0F2p +GqMyfMwcmQQGN1M5LrTOlIaGHadzQAbat3OCb/Pp/BB7R+BXTAKM2h++J4mqYqWK +dp/hhN/7VY4n8Y85d0cN77FTBWF4+x41zsUMqckYp48XApm45kO4rMgMXK4bKm7K +KZHp+/bC/9WB3HqD1UwaQbUCmJsrx8vr/iAD4Rx4cXni548N4ZBgvXUx07VGzLvt +42Qrs1kGfbSh4riwjQB+3EAy6csb2CVw+ubJUNuV/FuZhD2v4I4pX2KnKMBj3OVi +i36Szq91fgQv6I9o0V5yAKZ0er7LG+HORCxBVcF8ZYBWRNeC8ogQHD8+hiqBk5cj +BXu3MPoma33jKDRqms+MQ+AW1x1syGjFNADn4gItOedN1LB3K0cIbJKnWhrK/ayK +SOhvhHoqG0FoVM/hiX4lCUDpXVP7SxubxP1pH8ecRyahrKvilEo1X4k2ibfPFQqy +NpMoqXbf3BX0kkaL8aPAk2owr48Rs44E3fzMFe2c4cNT/6pqN6UBiwB6gp4vNpln +DfEgP7DHOcI1+WuvGFUQiUZWLUciv1QvYiDo/xAS6ASN5xHAG+yPWER0qoWlCcR0 +9iZmlixLRs5/d3CowMVjBY5lQQ3eu3aPUPR19koQet87pgFL5ZmhZMNV00/NQXrh +RRuPkV0j2lJFZ3YFdn1OXZya6U6J66n0RGJwlFrJT1lTsJUVAz5fYxhgblQ9/1HA +WP7Fi4ZGwnY3Md+vV4CxI98D/BosFPL12SBPqSL5dBqYDIVHfwGlYvUqYUbpnJqf +S4oISmUyXNUpJt8zUVLQlGGiUiNEozouL3mKjHt9OVtLjwYIkCmlBT6W99IX/ITX +8xh5il93PN6r0COjVo4ZEXocpaT8C7KntZU1NKU+e4pYLgWhJ7W5l9n4qdKGqzs4 +P3RV/y2A9sjVAWioNBArR+cjI4bSSS/atrR2haifE1peEuBZP5bY079yhWoqsrpk +B28Ngk7Bl+ktb/bT4bqf0Q== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/key_pass.txt b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/key_pass.txt new file mode 100644 index 00000000..76afcce7 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1165_semcnand_encrypted_random/keys/key_pass.txt @@ -0,0 +1,2 @@ +test +test \ No newline at end of file diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bd b/tests/nxpimage/data/hab/export/rt1170_QSPI_flash_unsigned/config.bd similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bd rename to tests/nxpimage/data/hab/export/rt1170_QSPI_flash_unsigned/config.bd diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19 b/tests/nxpimage/data/hab/export/rt1170_QSPI_flash_unsigned/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19 similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19 rename to tests/nxpimage/data/hab/export/rt1170_QSPI_flash_unsigned/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19 diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bin b/tests/nxpimage/data/hab/export/rt1170_QSPI_flash_unsigned/output.bin similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bin rename to tests/nxpimage/data/hab/export/rt1170_QSPI_flash_unsigned/output.bin diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/config.bd b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/config.bd new file mode 100644 index 00000000..243fecfa --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/config.bd @@ -0,0 +1,86 @@ +options { + flags = 0x08; + startAddress = 0x1000; + ivtOffset = 0x1000; + initialLoadSize = 0x2000; + entryPointAddress = 0x34e1; + signatureTimestamp = "04/05/2023 11:27:43"; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_SET_ENGINE; + SetEngine_HashAlgorithm = "sha256", + SetEngine_Engine = "ANY", + SetEngine_EngineConfiguration = "0") +{ +} + +section (SEC_UNLOCK; + Unlock_Engine = "SNVS", + Unlock_Features = "ZMK WRITE" + ) +{ +} \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..ebd7d26f --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419897 (0x12345679) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 3 13:47:09 2023 GMT + Not After : Apr 30 13:47:09 2033 GMT + Subject: CN=CSF1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:c6:59:48:8e:f3:b6:1d:f3:84:21:01:51:cf:07: + 1e:3b:b0:10:f0:82:5a:84:3e:e8:1a:83:67:f5:ba: + 1b:21:db:44:b7:24:f8:3c:51:79:22:37:d2:46:ae: + 65:d7:b6:6d:57:a1:65:d3:31:62:08:2f:59:27:bd: + ad:bc:20:5c:0f:d8:43:68:f9:5a:b3:cf:74:63:95: + be:23:71:11:7f:95:83:cd:32:d3:d7:b9:1d:a9:7e: + a9:26:18:3e:7b:e4:2d:8d:27:0c:84:e5:61:e7:04: + 6d:54:2c:91:e6:54:73:4c:72:32:6c:6c:68:93:32: + b9:2c:4b:a5:34:3f:ce:aa:39:2a:81:a2:2b:4b:91: + d8:cc:a8:77:a2:11:93:89:50:4d:d2:a3:44:a7:d7: + 72:83:61:f2:69:28:99:1f:5a:c8:46:37:9e:21:e7: + 91:6c:9d:c2:4f:11:94:ed:98:98:9e:d1:09:83:2c: + c2:89:8c:76:56:df:ec:c0:fb:77:11:4e:1b:bd:44: + 01:9f:f1:b4:a4:c5:df:a6:58:74:6c:e7:61:3e:72: + bd:13:a6:13:ee:fa:c9:0e:f2:b2:dc:75:af:b4:4f: + 18:f3:4b:98:44:4d:d9:b9:6a:02:a5:9d:6f:fe:22: + 0e:bb:f5:a0:6d:1b:bd:7f:b7:51:8a:e3:aa:71:bd: + 70:f1 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 69:08:0E:2B:64:A0:DA:FB:8B:91:0E:65:70:26:6F:4A:FA:55:33:90 + X509v3 Authority Key Identifier: + keyid:7A:9A:77:78:43:D7:D8:A3:4D:B9:EB:63:B2:48:E1:4D:C4:32:65:FB + + Signature Algorithm: sha256WithRSAEncryption + 54:83:0b:69:8f:a9:c2:cb:6b:4f:42:e6:ab:7c:d4:7e:ea:4c: + 26:e9:6a:86:a0:7d:5e:6c:04:98:a9:31:ee:f9:00:1a:aa:e7: + e5:83:39:6d:43:92:13:87:b8:4e:f8:f3:e2:f0:1d:17:76:3c: + a1:0c:5e:93:ad:18:c9:a0:dd:64:61:f5:71:d5:27:be:9a:62: + 41:f8:31:8c:b4:bc:3b:ce:d4:ad:0f:97:4e:ee:ad:7e:c7:a5: + 01:76:8a:7c:a8:22:29:b7:ba:d6:90:c3:fd:8f:0b:05:3b:1c: + f9:30:e2:7e:b2:1f:90:8a:83:a7:2a:6e:37:d6:0b:56:00:a6: + a3:3e:0b:71:23:03:47:93:a8:32:37:1e:be:b5:d8:b0:60:07: + 66:d4:b1:c5:8b:db:8f:83:b1:81:f7:bb:d1:fd:cb:94:ed:10: + 2f:9a:22:e6:69:f6:de:9c:09:d5:30:bf:3b:6a:43:42:51:90: + 19:24:4e:2f:54:b6:ab:c0:5a:bd:b8:4e:9f:c2:3a:f5:8e:07: + fd:dc:99:a8:b7:65:7c:46:86:94:11:2b:70:ba:da:90:d3:fa: + 60:a9:8b:6e:81:c6:45:4d:04:4c:92:2c:56:a9:09:4e:79:4b: + 3f:7a:ed:93:e4:45:16:09:52:3a:49:18:e5:4e:6d:86:13:03: + 78:4b:e4:06 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWeTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwMzEzNDcwOVoXDTMz +MDQzMDEzNDcwOVowKjEoMCYGA1UEAxQfQ1NGMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZZSI7zth3z +hCEBUc8HHjuwEPCCWoQ+6BqDZ/W6GyHbRLck+DxReSI30kauZde2bVehZdMxYggv +WSe9rbwgXA/YQ2j5WrPPdGOVviNxEX+Vg80y09e5Hal+qSYYPnvkLY0nDITlYecE +bVQskeZUc0xyMmxsaJMyuSxLpTQ/zqo5KoGiK0uR2Myod6IRk4lQTdKjRKfXcoNh +8mkomR9ayEY3niHnkWydwk8RlO2YmJ7RCYMswomMdlbf7MD7dxFOG71EAZ/xtKTF +36ZYdGznYT5yvROmE+76yQ7ystx1r7RPGPNLmERN2blqAqWdb/4iDrv1oG0bvX+3 +UYrjqnG9cPECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFGkIDitkoNr7i5EO +ZXAmb0r6VTOQMB8GA1UdIwQYMBaAFHqad3hD19ijTbnrY7JI4U3EMmX7MA0GCSqG +SIb3DQEBCwUAA4IBAQBUgwtpj6nCy2tPQuarfNR+6kwm6WqGoH1ebASYqTHu+QAa +quflgzltQ5ITh7hO+PPi8B0XdjyhDF6TrRjJoN1kYfVx1Se+mmJB+DGMtLw7ztSt +D5dO7q1+x6UBdop8qCIpt7rWkMP9jwsFOxz5MOJ+sh+QioOnKm431gtWAKajPgtx +IwNHk6gyNx6+tdiwYAdm1LHFi9uPg7GB97vR/cuU7RAvmiLmafbenAnVML87akNC +UZAZJE4vVLarwFq9uE6fwjr1jgf93Jmot2V8RoaUEStwutqQ0/pgqYtugcZFTQRM +kixWqQlOeUs/eu2T5EUWCVI6SRjlTm2GEwN4S+QG +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..504c937d --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419898 (0x1234567a) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: May 3 13:47:10 2023 GMT + Not After : Apr 30 13:47:10 2033 GMT + Subject: CN=IMG1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:b6:7c:dd:9a:c6:1b:c4:d5:19:07:fa:ef:47:39: + 9e:a1:c8:ff:eb:b5:48:5e:a4:51:c2:f2:f6:76:68: + c7:d9:06:81:ac:1f:23:8e:64:aa:cf:bc:4d:18:2b: + 82:f8:9a:ea:49:fc:c1:3a:25:9f:5a:a6:f7:c8:60: + 4b:a7:4e:a1:ca:c5:35:60:3f:e4:c1:f1:45:64:ba: + d6:15:f3:59:6c:4d:45:57:06:37:e7:dc:36:37:ed: + ae:f2:c3:f5:24:26:49:77:72:04:b7:0c:dc:a6:2a: + 91:9d:98:f7:0e:8c:60:ae:bf:cf:75:0b:87:0b:c5: + db:e5:97:8e:b9:24:7d:35:09:b6:f8:2c:d5:37:e0: + ed:50:b1:45:96:4e:82:4c:d6:74:37:d6:bb:3f:5b: + 97:86:6f:b1:d1:a3:f0:f7:62:f9:08:27:a4:a1:6d: + 1c:ca:89:90:72:b9:eb:ef:65:49:fe:b3:86:41:fc: + ca:68:b3:12:fa:42:63:82:5a:34:98:de:0c:c6:50: + f7:3a:c2:6b:f7:fd:8c:c1:9f:7f:88:e1:68:08:9b: + f0:55:2e:e3:87:90:15:59:9b:f0:ca:17:2a:c7:bc: + b1:05:e7:8e:55:07:de:64:60:4f:98:28:56:5c:89: + e3:f0:65:03:d8:07:0e:e4:22:d7:c6:29:9a:45:b7: + f1:ff + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 49:65:20:FA:A0:B3:52:35:9E:5D:B5:A0:67:A7:CF:49:A9:1D:59:7E + X509v3 Authority Key Identifier: + keyid:7A:9A:77:78:43:D7:D8:A3:4D:B9:EB:63:B2:48:E1:4D:C4:32:65:FB + + Signature Algorithm: sha256WithRSAEncryption + 28:4e:bc:05:4f:a8:f1:3c:f3:c4:66:8f:5f:65:30:18:b8:4c: + 43:36:d2:1d:9b:4a:cb:23:0c:69:2f:57:10:5d:9b:fa:8b:73: + cc:a7:11:da:3d:30:41:82:3a:0b:9d:6e:04:1a:e6:b8:9d:3f: + f4:47:e0:7f:f3:5d:8c:17:da:18:6e:4e:ae:e4:12:8d:03:6d: + 83:c4:0f:cf:aa:ea:da:fc:12:ee:60:51:63:78:e8:00:f7:cb: + ee:cd:b2:2a:3f:e3:53:ea:db:ea:c8:3f:6a:53:22:be:ac:5a: + 72:03:27:cd:72:63:01:31:6c:8c:57:4b:a4:69:7e:94:ee:fa: + 19:91:9f:58:54:a0:61:dc:db:64:60:47:0d:cf:4e:32:40:7e: + 28:4d:5d:68:c4:7d:78:ae:1b:07:b0:71:11:0c:0e:76:2a:d3: + c4:0c:6b:c6:1a:13:4c:ae:7f:21:4b:fd:17:28:35:8a:8c:21: + c1:fc:22:c2:e8:87:ab:ae:85:5e:fb:26:39:fb:81:d7:75:af: + 95:aa:ff:12:c9:cd:12:ab:f7:8a:6a:ab:f1:39:81:38:52:12: + c4:94:c9:3c:63:67:48:ec:34:b1:f4:1f:15:b2:5a:0f:93:c1: + cb:04:df:aa:d8:b6:1e:08:25:e8:33:b9:62:c3:d7:1e:57:7a: + 8c:23:93:20 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWejANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDUwMzEzNDcxMFoXDTMz +MDQzMDEzNDcxMFowKjEoMCYGA1UEAxQfSU1HMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALZ83ZrGG8TV +GQf670c5nqHI/+u1SF6kUcLy9nZox9kGgawfI45kqs+8TRgrgvia6kn8wToln1qm +98hgS6dOocrFNWA/5MHxRWS61hXzWWxNRVcGN+fcNjftrvLD9SQmSXdyBLcM3KYq +kZ2Y9w6MYK6/z3ULhwvF2+WXjrkkfTUJtvgs1Tfg7VCxRZZOgkzWdDfWuz9bl4Zv +sdGj8Pdi+QgnpKFtHMqJkHK56+9lSf6zhkH8ymizEvpCY4JaNJjeDMZQ9zrCa/f9 +jMGff4jhaAib8FUu44eQFVmb8MoXKse8sQXnjlUH3mRgT5goVlyJ4/BlA9gHDuQi +18YpmkW38f8CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFEllIPqgs1I1nl21 +oGenz0mpHVl+MB8GA1UdIwQYMBaAFHqad3hD19ijTbnrY7JI4U3EMmX7MA0GCSqG +SIb3DQEBCwUAA4IBAQAoTrwFT6jxPPPEZo9fZTAYuExDNtIdm0rLIwxpL1cQXZv6 +i3PMpxHaPTBBgjoLnW4EGua4nT/0R+B/812MF9oYbk6u5BKNA22DxA/Pqura/BLu +YFFjeOgA98vuzbIqP+NT6tvqyD9qUyK+rFpyAyfNcmMBMWyMV0ukaX6U7voZkZ9Y +VKBh3NtkYEcNz04yQH4oTV1oxH14rhsHsHERDA52KtPEDGvGGhNMrn8hS/0XKDWK +jCHB/CLC6IerroVe+yY5+4HXda+Vqv8Syc0Sq/eKaqvxOYE4UhLElMk8Y2dI7DSx +9B8VsloPk8HLBN+q2LYeCCXoM7liw9ceV3qMI5Mg +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19 b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/evkmimxrt1170_iled_blinky_cm7_int_RAM.s19 similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19 rename to tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/evkmimxrt1170_iled_blinky_cm7_int_RAM.s19 diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/gen_hab_certs/SRK_hash.bin b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/gen_hab_certs/SRK_hash.bin new file mode 100644 index 0000000000000000000000000000000000000000..c6ffcbb5aa59470e19ef56e87f7febd28701aaea GIT binary patch literal 1088 zcmV-G1i$;&1VBLH0S_Sn004ji000BPog%eCtxO-`ORsA}h3*E{oX{{?VBn-^6u5vX zP?hGt`O=^g`xWU%&nyQBt}iFORWv#saHEaNi(Jt1AgFk(((QJe0vqTBPoN!&*Qh-T zjf?EktuErvj6LjL3~>Baz&tv&>tFp@yOW&b^=Ku-tCA+p zXWTC}?_J$>o|~gr+r!1wfMS*E8y} zYO>qoM0f6PgCo=yur2toAWLQe7gbA_WVE8O7i3A(V0j z{hrN2q+5M-c21Nlk#=MsVhe41#((oog@w52EW4<#bLd)lu9x{;=$^x+%nKEP{E|C! zdDC-szJ13ZCJiSMdcQexixt|9Y5D(f4G<-YiML>Vi-+=?{ie8* z@*=8Qnl3qC1KC?RX6#w*xGaE26U~(nIjGx7DJua00pS4;ApigXfB^si1G`%!4Jetu zaooc5AYGv0)E6Zu}ptKJt)AEG8A$@!}BU-Ou3{0c$YqS*WHYk>y_`} zWm3CcB7aZ}(myH^CIcI*4X$TrFm5;zwTz$*$U9HrdQ~#WYV$BiqE5$E3rZdI5d85^y2`m#gb_X9 zk6O7oSKozc#RwTMWC6gKop)?`&aI9t$SWwnA`A)oUA#L(JC0jT(~R^OM=NDIBXWwh z>o2N%tIF$86&m#cM|VgTO?T0USf(fb_Et?9oBM@Lg+LHWdsF9y0|5X5;Q???dpO~ce7zYaflL}Q{-uAU*Cy#O*dFOtAqi)QlJ0H&Z+!9#AJHP7X)o% z593~d+Olj|EMp{0D&TPlY05B)EJCWL*^7}1970Bo0ET7bI8JrXHoWkXTa5=>3o#91u3uZ*L|aD* G0RRDn6!|s) literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..c132e5b4 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/CSF1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIaK0J7KU6wdcCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECA0a4WBjEa3EBIIEyHQ1CzwJ7C33 +MbQ6BKQKOpaV6r7ueolqVacGPANO6gEuDFNdwSGlgr12q+NLvkszirAz4r2raAZM +vd09H/hvkMSxJ0D9Wf7L82oLYqh0l42f6cOjFSunKnfLkVhKFim7KR5mwTEuT4O/ +Qd/A0zJX2K3Ig8Mhcy09NuhGVIOah0TA4TCD2TSwp5qyS3s39eFr2sOJUSHwRmav +40wFpfO/yHEFMIyvDHB9hi4Aqt1EcRKhOPqiV+Ji/qwYnqKJtv4TTW5bj0Qx9arf +llXGuSETb3Po+w7GbmfqG8UMNAlu2+hNDHhDWJchjxWDjw+8c/FLxWmuJumkcIZK +Fc9fbqFiltp5Q4IKodp2kVhlTFg6nR/beqfvHl1mpbE9WJxLq0hF2J9DhxOKnMha +MNzQa2+PEFgq0Pnw5QBO3Hk6ehvYCHHPTzrwW1MYADY52e1jd76lMssspp7ZkFRM +tJqt44EvqcpOg3/khIYe93K6y/LQu78b7UY8r09ARKH5+l+WJGcGFQnQDQKz3wNb +ge55VVRW9k7mMjNAlLMjx8eDwvBy7a+0J+btVhRS115puEtfoNFWll1ZwHnWgwW7 +ue5xOWzn0ngbM4GuAqRDc36PHvI+zqTK7B5a8tzOD58xIb+2VQpT+k1DPNFoHcoF +z0Iij0BB0yAnAWcRX2VPmuA5J+6nkQh6gZc69+0JubkNZnw3AK5M34gpZh0apJzi +BmfA5D5yN/ITkd0twmZT+rJpv8KSukW6jH1YTD7JteOx/YeqCjEE9ziprCQqQHsE +pzOEfuabkqcAAcMSEy0j3yesV3vSuETdH7dkmHTD1ZMpzdRUl+86iOSPBM4JSBYf +Ig6ymoPghJo6kJE+AWN0T0/VvEE/a4CfTE+zwymJGFLMVR1+IFLJwsbrTFdcQH5t +rh//GssEH9sref29hGJigbR55qVwsx/KoVKaCw4uEB7HczJt0XRDc3QwOWs/U+xU +/EKXAReTa5fWs/bdtCDcBsTfwcQVrGi7yEKLbj77IkODEoBfclugKNT3Qc/lP+NB +/xNrU3PhD9tftCE4B+RCoTDPYJLQQEjRlQvY2u6vA3L3nVkhnytGMoyCmdS+EVKm +DlzAyMguFXsVUJLNnLQD2rzHt6+BB2B4pOEiZnNZ4sJRijhrrEzg8fHp6woFI4RW +COWKCkNRRaGl4WDd/KTBZXsP8bsENbVLdxpzl5zI+Om6Yvdl0sN3mpuupidcgbky +ppVMqKqF3EsC8ORD9YZ1Zu6B0/EouxQLHjAkj0LEFmE0+QrwuB7zaB4cK53D+KXp +ua6iAbsB7PIZSmBMSHq2yuIbLia+0wa9SgCwVcdX1tZdJTZNoX8Tdttjm3x1rqOJ +Nx7vLNcYfITizUDfmbhP9976kmkGr46Dt7DAEDnOYn2hC4yBZNbpWIWKaqr4sso8 +lApCf5C6Cq4ESsYMV+QCcU8PeeobGKi51okRLff+nLyoJ0e3KNyu66F9Hklzornx +ZuuNB0aoBz59sMUnrR+LoBWO5l0u9S9y/hHah/NDN32Zh9npkhTclTjM7xhgVVcR +EEv+eKosqMlmG4EDcWwSsAAgX1ZWEx/w7vZN6sdFq+DMDIdxTaQkfq7C9Vj71THn +ShqZ5YJK954jAC3i82mFRg== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem new file mode 100644 index 00000000..148fbbea --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/IMG1_1_sha256_2048_65537_v3_usr_key.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQI+/Ke5cMAJIUCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECO/q3WZJPBkNBIIEyN4AZBjBrNG7 +DMaWshjMRKKBBDrdBcEdS0aL+ERl/y2S344mViMgkmxGEWJhUAazTGcnfykIH1Lb +hpOTYSndoWZH9R9jd1G8ia7l6v+whP5+In+10hOZKynZozoGShAEizR5v7KzexuJ +Q1SQh/Qyzh5k9XGHWodRiiPabYIgITia1uf1hDnziDhZhPTZH4cYbUOR7mHyp7G8 +nli7UjTzqrDxkjxU3tn4tgCm+FwCAgVoRHK7poju3BCGB6S80JuD07qk2WcUhz4k +qsGg/zq6pKDc49Lqcr62Fs0vov2SS2+MSX5vfDYORvZIbsXOKhfJWC6lN1w3OmfZ +So3sJOcRm6uV0MjzOj5Gl1MoWnjuUBYSmil952UHbswgrhZ+OeGdy6om2ow3YTAz +HGdcyiU6HnM0HLuMb63lpeeISs4wqOS0WEHB3/lUhSSWU6T0ZYxJq04plnihibiN +3mYTo4SPUwkPCiJMN75fGspVZr7Hdi7Jx+IJtWNVxcPEkQdqp7UdfuMFroA2SwsU +dbiI9sSCVYhEaSsIuxtPgcLiYaQ3/Gg2sU2Vw6Et4UfLPdh36GCmsn676fFfFnoZ +TiNU8w2W+zNqNfeDq8fiM+9DsWQjyOXarnC54jAPiQuR5VLFq/okJPuy/haivFLK +l19PtHym/6bUdqZ0wlU4EcGwZZFVXdvanwIwfW5NyrmnN9eWstlKFv70wCuTEn1B +DcINL9C7OjTEuVVAu990eRWisgEHd+uJeMtKXFg4cnxUaC3jBkQDsJnKG6IfnR94 ++2Prla0Xw61RbH5bJB89FC+p2/eH0d2/BanL3wn1ifWxKbEDlvpJH8zegXYfikpt +AXplKN3NWsq48+qSUc698H6Q5AySK3t+7giGHpqPi80p2CHIQErdOGOuFG/Kb4X5 +Haai2XDbM0VS0EsZDZwfmhPJmIkZgl0MIGurcHH3RieGN0KgTMIi2rYI/Ka0aXfr +ttQTUVbp+6k0yY5HuYCd/ep5/SqQRIAk6FpSOeB8EBErvba6jYKTTlayLip435DF +GL8CJhq85iLdykf6/92CbUBy0ubp4S2SNIRuS7CX/WET0IOsHVHdPbj09ZiSiX7r +hqgITob30EiXFSxL2mD+SecGWA7u/vNskl913xjABE4kqyDSBQCIZflq4Rv7Z98z +Aqz9LoICLsIFE2XhA6SKkx5opiqohjcKT6wmB+Bmo8mpqv7lRHzZZi/LhDwiCTDY +kzrEBokVlAFbbhwwuKp/MaWJRp0tX5nz6xeM0Y9Rjwd/G6lY3yAGrTFuX/miIS4p +rcDu+gkAlqIeTfQI7RitcXCjrzDL0m3nN7dNPmFgh1tP46pVewngFMh0dil6zw1U +tIsdfC5MVigEMZU0QYwMTatwg8xdhlcXIRjXVFzAkSu8HiMNIOmyYYC11mMMD2G2 +f24HjhWziYjt3Oosi7B9uGYdeD8N0H2NwXGnoyTrIaDEeP4qE65iOxnWUvEecplK +rOvrlnuxNZiVrKyXa/KMrNzgsquq1ta8DDGg/a7U3HL7qeudevtpK9fdHfwxaWjb +IVedRNGyAnQXBH0JQQkoakhTxbCerSXTR5miUtU71rmmqQeJYKO+sQrMGcdYWsJq +mzg332O3ckX/EfroUn8EQg== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/key_pass.txt b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/key_pass.txt new file mode 100644 index 00000000..76afcce7 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/keys/key_pass.txt @@ -0,0 +1,2 @@ +test +test \ No newline at end of file diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/output.bin b/tests/nxpimage/data/hab/export/rt1170_RAM_authenticated/output.bin new file mode 100644 index 0000000000000000000000000000000000000000..5c7bd1f7755982a471a007acee7831f2cd7995ca GIT binary patch literal 36864 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bd b/tests/nxpimage/data/hab/export/rt1170_RAM_non_xip_unsigned/config.bd similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bd rename to tests/nxpimage/data/hab/export/rt1170_RAM_non_xip_unsigned/config.bd diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 b/tests/nxpimage/data/hab/export/rt1170_RAM_non_xip_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19 similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 rename to tests/nxpimage/data/hab/export/rt1170_RAM_non_xip_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19 diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bin b/tests/nxpimage/data/hab/export/rt1170_RAM_non_xip_unsigned/output.bin similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bin rename to tests/nxpimage/data/hab/export/rt1170_RAM_non_xip_unsigned/output.bin diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bd b/tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/config.bd similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bd rename to tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/config.bd diff --git a/tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 b/tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 new file mode 100644 index 00000000..e814cad6 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19 @@ -0,0 +1,1418 @@ +S02B000065766B6D696D787274313137305F696C65645F626C696E6B795F636D375F696E745F52414D2E73311E +S113300000000400E13400002D3500000F6F0000C3 +S11330103135000033350000353500000000000074 +S11330200000000000000000000000003735000030 +S113303039350000000000003B350000A9380000CD +S11330403F680000476800004F68000057680000B0 +S11330505F680000676800006F6800007768000020 +S11330607F680000876800008F6800009768000090 +S11330709F680000A7680000AF680000B768000000 +S1133080BF680000C7680000CF680000D768000070 +S1133090DF680000E7680000EF680000F7680000E0 +S11330A0FF680000076900000F690000176900004D +S11330B01F690000276900002F69000037690000BC +S11330C03F690000476900004F690000576900002C +S11330D05F690000676900006F690000776900009C +S11330E07F690000876900008F690000976900000C +S11330F09F690000A7690000AF690000B76900007C +S1133100BF690000C7690000CF690000D7690000EB +S1133110DF690000E7690000EF690000F76900005B +S1133120FF690000076A00000F6A0000176A0000C8 +S11331301F6A0000276A00002F6A0000376A000037 +S11331403F6A0000476A00004F6A0000576A0000A7 +S11331505F6A0000676A00006F6A0000776A000017 +S11331607F6A0000876A00008F6A0000976A000087 +S11331709F6A0000A76A0000AF6A0000B76A0000F7 +S1133180BF6A0000C76A0000CF6A0000D76A000067 +S1133190DF6A0000E76A0000EF6A0000F76A0000D7 +S11331A0FF6A0000076B00000F6B0000176B000044 +S11331B01F6B0000276B00002F6B0000376B0000B3 +S11331C03F6B0000476B00004F6B0000576B000023 +S11331D05F6B0000676B00006F6B0000776B000093 +S11331E07F6B0000876B00008F6B0000976B000003 +S11331F09F6B0000A76B0000AF6B0000B76B000073 +S1133200BF6B0000C76B0000CF6B0000D76B0000E2 +S1133210DF6B0000E76B0000EF6B0000F76B000052 +S1133220FF6B0000076C00000F6C0000176C0000BF +S11332301F6C0000276C00002F6C0000376C00002E +S11332403F6C0000476C00004F6C0000576C00009E +S11332505F6C0000676C00006F6C0000776C00000E +S11332607F6C0000876C00008F6C0000976C00007E +S11332709F6C0000A76C0000AF6C0000B76C0000EE +S1133280BF6C0000C76C0000CF6C0000D76C00005E +S1133290DF6C0000E76C0000EF6C0000F76C0000CE +S11332A0FF6C0000076D00000F6D0000176D00003B +S11332B01F6D0000276D00002F6D0000376D0000AA +S11332C03F6D0000476D00004F6D0000576D00001A +S11332D05F6D0000676D00006F6D0000776D00008A +S11332E07F6D0000876D00008F6D0000976D0000FA +S11332F09F6D0000A76D0000AF6D0000B76D00006A +S1133300BF6D0000C76D0000CF6D0000D76D0000D9 +S1133310DF6D0000E76D0000EF6D0000F76D000049 +S1133320FF6D0000076E00000F6E0000176E0000B6 +S11333301F6E0000276E00002F6E0000376E000025 +S11333403F6E0000476E00004F6E0000576E000095 +S11333505F6E0000676E00006F6E0000776E000005 +S11333607F6E0000876E00008F6E0000976E000075 +S11333709F6E0000A76E0000AF6E0000B76E0000E5 +S1133380BF6E0000C76E0000CF6E0000D76E000055 +S1133390DF6E0000E76E0000EF6E0000F76E0000C5 +S11333A0FF6E0000076F0000688800006888000056 +S11333B004000000688800000000002000000000F5 +S11333C068880000000024200000000068880000D5 +S11333D000002C2000000000688800000000342059 +S11333E00000000068880000000035200000000094 +S11333F06888000000000080000000006888000069 +S113340000000083000000006C8800001801000028 +S11334100000002000000000000024200000000044 +S113342000002C20000000000000342000000000F8 +S113343000003520000000000000008000000000B3 +S1133440000000830000000030B40B4600249442C6 +S113345005D250F8045B43F8045B0434F7E70C4BE3 +S11334605B6913F4803F11D0002A0FDD01F01F03C4 +S11334701A44BFF34F8F064BC3F868122031203A29 +S1133480002AF8DCBFF34F8FBFF36F8F30BC704757 +S113349000ED00E010B4034600228A4204D2002466 +S11334A043F8044B0432F8E70C4B5B6913F4803F98 +S11334B011D000290FDD00F01F031944BFF34F8F13 +S11334C0064BC3F86802203020390029F8DCBFF32A +S11334D04F8FBFF36F8F5DF8044B704700ED00E032 +S11334E010B572B602F000F90D4B07E003F10C04BD +S11334F09A6859681868FFF7A7FF2346094A934258 +S1133500F4D306E01C46596854F8080BFFF7C2FFD1 +S11335102346054A9342F5D362B603F069FFFEE7FA +S1133520A83300000834000048340000FEE7FEE73A +S1133530FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE75F +S113354080B58AB000AF0346FB7100237B6297F914 +S11335500730042B06D097F90730052B02D03248E8 +S113356000F064F897F90730042B01D1022300E03E +S113357003230021184603F0F2FC38623B6A5B0E19 +S113358003F00703FB613B6A03F07F033B6297F997 +S11335900730042B01D1022300E003233021184615 +S11335A003F0DDFC07EE900AB8EE677B87ED047B41 +S11335B097F90730042B01D1022300E003232021D3 +S11335C0184603F0CCFC07EE900AB8EE677B87ED53 +S11335D0027B3B6A07EE903AB8EE676B97ED024BBD +S11335E097ED045B84EE057B36EE077B9FED0C6B59 +S11335F027EE065B0122FB6902FA03F307EE903A19 +S1133600B8EEE76B85EE067BFCEEC77B17EE903ACF +S11336107B627B6A18462837BD4680BDAFF30080C5 +S11336200000000060E37641007D000080B582B0B8 +S113363000AF78607968024800F0AEF800BEFDE79C +S11336406C78000080B584B000AF786039607B6826 +S1133650002BFCD03B68002BFCD00C4B1B68002BD0 +S113366001D100230DE03A687968094803F008FEA7 +S11336700346FB81FB89002B01D13B6801E04FF03D +S1133680FF3318461037BD4680BD00BF8888000050 +S11336908088000080B58EB000AFB9607B600346BF +S11336A0FB731346BB730023FB867B687B61BB689B +S11336B0BB6100233B7700237B770123BB77012386 +S11336C0FB77FB7B87F82030BB7B87F82C3048F6F0 +S11336D04173FB85BB7B012B03D107F114033B63CF +S11336E017E0BB7B022B03D143F22153FB8610E08E +S11336F0BB7B032B03D143F22153FB8609E0BB7B45 +S1133700042B03D143F22153FB8602E043F22153FD +S1133710FB86FB8E43F2215293422ED01C220021C1 +S1133720184803F06EFE174B174A1A60154B1B68B6 +S113373007F124021146184603F01AFD0346FB86DE +S1133740FB8E002BFCD10F4B1B681049184603F06D +S11337503FFD0346FB86FB8E002BFCD1094B1B6807 +S11337600B49184603F05CFD0346FB86FB8E002BD9 +S1133770FCD1044B1B68074A1360FB8E184638378C +S1133780BD4680BD6C880000708800008088000001 +S113379084880000888800000FB480B5A4B000AF0E +S11337A00023C7F888300023C7F88C3000237B60DF +S11337B007F108037C220021184603F022FE124B75 +S11337C01B68002B16D007F19C03C7F884303A1D00 +S11337D00E4BD7F88410D7F8980002F0E8FEC7F82B +S11337E08800D7F888203B1D11461846FFF72AFFAA +S11337F0C7F88C00D7F88C3018469037BD46BDE822 +S1133800804004B0704700BF8888000081610000D8 +S113381080B483B000AF03463960FB80B7F906304B +S1133820002B0ADB3B68DAB20C49B7F90630120107 +S1133830D2B20B4483F800230AE03B68DAB20849A9 +S1133840FB8803F00F03043B1201D2B20B441A7637 +S113385000BF0C37BD465DF8047B704700E100E013 +S113386000ED00E080B582B000AF78607B68013B7A +S1133870B3F1807F01D301230FE00A4A7B68013B47 +S113388053600F214FF0FF30FFF7C2FF054B0022BA +S11338909A60044B07221A60002318460837BD4675 +S11338A080BD00BF10E000E080B400AF064B1B6891 +S11338B0002B04D0044B1B68013B034A136000BF78 +S11338C0BD465DF8047B70478C88000080B483B0EB +S11338D000AF7860074A7B68136000BF054B1B6824 +S11338E0002BFBD100BF00BF0C37BD465DF8047B45 +S11338F0704700BF8C88000080B500AF02F0E4FA86 +S113390002F0BEF903F00FFD03F0B1FB134B1B688B +S1133910134AA2FB03239B091846FFF7A3FF0346A0 +S1133920002B00D0FEE74FF47A70FFF7CFFF0D4B6A +S11339301B78DBB2002B08D0002203210A4801F0D7 +S113394093F9084B00221A70EDE70122032106487F +S113395001F08AF9034B01221A70E4E76888000039 +S1133960D34D6210808900000040C64080B582B00B +S113397000AF0021002003F0F2FA78607B6840F287 +S11339800512934222D040F205120021002003F0D8 +S1133990D4FA0021002003F0E2FA0E4B4FF48072B7 +S11339A0C3F880250B4BD3F820380A4A23F480331C +S11339B0C2F820380849012001F064F8054BD3F817 +S11339C07035044A43F01003C2F8703500BF08375D +S11339D0BD4680BD0040C84000CA9A3B80B586B051 +S11339E000AF3B600346FB710B46BB7113467B7112 +S11339F0FB79062B00F2008301A252F823F000BFEA +S1133A001D3A0000C93A0000B53B0000B53C000077 +S1133A10B13D00009D3E00004D3F0000BB79002BEE +S1133A2024D0A34BD3F82038A14A23F48033C2F81E +S1133A3020389F4BD3F820387B617B6923F0FF0348 +S1133A407B617B797A6913437B61994A7B69C2F80C +S1133A502038974A3B68C2F83038954BD3F8003584 +S1133A60934A83F48033C2F80035C8E2904BD3F80C +S1133A7020387B617B6923F480337B617B6943F469 +S1133A8080337B618A4A7B69C2F82038884BD3F83B +S1133A9020387B617B6923F0FF037B617B797A6942 +S1133AA013437B61824A7B69C2F82038804BD3F888 +S1133AB000357F4A83F48033C2F800357C4BD3F859 +S1133AC040383B613B699BE2BB79002B34D0784B97 +S1133AD0D3F8503803F40073FB60754BD3F85038B7 +S1133AE0734A23F48033C2F85038714BD3F85038FA +S1133AF07B617B6923F0FF037B617B797A691343E4 +S1133B007B616B4A7B69C2F85038694A3B68C2F8EA +S1133B106038674BD3F85038654A83F48073C2F831 +S1133B205038634BD3F8503803F40073BB60BA6861 +S1133B30FB689A42F5D062E25D4BD3F8503803F447 +S1133B400073FB605A4BD3F850387B617B6923F4D4 +S1133B5080337B617B6943F480337B61544A7B69A6 +S1133B60C2F85038524BD3F850387B617B6923F04C +S1133B70FF037B617B797A6913437B614C4A7B69E0 +S1133B80C2F850384A4BD3F85038494A83F480730A +S1133B90C2F85038464BD3F8503803F40073BB6076 +S1133BA0BA68FB689A42F5D0414BD3F870383B6150 +S1133BB03B6925E2BB79002B3CD03D4BD3F88038E0 +S1133BC003F40073FB603A4BD3F88038384A23F48B +S1133BD08033C2F88038364BD3F880387B617B69F8 +S1133BE023F0FF037B617B797A6913437B61304A5D +S1133BF07B69C2F880382E4A3B68C2F890382C4B57 +S1133C00D3F880382A4A83F48073C2F88038284B6A +S1133C10D3F8803803F40073BB60BA68FB689A4237 +S1133C20F5D0234BD3F88038214A23F48033C2F8EB +S1133C308038E4E11E4BD3F8803803F40073FB6052 +S1133C401B4BD3F880387B617B6923F480337B6121 +S1133C507B6943F480337B61154A7B69C2F8803801 +S1133C60134BD3F880387B617B6923F0FF037B61BE +S1133C707B797A6913437B610D4A7B69C2F880388A +S1133C800B4BD3F880380A4A83F48073C2F8803827 +S1133C90074BD3F8803803F40073BB60BA68FB6841 +S1133CA09A42F5D0024BD3F8A0383B613B69A7E1B7 +S1133CB00040C840BB79002B3CD0A34BD3F8B038AC +S1133CC003F40073FB60A04BD3F8B0389E4A23F48E +S1133CD08033C2F8B0389C4BD3F8B0387B617B6931 +S1133CE023F0FF037B617B797A6913437B61964AF6 +S1133CF07B69C2F8B038944A3B68C2F8C038924B2A +S1133D00D3F8B038904A83F48073C2F8B0388E4B3D +S1133D10D3F8B03803F40073BB60BA68FB689A4206 +S1133D20F5D0894BD3F8B038874A23F48033C2F8EE +S1133D30B03864E1844BD3F8B03803F40073FB600B +S1133D40814BD3F8B0387B617B6923F480337B618A +S1133D507B6943F480337B617B4A7B69C2F8B0386A +S1133D60794BD3F8B0387B617B6923F0FF037B6127 +S1133D707B797A6913437B61734A7B69C2F8B038F3 +S1133D80714BD3F8B038704A83F48073C2F8B038FA +S1133D906D4BD3F8B03803F40073BB60BA68FB68AA +S1133DA09A42F5D0684BD3F8D0383B613B6927E1A0 +S1133DB0BB79002B34D0644BD3F8203903F400735F +S1133DC0FB60614BD3F820395F4A23F48033C2F897 +S1133DD020395D4BD3F820397B617B6923F0FF03E5 +S1133DE07B617B797A6913437B61574A7B69C2F8AB +S1133DF02039554A3B68C2F83039534BD3F820393F +S1133E00514A83F48073C2F820394F4BD3F82039D8 +S1133E1003F40073BB60BA68FB689A42F5D0EEE025 +S1133E20494BD3F8203903F40073FB60464BD3F8B5 +S1133E3020397B617B6923F480337B617B6943F4A4 +S1133E4080337B61404A7B69C2F820393E4BD3F80A +S1133E5020397B617B6923F0FF037B617B797A697D +S1133E6013437B61384A7B69C2F82039364BD3F857 +S1133E702039354A83F48073C2F82039324BD3F8A1 +S1133E80203903F40073BB60BA68FB689A42F5D02A +S1133E902D4BD3F840393B613B69B1E0BB79002B32 +S1133EA024D0294BD3F8E038274A23F48033C2F8CE +S1133EB0E038254BD3F8E0387B617B6923F0FF03BE +S1133EC07B617B797A6913437B611F4A7B69C2F802 +S1133ED0E0381D4A3B68C2F8F0381B4BD3F8003475 +S1133EE0194A83F40043C2F8003488E0164BD3F82F +S1133EF0E0387B617B6923F480337B617B6943F425 +S1133F0080337B61104A7B69C2F8E0380E4BD3F8EA +S1133F10E0387B617B6923F0FF037B617B797A69FD +S1133F2013437B61084A7B69C2F8E038064BD3F837 +S1133F300034054A83F40043C2F80034024BD3F83A +S1133F4010393B613B695BE00040C840BB79002B02 +S1133F5024D02D4BD3F8E0382B4A23F48033C2F815 +S1133F60E038294BD3F8E0387B617B6923F0FF0309 +S1133F707B617B797A6913437B61234A7B69C2F84D +S1133F80E038214A3B68C2F8F0381F4BD3F870354B +S1133F901D4A83F00103C2F8703530E01A4BD3F8A0 +S1133FA0E0387B617B6923F480337B617B6943F474 +S1133FB080337B61144A7B69C2F8E038124BD3F832 +S1133FC0E0387B617B6923F0FF037B617B797A694D +S1133FD013437B610C4A7B69C2F8E0380A4BD3F87F +S1133FE07035094A83F00103C2F87035064BD3F8E3 +S1133FF000393B613B6903E00448FFF717FB0023EA +S113400018461837BD4680BD0040C840807800007F +S113401080B483B000AF0346FB71074AFB79DB0130 +S113402013441B681B0A03F0070318460C37BD46EC +S11340305DF8047B704700BF0000CC4080B483B0BF +S113404000AF0346FB71064AFB79DB0113441B688E +S1134050DBB2013318460C37BD465DF8047B70476C +S11340600000CC4090B5ADF5237D00AF0246FB1DAA +S11340701A7007F108031A4A184611464FF41E73C2 +S11340801A4603F0BCF9FB1D1B781846FFF7C0FF66 +S1134090C7F88402FB1D1B7807F10802DB001A44F1 +S11340A0D7F8843213441B78184600F003FC044606 +S11340B0FB1D1B781846FFF7C1FF0346B4FBF3F35F +S11340C0C7F88032D7F88032002B02D10548FFF7B9 +S11340D0ADFAD7F88032184607F52377BD4690BD70 +S11340E0BC780000A078000080B584B000AF786090 +S11340F07B685B68D02B03D87B685B68672B02D82E +S11341004848FFF793FA484BD3F8003203F40053BE +S1134110002B34D0444BD3F80032DA437B685B681D +S11341201340DBB2002B2AD13F4BD3F80032DA43E1 +S11341307B681B78DB03134003F4C033002B1ED1D0 +S1134140394BD3F8003203F48043002B07D1364BAC +S1134150D3F80032344A43F48043C2F80032324B7D +S1134160D3F8003203F08043002B56D02E4BD3F803 +S113417000322D4A23F08043C2F800324DE0FFF7AD +S1134180F5FB294BD3F8003223F00053FB60FB68A6 +S113419003F4C043002B0BD0FB6823F4C043FB6043 +S11341A0FB6843F08043FB601F4AFB68C2F800329F +S11341B0FA681E4B1340FB607B685B68DAB27B686D +S11341C01B78DB0303F4C0331A43FB681A43184B10 +S11341D01343FB60144AFB68C2F80032BFF34F8FED +S11341E000BFBFF36F8F00BF12491E2000F04AFCCE +S11341F000BF0D4BD3F8003203F00053002BF8D06E +S1134200FB6843F48043FB60FB6823F08043FB605E +S1134210054AFB68C2F8003200E000BF1037BD4613 +S113422080BD00BF347B00000040C840007FFEFF1B +S11342300020004000CA9A3B80B584B000AF78608B +S1134240524BD3F8403203F40003002B2CD04F4BD5 +S1134250D3F880227B685B689A4225D14B4BD3F814 +S113426090227B689B689A421ED1484BD3F8403217 +S113427003F40053002B07D1444BD3F84032434A94 +S113428043F40053C2F84032404BD3F8403203F0B9 +S11342908043002B76D03D4BD3F840323B4A23F089 +S11342A08043C2F840326DE0FFF760FB374BD3F830 +S11342B07032364A43F08033C2F87032334BD3F84D +S11342C04032FB60FA68324B1340002B0BD0FA6883 +S11342D0304B1340FB60FB6843F08043FB602B4A88 +S11342E0FB68C2F84032294B6FF07042C3F8A02239 +S11342F0264A7B685B68C2F88032244A7B689B68E4 +S1134300C2F89032244BFB60204AFB68C2F840326A +S113431022491E2000F0B6FBFA68214B1343FB60D0 +S11343201A4AFB68C2F840321C49FA2000F0AAFB82 +S1134330FB6823F40063FB60144AFB68C2F8403254 +S113434000BF124BD3F8403203F00053B3F1005FC7 +S1134350F7D1FB6843F40053FB600C4AFB68C2F8D6 +S11343604032FB6823F08043FB60084AFB68C2F8D4 +S11343704032064BD3F87032044A03F07F33C2F85C +S1134380703200E000BF1037BD4680BD0040C84019 +S113439000208000FFDF7FFF0800004000CA9A3B36 +S11343A00008800080B586B000AF0346FB710B4661 +S11343B0BB7113467B7100237B6100233B617B79D6 +S11343C0232B02D87B790B2B02D83348FFF72EF925 +S11343D097F90730022B02D0032B05D009E02F4BAD +S11343E07B612F4B3B6107E02E4B7B612E4B3B6186 +S11343F002E02E48FFF71AF97B691A68BB79DB00E3 +S1134400402101FA03F31340FB607B691A68BB790E +S1134410DB00802101FA03F31A437B691A607B698C +S11344201A68BB79DB003F2101FA03F3DB431A402E +S11344307B691A607B691A687B7903F03F01BB7959 +S1134440DB0001FA03F31A437B691A603B691A68BB +S1134450BB79022101FA03F35A403B691A607B6974 +S11344601A68BB79DB00802101FA03F3DB431A40AD +S11344707B691A6000BF7B691A68BB79DB00402145 +S113448001FA03F31A40FB689A42F4D000BF00BF5C +S11344901837BD4680BD00BFA47B00007042C840F1 +S11344A05042C8403042C8402042C840E47B00002B +S11344B080B584B000AF03460A46FB711346BB7156 +S11344C00023FB600023BB6097F90730022B06D062 +S11344D097F90730032B02D02348FFF7A7F897F981 +S11344E00730022B02D0032B0DD019E01F4BD3F859 +S11344F07022BB79DB003F2101FA03F31340BB6058 +S11345001B4BFB600FE0194BD3F83022BB79DB0067 +S11345103F2101FA03F31340BB60164BFB6002E03A +S11345201548FFF783F8BB79DB00BA6822FA03F376 +S1134530BB60BB680B2B02D9BB68232B02D90F4885 +S1134540FFF774F8BB68002B08D0FA68BB68B2FBAD +S1134550F3F21346DB0013445B0000E0002318462B +S11345601037BD4680BD00BF007C00000040C8403D +S113457000A4781F00389C1C487C0000647C000068 +S113458080B584B000AF78603E4BD3F8103203F4AA +S11345900013002B29D03B4BD3F81032DA437B684D +S11345A01B68134003F00703002B1ED1354BD3F8CF +S11345B0103203F40053002B07D1324BD3F81032DE +S11345C0304A43F40053C2F810322E4BD3F8103261 +S11345D003F08043002B50D02A4BD3F81032294AE1 +S11345E023F08043C2F8103247E0FFF7BFF9254BB0 +S11345F0D3F83032234A43F08033C2F830327B6838 +S11346001B6803F00702204B1343FB601D4AFB6841 +S1134610C2F810321D491E2000F034FAFA681C4B0F +S11346201343FB60174AFB68C2F8103217491E2077 +S113463000F028FAFB6823F40063FB60114AFB686E +S1134640C2F8103200BF0F4BD3F8103203F00053FE +S1134650B3F1005FF7D1FA6842F208031343FB6039 +S1134660084AFB68C2F81032FB6823F08043FB6001 +S1134670044AFB68C2F8103200E000BF1037BD46A0 +S113468080BD00BF0040C8401000004000CA9A3BF3 +S11346900008200080B584B000AF786039607B6882 +S11346A0002B02D13348FEF7C1FF4FF41C63FB60BB +S11346B03A68FB689A4202D83B689B2B02D82E4882 +S11346C0FEF7B4FF3A68FB689A4206D37B6803227C +S11346D01A707B68D0225A6046E0FB685B083A682F +S11346E09A420AD37B6803221A703B68234AA2FBCE +S11346F00323DA087B685A6036E0FB689B083A6853 +S11347009A420AD37B6800221A703B681B4AA2FBB8 +S113471003239A087B685A6026E0FB68DB083A6842 +S11347209A420AD37B6801221A703B68134AA2FB9F +S113473003235A087B685A6016E0FB681B093A6831 +S11347409A420BD97B6802221A703B685B000B4AC1 +S1134750A2FB03235A087B685A6005E07B680222A7 +S11347601A707B6868225A60002318461037BD46C9 +S113477080BD00BFA87C0000C07C0000ABAAAAAA30 +S113478080B400AF0A4B1B6A03F01003002B0AD15C +S1134790074B14221A6200BF054B1B6A03F08043C7 +S11347A0B3F1804FF8D100BFBD465DF8047B70477C +S11347B00040C84080B588B000AF0346FB710023B9 +S11347C0FB6197F90730052B59D801A252F823F061 +S11347D0E9470000254800002B4800006548000018 +S11347E06B480000754800002C4BD3F80032DBB254 +S11347F0FB602A4BD3F80032DB0B03F00303BB60EE +S1134800BB680133012202FA03F3BB60BB685B009F +S1134810234AB2FBF3F3FB61FB69FA6802FB03F37F +S1134820FB612FE01F4BFB612CE01C4BD3F8903253 +S113483003F07F03BB61194BD3F8803223F040436C +S11348407B61164BD3F8A03223F040433B617A6975 +S11348503B69B2FBF3F2BB691344114A02FB03F355 +S1134860FB610FE0104BFB610CE00420FEF768FED7 +S1134870F86107E00520FEF763FEF86102E00B48EB +S1134880FEF7D4FEFB69002B02D10948FEF7CEFEE9 +S1134890FB6918462037BD4680BD00BF0040C840B4 +S11348A000366E0100CA9A3B00389C1C487D00000B +S11348B0647D000080B584B000AF0346FB71002323 +S11348C0FB60FB791E2B00F2BD8001A252F823F09D +S11348D04D490000674900006D490000734900001C +S11348E079490000794900007F4900007F490000B0 +S11348F08949000089490000934900009F4900004C +S1134900AB490000B7490000C3490000C349000097 +S1134910454A0000CD490000D9490000E54900009E +S1134920F1490000FD490000FD490000074A00006C +S1134930154A0000294A0000294A0000334A0000B1 +S1134940334A00003D4A00003D4A0000444BD3F87E +S1134950C03003F00403002B02D0424BFB6074E030 +S1134960414BFB6071E0414BFB606EE0404BFB60F0 +S11349706BE0404BFB6068E03D4BFB6065E0002072 +S1134980FFF718FFF86060E00220FFF713FFF860FC +S11349905BE000210220FFF78BFDF86055E0012168 +S11349A00220FFF785FDF8604FE002210220FFF7A7 +S11349B07FFDF86049E003210220FFF779FDF860EC +S11349C043E00320FFF7F6FEF8603EE000210320F9 +S11349D0FFF76EFDF86038E001210320FFF768FD62 +S11349E0F86032E002210320FFF762FDF8602CE05A +S11349F003210320FFF75CFDF86026E00120FFF7A8 +S1134A00D9FEF86021E00120FFF7D4FE03465B08DD +S1134A10FB601AE00120FFF7CDFE0346164AA2FB15 +S1134A2003239B08FB6010E00420FFF7C3FEF8603B +S1134A300BE00520FFF7BEFEF86006E002F0A3FAE3 +S1134A40F86002E00D48FEF7F1FDFB68002B02D18F +S1134A500B48FEF7EBFDFB6818461037BD4680BDDA +S1134A600040C8400024F40000093D00006CDC0252 +S1134A7000366E010084D717CDCCCCCC7C7D0000F1 +S1134A80987D0000F0B585B000AF786039607B6830 +S1134A90002B02D11E48FEF7C9FD7B6818464FF073 +S1134AA000013B681A464FF0000302FB01FC00FBC7 +S1134AB003F66644A0FB020173181946154A4FF029 +S1134AC0000302F0D0FD02460B46C7E90223D7E9F2 +S1134AD00223012B08BF002A02D30F48FEF7A6FDCC +S1134AE0D7E902014FF003024FF0000302F0BBFDCF +S1134AF002460B46941843EB0305C7E90245BB681D +S1134B00184602F061FA00BF1437BD46F0BD00BF7D +S1134B10B47D000040420F00D87D000080B483B013 +S1134B2000AF03460A46FB711346BB71BB791946B5 +S1134B30114AFB7903F540735B0113441B684B4036 +S1134B4003F00103002B10D0BB791A460A49FB7904 +S1134B5002F0010203F540735B010B441A60BFF3DA +S1134B604F8F00BFBFF36F8F00BF00BF0C37BD4630 +S1134B705DF8047B704700BF0000CC4080B584B072 +S1134B8000AF78600023FB6009E00D4AFB6852F82F +S1134B9023307A689A4206D0FB680133FB60FB68D5 +S1134BA00F2BF2D900E000BFFB680F2B02D9054898 +S1134BB0FEF73CFDFB6818461037BD4680BD00BFBC +S1134BC0007E0000507E000080B586B000AFF86023 +S1134BD0B9607A60F868FFF7D1FF78617B690D2BC3 +S1134BE00CD8204A7B6913441B788A2B06D01D4AB3 +S1134BF07B6913441B78184602F0F6F9FB685A697E +S1134C000121BB6801FA03F3DB431A40FB685A61D4 +S1134C107B681B78002B0AD1FB685A680121BB68AA +S1134C2001FA03F3DB431A40FB685A600FE07B6828 +S1134C305B781A46B968F86800F016F8FB685A6899 +S1134C400121BB6801FA03F31A43FB685A607B68CD +S1134C509B781A46B968F86802F0D4F900BF18378F +S1134C60BD4680BD407E000080B584B000AFF860D2 +S1134C70B9601346FB71BB681F2B02D90E48FEF7BF +S1134C80D5FCFB79002B0AD1FB681A680121BB68AB +S1134C9001FA03F3DB431A40FB681A6008E0FB687F +S1134CA01A680121BB6801FA03F31A43FB681A600E +S1134CB000BF1037BD4680BD847E000080B487B03D +S1134CC000AFF860B9601346FB71BB683B61FB68D9 +S1134CD0DA690121BB6801FA03F3DB431A40FB687C +S1134CE0DA61BB680F2B03D8FB680C337B6105E0EA +S1134CF0FB6810337B613B69103B3B61FB79013BF3 +S1134D00042B52D801A252F823F000BF214D000019 +S1134D10394D00005D4D0000814D0000974D0000AD +S1134D207B691A683B695B00032101FA03F3DB43E7 +S1134D301A407B691A6039E07B691A683B695B0039 +S1134D40032101FA03F3DB431A403B695B000121B1 +S1134D5001FA03F31A437B691A6027E07B691A6836 +S1134D603B695B00032101FA03F3DB431A403B690F +S1134D705B00022101FA03F31A437B691A6015E010 +S1134D807B691A683B695B00032101FA03F31A4348 +S1134D907B691A600AE0FB68DA690121BB6801FAE1 +S1134DA003F31A43FB68DA6100E000BF00BF1C375D +S1134DB0BD465DF8047B704780B483B000AF034602 +S1134DC00A46FB711346BB71BB791946114AFB793C +S1134DD003F540735B0113441B684B4003F001036C +S1134DE0002B10D0BB791A460A49FB7902F0010264 +S1134DF003F540735B010B441A60BFF34F8F00BF90 +S1134E00BFF36F8F00BF00BF0C37BD465DF8047B56 +S1134E10704700BF0000CC4080B584B000AF78601C +S1134E200023FB6009E00D4AFB6852F823307A68DE +S1134E309A4206D0FB680133FB60FB680C2BF2D965 +S1134E4000E000BFFB680C2B02D90548FEF7EEFB1F +S1134E50FB6818461037BD4680BD00BFA07E000029 +S1134E60E47E000080B58CB000AFF860B9607A6071 +S1134E70BB68002B02D1A248FEF7D8FBBB681B68B5 +S1134E80002B02D19F48FEF7D1FBBB681B7A042B91 +S1134E9002D99D48FEF7CAFBBB685B7A042B02D992 +S1134EA09A48FEF7C3FB0023FB62BB681B68FB61E7 +S1134EB0002387F823300023FB84042387F822305F +S1134EC041E07A6813469B0013445B001946BB68B3 +S1134ED01B6897F8222002FB03F3B1FBF3F30533BD +S1134EE08B4AA2FB0323DB08BB84BB8C002B01D1C0 +S1134EF00123BB8497F82230BA8C02FB03F37A684F +S1134F00B2FBF3F37B61BB681B687A699A4204D9EC +S1134F10BB681B687A69D31A03E0BB681A687B69AB +S1134F20D31A3B613A69FB699A4207D83B69FB6132 +S1134F3097F8223087F82330BB8CFB8497F8223013 +S1134F40013387F8223097F82230202BB9D9BB6877 +S1134F501B68704AA2FB03235A0913465B001344DF +S1134F60FA699A4203D940F22153FB62FCE0F868E3 +S1134F70FFF752FFB861684ABB6913441B781846AF +S1134F8002F051F8F86802F05CF8FB681B69BB6238 +S1134F9097F82330032B07D997F82330072B03D82E +S1134FA0BB6A43F40033BB62BB6A23F0F853BB62B1 +S1134FB097F82330013B1B0603F0F853BA6A1343F6 +S1134FC0BB62BA6A554B1340BB62FB8CC3F30C0241 +S1134FD0BB6A1A43FB681A61FB681B6923F0005221 +S1134FE0FB681A61FB689A694D4B1340BB62BB684E +S1134FF01B791A46BB68DB7B1B0203F4E0631A438C +S1135000BB689B7B9B0003F004031343BA6A1343FE +S1135010BB62BB685B79012B0DD1BB681B79002B8C +S113502004D0BB6A23F40063BB620CE0BB6A43F4A4 +S11350300063BB6207E0BB681B79002B03D0BB6A2B +S113504043F01003BB62FB68BA6A9A61FB681B6990 +S113505023F40053BB62BB68DB795B0303F40052A7 +S1135060BB6A1A43FB681A61BB685B7A1B04BA68A3 +S1135070127A1A43FB68DA62FB689B6A43F088027F +S1135080FB689A62FB689B6A43F44042FB689A623D +S1135090244BBB62BB6A43F00043BB62BB6A43F46C +S11350A04043BB62FB685A6ABB685B7B1B0103F02D +S11350B01001BB681B7B5B0103F020030B431A4305 +S11350C0FB685A62BB689B7A002B05D0FB685B6A5D +S11350D043F00802FB685A62BB68DB7A002B05D0F8 +S11350E0FB685B6A43F00102FB685A62BB689B7908 +S11350F0002B19D0BB6A43F00053BB6218E000BF19 +S1135100207F0000447F0000747F0000D07F0000F7 +S1135110CDCCCCCC1F85EB51D47E000000E0FFFF4A +S1135120E8F8FFFF00001F40BB6A23F00053BB6296 +S1135130FB685A69BB6A1A43FB685A61FB689B693E +S1135140BB62BB681B7C002B03D0BB6A43F4002307 +S1135150BB62BB685B7C002B03D0BB6A43F4802337 +S1135160BB62FB68BA6A9A61FB6A18463037BD466F +S113517080BD00BF80B582B000AF78607B68002B33 +S113518002D11D48FEF752FA14220021786802F079 +S113519038F97B684FF4E1321A607B6800221A7197 +S11351A07B6800225A717B6800229A717B68002216 +S11351B0DA717B6800221A727B6800225A727B685B +S11351C000229A727B680022DA727B6800225A738A +S11351D07B6800221A737B6800229A737B68002222 +S11351E0DA737B6800221A747B6800225A7400BF49 +S11351F00837BD4680BD00BF2C80000080B586B056 +S113520000AFF860B9607A60BB68002B02D1144823 +S1135210FEF70CFABB687B617B683B6111E000BF61 +S1135220FB685B6903F40003002BF9D07B691B78EE +S11352301A46FB68DA617B6901337B613B69013B98 +S11352403B613B69002BEAD100BFFB685B6903F457 +S11352508003002BF9D0002318461837BD4680BDC3 +S11352605080000080B500AF054B1B68054A5268AA +S1135270114605489847BFF34F8F00BF00BF80BD5C +S1135280C48800009088000000C0074080B500AFCB +S1135290054B1B68054A9268114605489847BFF3B9 +S11352A04F8F00BF00BF80BDC488000090880000FD +S11352B00000084080B500AF054B1B68054AD26862 +S11352C0114605489847BFF34F8F00BF00BF80BD0C +S11352D0C4880000908800000040084080B500AFFA +S11352E0054B1B68054A1269114605489847BFF3E8 +S11352F04F8F00BF00BF80BDC488000090880000AD +S11353000080084080B500AF054B1B68054A526910 +S1135310114605489847BFF34F8F00BF00BF80BDBB +S1135320C48800009088000000C0084080B500AF29 +S1135330054B1B68054A9269114605489847BFF317 +S11353404F8F00BF00BF80BDC4880000908800005C +S11353500000094080B500AF054B1B68054AD269BF +S1135360114605489847BFF34F8F00BF00BF80BD6B +S1135370C4880000908800000040094080B500AF58 +S1135380054B1B68054A126A114605489847BFF346 +S11353904F8F00BF00BF80BDC4880000908800000C +S11353A00080094080B500AF054B1B68054A526A6E +S11353B0114605489847BFF34F8F00BF00BF80BD1B +S11353C0C48800009088000000C0094080B500AF88 +S11353D0054B1B68054A926A114605489847BFF376 +S11353E04F8F00BF00BF80BDC488000090880000BC +S11353F000000A4080B500AF054B1B68054AD26A1D +S1135400114605489847BFF34F8F00BF00BF80BDCA +S1135410C4880000908800000040C24080B584B079 +S113542000AF78600B46FB70FB78002B22D17B68C1 +S1135430D3F8103523F005027B68C3F810252D49F5 +S11354404FF47A70FFF71EFB7B68D3F8103523F412 +S1135450C1527B68C3F8102526494FF47A70FFF7D0 +S113546011FB7B68D3F8103523F400227B68C3F862 +S113547010253BE07B68D3F8103523F001027B68EC +S1135480C3F810251B494FF47A70FFF7FBFA7B68C9 +S1135490D3F8103543F400227B68C3F8102515496E +S11354A04FF47A70FFF7EEFA7B68D3F81035FB609F +S11354B0FB6823F4C053FB60FB78DB0203F4C052A7 +S11354C0FB68134343F02003FB607B68FA68C3F86E +S11354D0102508494FF47A70FFF7D4FA7B68D3F8A3 +S11354E0103543F004027B68C3F8102500BF103761 +S11354F0BD4680BD00CA9A3B80B582B000AF7860DB +S11355000B46FB70FB78002B2FD07B68D3F830352B +S113551043F001027B68C3F8302527494FF47A70C1 +S1135520FFF7B0FA7B68D3F8303543F400327B6878 +S1135530C3F8302520494FF47A70FFF7A3FA7B684B +S1135540D3F8303543F480227B68C3F830251A49F8 +S11355504FF47A70FFF796FA7B68D3F8303523F06E +S113556004027B68C3F8302521E07B68D3F830352A +S113557043F005027B68C3F830250F494FF47A7075 +S1135580FFF780FA7B68D3F8303523F480227B68F8 +S1135590C3F8302508494FF47A70FFF773FA7B6833 +S11355A0D3F8303523F400327B68C3F8302500BFCC +S11355B00837BD4680BD00BF00CA9A3B80B582B0A3 +S11355C000AF78607B68002B02D10A48FEF72EF802 +S11355D003220021786801F014FF7B6801221A700D +S11355E07B6803225A707B680F229A7000BF0837C9 +S11355F0BD4680BD7480000080B584B000AF786083 +S113560039603B68002B02D13448FEF70FF87B6801 +S1135610D3F8503523F070427B68C3F850257B687B +S1135620D3F850253B681B781B071A437B68C3F8E3 +S113563050257B68D3F8503523F070627B68C3F83B +S113564050257B68D3F850253B681B781B0603F074 +S113565070631A437B68C3F850257B68D3F85035D0 +S1135660FB60FA681E4B1340FB603B685B789B0051 +S113567003F01C023B689B785B0103F4F073134353 +S113568043F00203BB60BB68C3F30C03FA68134323 +S1135690FB607B68FA68C3F850257B68D3F86035F3 +S11356A023F4E0527B68C3F860257B68D3F8603547 +S11356B043F480627B68C3F860257B68D3F8603567 +S11356C043F080727B68C3F8602506496420FFF7C5 +S11356D0D9F900BF1037BD4680BD00BF94800000DB +S11356E000E0FFFF00CA9A3B80B584B000AF814B55 +S11356F0D3F888307F4A43F47003C2F888307D4B76 +S11357007D4A9A607D4B1B889BB203F00403002BF7 +S113571007D07A4B1B889BB2784A23F004039BB2D0 +S11357201380774B1B889BB203F00403002B07D034 +S1135730734B1B889BB2724A23F004039BB2138001 +S1135740704B1B6803F40053002B03D06D4B6E4A5F +S11357505A6007E06B4B4CF220525A60694B4DF68D +S113576028125A60674B4FF6FF729A60654B1B68AC +S113577023F0A003634A43F020031360634B1B68C8 +S113578003F40053002B03D0604B5F4A5A6007E0D8 +S11357905E4B4CF220525A605C4B4DF628125A6014 +S11357A05A4B4FF6FF729A60584B1B6823F0A003C4 +S11357B0564A43F020031360554B1B6803F0010362 +S11357C0002B05D0524B1B68514A23F00103136090 +S11357D0484B5B6903F40033B3F5003F22D0454BDB +S11357E05B6903F40033002B1BD1BFF34F8F00BF61 +S11357F0BFF36F8F00BF3F4B0022C3F85022BFF3AB +S11358004F8F00BFBFF36F8F00BF3A4B5B69394ABC +S113581043F400335361BFF34F8F00BFBFF36F8F67 +S113582000E000BF334B5B6903F48033B3F5803F82 +S11358303FD0304B5B6903F48033002B38D12D4BC0 +S11358400022C3F88420BFF34F8F00BF294BD3F845 +S11358508030FB60FB685B0BC3F30E03BB60FB682B +S1135860DB08C3F309037B60BB685A0143F6E073AA +S113587013407A6892071F491343C1F860327B686A +S11358805A1E7A60002BEFD1BB685A1EBA60002BF7 +S1135890E5D1BFF34F8F00BF164B5B69154A43F444 +S11358A080335361BFF34F8F00BFBFF36F8F00E0AE +S11358B000BF184B1B6F174A23F400531367164B92 +S11358C0154A1B69D363144B4FF0FF321A61094B1D +S11358D05B69084A43F010035361BFF34F8F00BF65 +S11358E0BFF36F8F00BF01F0C9FB00BF1037BD4687 +S11358F080BD00BF00ED00E0003000000000034068 +S1135900004003400080034020C528D90000C14066 +S113591010E000E000400E400040C04080B58AB076 +S113592000AF786039600023FB847B68002B02D1D0 +S11359302848FDF77BFE3B68002B02D12648FDF783 +S113594075FE3B681B7B0C2B02D92448FDF76EFEC9 +S11359503B681B7B1A46224B53F82230002B02D1A2 +S11359602048FDF763FE07F108031846FFF702FC21 +S11359703B689B7A002B14BF01230023DBB27B76A8 +S11359803B68DB7A002B14BF01230023DBB23B7698 +S11359903B681B7B1A46124B53F822003B681A687B +S11359A007F108031946FFF75DFA38623B6A002BDA +S11359B005D0386A01F069FB0346FB8405E07B6887 +S11359C0FB613B681A7BFB691A70FB8C184628370D +S11359D0BD4680BDE88000000C81000030810000DD +S11359E0B48000009881000080B586B000AFF860F4 +S11359F0B9607A60FB68002B02D11048FDF716FEEF +S1135A00BB68002B02D10E48FDF710FE7B68002B0B +S1135A1002D10C48FDF70AFEFB687B617B691B78A9 +S1135A201A46094B53F822307A68B9681846FFF7CA +S1135A30E5FB002318461837BD4680BDDC81000015 +S1135A400082000024820000B480000080B483B08F +S1135A5000AF0346FB71074AFB79DB0113441B6863 +S1135A601B0A03F0070318460C37BD465DF8047B98 +S1135A70704700BF0000CC4080B483B000AF034641 +S1135A80FB71064AFB79DB0113441B68DBB201336B +S1135A9018460C37BD465DF8047B70470000CC40C7 +S1135AA090B5ADF5237D00AF0246FB1D1A7007F1DA +S1135AB008031A4A184611464FF41E731A4601F099 +S1135AC09EFCFB1D1B781846FFF7C0FFC7F8840235 +S1135AD0FB1D1B7807F10802DB001A44D7F8843257 +S1135AE013441B781846FEF7E5FE0446FB1D1B789D +S1135AF01846FFF7C1FF0346B4FBF3F3C7F880323F +S1135B00D7F88032002B02D10548FDF78FFDD7F876 +S1135B108032184607F52377BD4690BDDC8200002D +S1135B204882000080B483B000AF0346FB71074A8B +S1135B30FB79DB0113441B681B0A03F007031846B7 +S1135B400C37BD465DF8047B704700BF0000CC40B5 +S1135B5080B483B000AF0346FB71064AFB79DB01D6 +S1135B6013441B68DBB2013318460C37BD465DF89D +S1135B70047B70470000CC4080B582B000AF034680 +S1135B803960FB713B68002B02D11A48FDF74EFDCA +S1135B903B685B781B0503F470023B689B781B042D +S1135BA003F470231A433B68DB781B0203F4E063BD +S1135BB01A433B681B79013BDBB21A433B681B78F1 +S1135BC0002B05D03B681B781B0603F0807300E0B4 +S1135BD000230948F9791A43CB0103441A60BFF33F +S1135BE04F8F00BFBFF36F8F00BF00BF0837BD46A4 +S1135BF080BD00BF548500000000CC4090B5ADF5D9 +S1135C00237D00AF0246FB1D1A7007F108031A4AF0 +S1135C10184611464FF41E731A4601F0F0FBFB1DA3 +S1135C201B781846FFF77EFFC7F88402FB1D1B781C +S1135C3007F10802DB001A44D7F8843213441B78B6 +S1135C401846FEF737FE0446FB1D1B781846FFF77F +S1135C507FFF0346B4FBF3F3C7F88032D7F88032F2 +S1135C60002B02D10548FDF7E1FCD7F88032184635 +S1135C7007F52377BD4690BDE88500004882000003 +S1135C8080B58AB000AF07F1200300221A601A71B0 +S1135C901621724801F058FB07F11C031846FFF760 +S1135CA08DFC07F11C0319466D48FFF7A5FC012183 +S1135CB06B48FFF7B3FB01216948FFF71DFC07F1AF +S1135CC0080300221A605A609A60DA601A6101239C +S1135CD03B7216233B6103237B60FEF751FD0023D7 +S1135CE087F82330012387F8243007F1200319466D +S1135CF00020FFF741FF07F1200319460820FFF7B2 +S1135D003BFF4FF47A7001F046F9042387F82330FF +S1135D10012387F8243007F1200319460020FFF7F8 +S1135D202BFF002387F82330F02387F8243007F172 +S1135D30200319460820FFF71FFF07F10803184640 +S1135D40FEF77AFA3B1D1846FEF71AFC062387F87D +S1135D502330162387F8243007F12003194619202D +S1135D60FFF70AFF102201210220FEF71BFB062386 +S1135D7087F82330032387F8243007F120031946DA +S1135D800420FFF7F9FE042387F82330022387F861 +S1135D90243007F1200319460220FFF7EDFE00230B +S1135DA087F82330012387F8243007F120031946AC +S1135DB02520FFF7E1FE002387F82330012387F82D +S1135DC0243007F1200319462920FFF7D5FE0023CC +S1135DD087F82330012387F8243007F1200319467C +S1135DE00E20FFF7C9FE002387F82330012387F82C +S1135DF0243007F1200319460F20FFF7BDFE0023CE +S1135E0087F82330012387F8243007F1200319464B +S1135E102B20FFF7B1FE002387F82330012387F8F6 +S1135E20243007F1200319460D20FFF7A5FE0023B7 +S1135E3087F82330012387F8243007F1200319461B +S1135E403120FFF799FE0020FFF7D8FE0346054AEC +S1135E50136000BF2837BD4680BD00BF0080CA4024 +S1135E600040C8406888000080B483B000AF034697 +S1135E700A46FB711346BB71BB791946114AFB797B +S1135E8003F540735B0113441B684B4003F00103AB +S1135E90002B10D0BB791A460A49FB7902F00102A3 +S1135EA003F540735B010B441A60BFF34F8F00BFCF +S1135EB0BFF36F8F00BF00BF0C37BD465DF8047B96 +S1135EC0704700BF0000CC4080B584B002AF3120E1 +S1135ED001F063FA01233B7100237B710023BB7142 +S1135EE03B1D1A4603210848FEF76EFE002301936A +S1135EF0064B0093002300220A21054801F05BFAB7 +S1135F0000BF0837BD4680BD0040C64060830E40D8 +S1135F101C810E4010B5174A0020174901F0F0FA11 +S1135F204FF480734FF480620021124801F083FA29 +S1135F30124A1349012001F0E3FA4FF480734FF43D +S1135F40806200210D4801F076FA0E4B1B68022B8B +S1135F500EDD0D4A02200A4901F0D2FA4FF4807393 +S1135F604FF4806200210848BDE8104001F063BA94 +S1135F7010BD00BFCC8800006488000008890000C0 +S1135F806688000060880000448900002DE9F04123 +S1135F90D56880460E461446EB02576905D545F090 +S1135FA01005384601F050FCA061124B2B408BB118 +S1135FB0A169384601F051FC002806DAE3684FF085 +S1135FC0FF3043F08003E36011E025F4003525F051 +S1135FD01005E56032464146384601F044FC20F0A5 +S1135FE00041761AA1690E44A6610028E6D1BDE8F5 +S1135FF0F08100BF10000200F7B5044698B103B069 +S1136000BDE8F04001F00FBB07FB0460013401F070 +S11360100AFB002818BF4FF0FF35019BA342F3DCB5 +S1136020284603B0F0BD034B05463C27024E1B68CF +S11360300193F2E760880000CC8800002DE9F84362 +S1136040C66804463C4B0D46904633401BB90227B4 +S11360503846BDE8F883D0F81490484601F0F7FBC1 +S113606007460028F3D1B8F1010F2CD0B8F1020F84 +S11360702ED0B8F1000FEAD1002DE8DBB00404D52E +S11360802368E26A9A4238BFE362A169A9420EDC3E +S11360902368E26A934238BF134622695818801A6B +S11360A0A84204DB206B01EB000CAC4534DC00237C +S11360B046F02006A562C4E9013326F4032626F03F +S11360C04006E660C4E7204600F038F80544D3E70C +S11360D0484601F0B9FBB0F1000CE26804DA42F082 +S11360E080020127E260B3E723681846A3691946D2 +S11360F0E36A98422CBF0918C91892060B46216915 +S1136100A3EB010303D5A26A9342B8BF13466345C8 +S1136110ACBFED186544AFE76D1AB10744BF281A48 +S1136120A060F10726F0200644BF9B1AEB1A154421 +S113613048BF63602560C0E703001000C3689A0786 +S113614005D10E4B21224FF0FF301A60704703F047 +S113615020021B0309D512B1806A01387047036815 +S1136160826900691344181AF7E70AB1806A704714 +S11361700368826900691344181A7047C8880000CC +S113618080B586B000AFF860B9603B601346FB7120 +S113619000237B6100237B611CE0BB681B68013327 +S11361A07F2B08D9BB681B681946F868FDF74AFAC3 +S11361B0BB6800221A60BB681B681A46FB6813445C +S11361C0FA791A70BB681B685A1CBB681A607B6931 +S11361D001337B617A693B689A42DEDB00BF00BF12 +S11361E01837BD4680BD80B485B000AF7860396093 +S11361F00023FB600023FB7220E07B681B685A1CB1 +S11362007B681A607B681B681B78BB72BB7A2F2B78 +S11362100DD9BB7A392B0AD8FA6813469B0013446C +S11362205B001A46BB7A1344303BFB6006E07B6894 +S11362301B685A1E7B681A600123FB72FB7A002BD1 +S1136240DBD0FB6818461437BD465DF8047B704705 +S113625080B489B000AFF860B9607A60FB681B68ED +S1136260FB610623BB610023FB75FB690133FB6102 +S1136270FB691B782E2B24D10023BB610023FB7503 +S11362801BE0FB690133FB61FB691B78BB75BB7DBC +S11362902F2B0DD9BB7D392B0AD8BA6913469B0025 +S11362A013445B001A46BB7D1344303BBB6104E0DE +S11362B0FB69013BFB610123FB75FB7D002BE0D0F7 +S11362C002E0FB69013BFB61FB68FA691A60BB6988 +S11362D018462437BD465DF8047B704780B485B00A +S11362E000AF0346FB710023FB60FB796F2B08D0E2 +S11362F0FB79622B05D0FB79702B02D0FB79752BCF +S113630001D10123FB60FB6818461437BD465DF8D4 +S1136310047B704780B485B000AF0346FB71002353 +S1136320FB60FB79642B02D0FB79692B01D101233B +S1136330FB60FB6818461437BD465DF8047B704764 +S113634090B585B000AFF860B9607A60FB70BA6848 +S11363507B68D31A7C6A2022F96AB86AA04708E0ED +S11363603B6A5A1E3A621A787C6A0123F96AB86A4F +S1136370A0473B6A1B78002BF2D100BF00BF143743 +S1136380BD4690BD90B585B000AFF860B9607A6045 +S1136390FB70BA687B68D31A7C6A2022F96AB86AEF +S11363A0A04708E03B6A5A1E3A621A787C6A0123C5 +S11363B0F96AB86AA0473B6A1B78002BF2D100BF88 +S11363C000BF1437BD4690BD80B485B000AF03460E +S11363D0FB710023FB60FB79662B02D0FB79462B13 +S11363E001D10123FB60FB6818461437BD465DF8F4 +S11363F0047B704780B485B000AF0346FB71002373 +S1136400FB60FB79782B02D0FB79582B01D1012357 +S1136410FB60FB6818461437BD465DF8047B704783 +S113642080B485B000AF78607B681B68FB60FB6854 +S11364300133FB60FB681B78FB72FB7A682BF6D098 +S1136440FB7A6C2BF3D0FB68013BFB607B68FA683A +S11364501A6000BF1437BD465DF8047B704780B4F2 +S113646085B000AF0346FB71FB796F2B02D1082383 +S1136470FB730DE0FB79622B02D10223FB7307E06F +S1136480FB79702B02D11023FB7301E00A23FB7309 +S1136490FB7B18461437BD465DF8047B704780B417 +S11364A08DB000AFF860B9607A603B600023FB6197 +S11364B0FB68BB61BB695A1CBA6100221A707B6815 +S11364C0002B33D0BB681B68FB62FB6A002B29D10D +S11364D0BB6930221A70FB690133FB61FB6960E020 +S11364E0FA6A3B6892FBF3F33B613B693A6802FB4F +S11364F003F3FA6AD31ABB62BB6A002B04DABB6AE1 +S1136500C3F13003BB6202E0BB6A3033BB623B6958 +S1136510FB62BB695A1CBA61BA6AD2B21A70FB69CF +S11365200133FB61FB6A002BDAD139E0BB681B68DD +S11365307B627B6A002B30D1BB6930221A70FB6905 +S11365400133FB61FB692CE03B687A6AB2FBF3F32D +S11365507B613B687A6902FB03F37A6AD31A3B6274 +S11365603B6A092B03D83B6A30333B620AE097F855 +S11365703830002B01D0412200E061223B6A1344F1 +S11365800A3B3B627B697B62BB695A1CBA613A6A0B +S1136590D2B21A70FB690133FB617B6A002BD3D141 +S11365A0FB6918463437BD465DF8047B704790B5E7 +S11365B09FB004AFF860B9607A603B600023FB656C +S11365C00023BB650023FB61002387F857300023B9 +S11365D07B61FB687B647B6C1B78002B00F029815A +S11365E07B6C1B7887F8563097F85630252B0BD0E8 +S11365F097F8562007F11C013C6801237868A047EE +S11366007B6C01337B6413E1012387F8633007F16A +S1136610080207F1440311461846FFF7E4FD386504 +S113662007F1080107F1440300221846FFF710FEA2 +S1136630F86407F144031846FFF7F2FE7B6C01335C +S11366407B647B6C1B7887F8563097F85630184675 +S1136650FFF760FE0346012B25D1BB681A1DBA6003 +S11366601B68BB6107F1180107F1200097F863303C +S113667000930A230122FFF712FFB86507F12002F5 +S1136680BB6D1344FB65BA6D07F11C0303937B6870 +S113669002933B680193FB6D00930023396D002046 +S11366A0FFF74EFEC1E097F856301846FFF78CFE10 +S11366B00346012B06D1BB68073323F007030833D5 +S11366C0BB60B2E097F856301846FFF793FE0346D6 +S11366D0012B2ED197F85630782B02D1002387F85E +S11366E06330BB681A1DBA601B687B6107F1140133 +S11366F007F1200097F86330009310230022FFF77E +S1136700CEFEB86507F12002BB6D1344FB65BA6D7C +S113671097F8631007F11C0303937B6802933B68AB +S11367200193FB6D00930B46396D0020FFF72AFEA1 +S11367307BE097F856301846FFF7D0FD0346012B4F +S11367402FD1BB681A1DBA601B687B6197F856305D +S11367501846FFF784FE034687F8573097F857200A +S113676007F1140107F1200097F8633000931346F2 +S11367700022FFF794FEB86507F12002BB6D1344B5 +S1136780FB65BA6D07F11C0303937B6802933B68B6 +S11367900193FB6D00930023396D0020FFF7D0FDBA +S11367A043E097F85630632B0DD1BB681A1DBA60CD +S11367B01B68BB64BB6CDAB207F11C013C680123A3 +S11367C07868A04731E097F85630732B25D1BB6821 +S11367D01A1DBA601B687B667B6E002B25D0786E11 +S11367E000F048FE0346BB653A6DBB6DD31A07F152 +S11367F01C013C6820227868A04709E07B6E5A1C83 +S11368007A661A7807F11C013C6801237868A0476E +S11368107B6E1B78002BF1D107E097F8562007F127 +S11368201C013C6801237868A0477B6C01337B64BE +S1136830D1E600BFFB6918466C37BD4690BD08B56C +S1136840FCF77DFE08BD08B5FCF779FE08BD08B568 +S1136850FCF775FE08BD08B5FCF771FE08BD08B568 +S1136860FCF76DFE08BD08B5FCF769FE08BD08B568 +S1136870FCF765FE08BD08B5FCF761FE08BD08B568 +S1136880FCF75DFE08BD08B5FCF759FE08BD08B568 +S1136890FCF755FE08BD08B5FCF751FE08BD08B568 +S11368A0FCF74DFE08BD08B5FCF749FE08BD08B568 +S11368B0FCF745FE08BD08B5FCF741FE08BD08B568 +S11368C0FCF73DFE08BD08B5FCF739FE08BD08B568 +S11368D0FCF735FE08BD08B5FCF731FE08BD08B568 +S11368E0FEF7C0FC08BD08B5FEF7D0FC08BD08B52E +S11368F0FEF7E0FC08BD08B5FEF7F0FC08BD08B5DE +S1136900FEF700FD08BD08B5FEF710FD08BD08B58B +S1136910FEF720FD08BD08B5FEF730FD08BD08B53B +S1136920FEF740FD08BD08B5FEF750FD08BD08B5EB +S1136930FEF760FD08BD08B5FCF701FE08BD08B50B +S1136940FCF7FDFD08BD08B5FCF7F9FD08BD08B569 +S1136950FCF7F5FD08BD08B5FCF7F1FD08BD08B569 +S1136960FCF7EDFD08BD08B5FCF7E9FD08BD08B569 +S1136970FCF7E5FD08BD08B5FCF7E1FD08BD08B569 +S1136980FCF7DDFD08BD08B5FCF7D9FD08BD08B569 +S1136990FCF7D5FD08BD08B5FCF7D1FD08BD08B569 +S11369A0FCF7CDFD08BD08B5FCF7C9FD08BD08B569 +S11369B0FCF7C5FD08BD08B5FCF7C1FD08BD08B569 +S11369C0FCF7BDFD08BD08B5FCF7B9FD08BD08B569 +S11369D0FCF7B5FD08BD08B5FCF7B1FD08BD08B569 +S11369E0FCF7ADFD08BD08B5FCF7A9FD08BD08B569 +S11369F0FCF7A5FD08BD08B5FCF7A1FD08BD08B569 +S1136A00FCF79DFD08BD08B5FCF799FD08BD08B568 +S1136A10FCF795FD08BD08B5FCF791FD08BD08B568 +S1136A20FCF78DFD08BD08B5FCF789FD08BD08B568 +S1136A30FCF785FD08BD08B5FCF781FD08BD08B568 +S1136A40FCF77DFD08BD08B5FCF779FD08BD08B568 +S1136A50FCF775FD08BD08B5FCF771FD08BD08B568 +S1136A60FCF76DFD08BD08B5FCF769FD08BD08B568 +S1136A70FCF765FD08BD08B5FCF761FD08BD08B568 +S1136A80FCF75DFD08BD08B5FCF759FD08BD08B568 +S1136A90FCF755FD08BD08B5FCF751FD08BD08B568 +S1136AA0FCF74DFD08BD08B5FCF749FD08BD08B568 +S1136AB0FCF745FD08BD08B5FCF741FD08BD08B568 +S1136AC0FCF73DFD08BD08B5FCF739FD08BD08B568 +S1136AD0FCF735FD08BD08B5FCF731FD08BD08B568 +S1136AE0FCF72DFD08BD08B5FCF729FD08BD08B568 +S1136AF0FCF725FD08BD08B5FCF721FD08BD08B568 +S1136B00FCF71DFD08BD08B5FCF719FD08BD08B567 +S1136B10FCF715FD08BD08B5FCF711FD08BD08B567 +S1136B20FCF70DFD08BD08B5FCF709FD08BD08B567 +S1136B30FCF705FD08BD08B5FCF701FD08BD08B567 +S1136B40FCF7FDFC08BD08B5FCF7F9FC08BD08B569 +S1136B50FCF7F5FC08BD08B5FCF7F1FC08BD08B569 +S1136B60FCF7EDFC08BD08B5FCF7E9FC08BD08B569 +S1136B70FCF7E5FC08BD08B5FCF7E1FC08BD08B569 +S1136B80FCF7DDFC08BD08B5FCF7D9FC08BD08B569 +S1136B90FCF7D5FC08BD08B5FCF7D1FC08BD08B569 +S1136BA0FCF7CDFC08BD08B5FCF7C9FC08BD08B569 +S1136BB0FCF7C5FC08BD08B5FCF7C1FC08BD08B569 +S1136BC0FCF7BDFC08BD08B5FCF7B9FC08BD08B569 +S1136BD0FCF7B5FC08BD08B5FCF7B1FC08BD08B569 +S1136BE0FCF7ADFC08BD08B5FCF7A9FC08BD08B569 +S1136BF0FCF7A5FC08BD08B5FCF7A1FC08BD08B569 +S1136C00FCF79DFC08BD08B5FCF799FC08BD08B568 +S1136C10FCF795FC08BD08B5FCF791FC08BD08B568 +S1136C20FCF78DFC08BD08B5FCF789FC08BD08B568 +S1136C30FCF785FC08BD08B5FCF781FC08BD08B568 +S1136C40FCF77DFC08BD08B5FCF779FC08BD08B568 +S1136C50FCF775FC08BD08B5FCF771FC08BD08B568 +S1136C60FCF76DFC08BD08B5FCF769FC08BD08B568 +S1136C70FCF765FC08BD08B5FCF761FC08BD08B568 +S1136C80FCF75DFC08BD08B5FCF759FC08BD08B568 +S1136C90FCF755FC08BD08B5FCF751FC08BD08B568 +S1136CA0FCF74DFC08BD08B5FCF749FC08BD08B568 +S1136CB0FCF745FC08BD08B5FCF741FC08BD08B568 +S1136CC0FCF73DFC08BD08B5FCF739FC08BD08B568 +S1136CD0FCF735FC08BD08B5FCF731FC08BD08B568 +S1136CE0FCF72DFC08BD08B5FCF729FC08BD08B568 +S1136CF0FCF725FC08BD08B5FCF721FC08BD08B568 +S1136D00FCF71DFC08BD08B5FCF719FC08BD08B567 +S1136D10FCF715FC08BD08B5FCF711FC08BD08B567 +S1136D20FCF70DFC08BD08B5FCF709FC08BD08B567 +S1136D30FCF705FC08BD08B5FCF701FC08BD08B567 +S1136D40FCF7FDFB08BD08B5FCF7F9FB08BD08B569 +S1136D50FCF7F5FB08BD08B5FCF7F1FB08BD08B569 +S1136D60FCF7EDFB08BD08B5FCF7E9FB08BD08B569 +S1136D70FCF7E5FB08BD08B5FCF7E1FB08BD08B569 +S1136D80FCF7DDFB08BD08B5FCF7D9FB08BD08B569 +S1136D90FCF7D5FB08BD08B5FCF7D1FB08BD08B569 +S1136DA0FCF7CDFB08BD08B5FCF7C9FB08BD08B569 +S1136DB0FCF7C5FB08BD08B5FCF7C1FB08BD08B569 +S1136DC0FCF7BDFB08BD08B5FCF7B9FB08BD08B569 +S1136DD0FCF7B5FB08BD08B5FCF7B1FB08BD08B569 +S1136DE0FCF7ADFB08BD08B5FCF7A9FB08BD08B569 +S1136DF0FCF7A5FB08BD08B5FCF7A1FB08BD08B569 +S1136E00FCF79DFB08BD08B5FCF799FB08BD08B568 +S1136E10FCF795FB08BD08B5FCF791FB08BD08B568 +S1136E20FCF78DFB08BD08B5FCF789FB08BD08B568 +S1136E30FCF785FB08BD08B5FCF781FB08BD08B568 +S1136E40FCF77DFB08BD08B5FCF779FB08BD08B568 +S1136E50FCF775FB08BD08B5FCF771FB08BD08B568 +S1136E60FCF76DFB08BD08B5FCF769FB08BD08B568 +S1136E70FCF765FB08BD08B5FCF761FB08BD08B568 +S1136E80FCF75DFB08BD08B5FCF759FB08BD08B568 +S1136E90FCF755FB08BD08B5FCF751FB08BD08B568 +S1136EA0FCF74DFB08BD08B5FCF749FB08BD08B568 +S1136EB0FCF745FB08BD08B5FCF741FB08BD08B568 +S1136EC0FCF73DFB08BD08B5FCF739FB08BD08B568 +S1136ED0FCF735FB08BD08B5FCF731FB08BD08B568 +S1136EE0FCF72DFB08BD08B5FCF729FB08BD08B568 +S1136EF0FCF725FB08BD08B5FCF721FB08BD08B568 +S1136F00FCF71DFB08BD08B5FCF719FB08BD042000 +S1136F107146084202D0EFF3098001E0EFF30880E4 +S1136F2081690A884BF6AB639A4200D0FEE70231CE +S1136F30816120210160704700BF80B582B000AF3D +S1136F4003463A60FB710B46BB71BA79F8793B682A +S1136F500121FCF743FD00BF0837BD4680BD80B565 +S1136F6084B000AF03460A46FB711346BB71BA797D +S1136F70F87900230021FCF731FDF860FB6818461E +S1136F801037BD4680BD80B500AF0020FDF76AF81C +S1136F900346184680BD80B584B000AF786007F121 +S1136FA0080379681846FDF775FB0346002B06D1E4 +S1136FB007F108031846FDF797F8002300E00123C2 +S1136FC018461037BD4680BD80B483B000AF7860EA +S1136FD07B681846A0F101000028FBD100BF0C37E4 +S1136FE0BD465DF8047B704780B582B000AF0346B0 +S1136FF0FB71FB7901211846FDF790FD00BF0837AE +S1137000BD4680BD80B584B000AFF860B96013465A +S1137010FB71FB791A46B968F868FDF74FFE00BFAB +S11370201037BD4680BD80B582B000AF0346FB710A +S1137030FB7901211846FDF7BFFE00BF0837BD46A6 +S113704080BD80B483B000AF78607B689B6843F0F8 +S113705002027B689A607B689B6823F002027B686B +S11370609A6000BF0C37BD465DF8047B704780B45E +S113707000AF00BFBD465DF8047B704780B400AF2D +S113708000BFBD465DF8047B704780B485B000AF97 +S113709078607B68002B02D10023FB8102E042F67A +S11370A0AF73FB81FB8918461437BD465DF8047B3A +S11370B0704780B483B000AFEFF310833B603B684C +S11370C07B6072B600BF7B6818460C37BD465DF81E +S11370D0047B704780B485B000AF78607B68FB6048 +S11370E0FB6883F3108800BF00BF1437BD465DF80A +S11370F0047B704780B586B000AFF860B9607A60F1 +S11371003B6043F22153FB82FB681B78012B08D1BF +S1137110FB680C333A687968184600F0E0F80346D7 +S1137120FB82FB8A18461837BD4680BD80B586B001 +S113713000AFF860B9607A60FB68002BFCD0BB68D4 +S1137140002BFCD07B68002BFCD0FB687B617B6947 +S11371501B683B613B69002BFCD07B68BA6879698A +S11371603869FFF7C7FF034618461837BD4680BD88 +S113717080B584B000AF7860396043F22153FB815D +S11371803B68002BFCD07B68002BFCD000BF7B68E5 +S1137190BB6010220021B86800F033F93B681A7A0A +S11371A0BB681A703B681B7A012B0BD1BB6803F1D7 +S11371B00C023B68DB681946104600F071F8034680 +S11371C0FB8100E000BFFB8918461037BD4680BD37 +S11371D080B586B000AF786039607B68002BFCD046 +S11371E03B68002BFCD000BF7B687B613B683B6144 +S11371F0FFF75FFFF8607B699B685A1C7B699A60A4 +S1137200F868FFF767FF04220021386800F0F9F8F6 +S11372103B697A691A60002318461837BD4680BD59 +S113722080B586B000AF786039600023FB827B684C +S1137230002BFCD03B68002BFCD000BF7B683B617B +S11372403B68FB60FFF735FFB8603B695B68002B68 +S113725003D043F22253FB820AE03B69FA685A6086 +S113726004220021386800F0CCF8FB683A691A60FF +S1137270B868FFF72FFFFB8A18461837BD4680BD54 +S113728080B584B000AFF860B9607A607A68B96894 +S1137290F868FFF74BFF034618461037BD4680BD1C +S11372A080B584B000AF786039600023FB813B680F +S11372B0002BFCD07B68002BFCD000BF7B68BB603C +S11372C0BB6839681846FEF729FB0346FB81FB8936 +S11372D0002BFCD1FB8918461037BD4680BD80B514 +S11372E086B000AFF860B9607A60FB68002BFCD010 +S11372F0BB68002BFCD07B68002BFCD0FB687B6157 +S11373007B697A68B9681846FEF76EFB034618462F +S11373101837BD4680BD80B500AF1920FEF7C0FB0D +S11373200346184680BD80B582B000AFFFF7F3FF77 +S113733078607B6801224FF4E1310120FCF7AAF95F +S113734000BF0837BD4680BD80B483B000AF78600D +S11373500B46FB707B685B6923F000527B685A61C3 +S11373607B685B6823F4F852FB781B0203F4F85340 +S11373701A437B685B681A437B685A6000BF7B686A +S11373809B6803F00043B3F1004FF8D100BF00BF86 +S11373900C37BD465DF8047B704780B582B000AF02 +S11373A00346FB71FB7901211846FEF75DFD00BF22 +S11373B00837BD4680BD80B485B000AFF860B960C1 +S11373C07A603B60BB6803F00F01FB691B0103F0AB +S11373D01002FB680A431A607B68002B02D07B68AA +S11373E03A681A6000BF1437BD465DF8047B7047E5 +S11373F008B5FEF78FFDBDE80840FCF77DBA00F044 +S1137400EDB900F005BAA8B14FF0805340F80C3C38 +S113741050F8042C72B11368B3F1805F0AD150F8AC +S1137420083C516803330B4440F8083C936840F827 +S1137430043CEDE7704770B5C468A50708D0B2F501 +S1137440007F11D0B2F5806F04D0B2F5807F0BD0ED +S1137450012008E000F124010123224301610160BD +S1137460C361C260002070BD5E1E6FF07F45AE42F6 +S1137470F3D3EDE7421C10B58307044616D1234627 +S113748054F8041BA1F1013020EA010010F0803F00 +S1137490F5D011F0FF0F11D011F47F4F0CD011F47F +S11374A07F0F14BF23460333981A04E010F8013BFE +S11374B0002BE1D1801A10BD0233F5E70133F3E765 +S11374C0C368826923F0200310B5C3600446836A4D +S11374D09A420ED000F048F8E36823F4405323F0B6 +S11374E0100343F01003E360A36AA3612369E3621A +S11374F02360E36823F4804323F04003E36010BD7A +S113750070B50D4606461046144600F056F82B7822 +S1137510722B17D0772B18D0612B23D1082348F274 +S1137520020215F8011F2B2912D0622915D01B075E +S1137530E260666104D5022200212046FEF77EFD4A +S1137540204670BD00230122EBE704230222E8E772 +S113755042F0030243F00203E3E742F0040243F083 +S11375600103DEE70024EBE738B50168044605694A +S1137570C36AC06820F40022E26000F08202022A9A +S113758002D04FF0FF3038BD10F48030FBD0994268 +S113759038BF19468D4208D1E3680020E56223F420 +S11375A080332560A060E360EDE72246491B28464E +S11375B0FEF7ECFC0028EFD0E3E7F0B5C46889B02F +S11375C00546A10722D0220718D4D0E90467FEF7A4 +S11375D013FD384600F035F9230502D53046FFF790 +S11375E012FFA40DA40514F1A54F07D12022296A86 +S11375F0684600F035F9684600F00BF83C2200219B +S11376002846FFF7FEFE002009B0F0BD4FF0FF3022 +S1137610FAE710B50446FFF72DFF01462046BDE802 +S1137620104000F017B9C36870B513F003060446A0 +S113763011D09B0611D5856AFFF742FFE368204607 +S113764023F44053E360FFF78FFF002206462946E8 +S11376502046FEF7F3FC304670BD816905680D4491 +S113766001696D1AEAE75FF0000C30B51C0022D105 +S113767012006FD0914206D305460846002100F05F +S11376806FF80446284600F06BF80A462146BDE828 +S113769030401CF0404F08BF704703D54942404278 +S11376A061F100015FEA8C0C38BF70475B425242C3 +S11376B063F10003704742D41C0C04BF1B040CF19B +S11376C0100C13F07F4F04BF1B020CF1080C13F0D5 +S11376D0704F04BF1B010CF1040C13F0404F04BFA6 +S11376E00CF1020C5FEA83035CBF0CF1010C5B003C +S11376F0CCF1200E22FA0EF4234302FA0CF200FA23 +S11377000CF520FA0EF001FA0CF4204321FA0EF1E4 +S113771014461A4600F024F8A4FB0023AA1A71EBBD +S113772003033CBF1B190138CCF1200E22FA0CF2E2 +S113773003FA0EF4224323FA0CF30021A7E7821A7A +S113774071EB03033CBF02460B464FF0000141F1CD +S113775000009CE700200021BDE8304000F03DB867 +S11377600423B1EB122F09D2090241EA106100028D +S1137770013B08BF7047B1EB122FF5D30018494104 +S113778034BF9142891A4041494134BF9142891A18 +S11377904041494134BF9142891A4041494134BF73 +S11377A09142891A4041494134BF9142891A40416A +S11377B0494134BF9142891A4041494134BF914201 +S11377C0891A4041494134BF9142891A4041A3F189 +S11377D0010313F00F0FD2D17047704740EA010341 +S11377E0DB0703460CD40346043A22BF51F804CB0A +S11377F043F804CBB2F10402F7D2043208BF704755 +S1137800013A24BF11F801CB03F801CBF8D8704733 +S1137810034613F0030F0ED101F0FF0141EA0121E9 +S113782041EA0141043A24BF43F8041BB2F10402C3 +S1137830F9D202F10402013A24BF03F8011BFAE76A +S113784070474FF0FF3070474FF0FF3070474FF0F4 +S1137850FF3070474FF0FF3070474FF0FF307047F4 +S11378604FF0FF30704710467047FFFF41535345B8 +S11378705254204552524F522022202573200A0090 +S11378802E66736C5F616E61746F705F61692E63E5 +S11378903A323631203A2066616C736500FFFFFF8F +S11378A02E66736C5F636C6F636B2E683A3233378A +S11378B038203A206672657100FFFFFF020503005D +S11378C007160F1C02050300140F09180205030014 +S11378D00F18090D02050300140F0918020503000F +S11378E018090B11020503001018090D0205030005 +S11378F010180B0902050300140F0A1802050300EF +S11379000910180A020503001018090D02050300E6 +S11379101018090D020503000F181A0D02050300C3 +S11379201018090D020503001018090D02050300C3 +S1137930101813140205030010181A1C0205030082 +S113794010181A1C02050300101813140205030072 +S11379501018131402050300101813140205030071 +S113796011090C0F0205030011090C0F0205030095 +S11379701018090D020503001018090D0205030073 +S1137980140F0D18020503001018090D0205030059 +S11379901018090D020503001018090D0205030053 +S11379A01018090D020503001018090D0205030043 +S11379B01018090D020503001018090D0205030033 +S11379C01018090D020503001018090D0205030023 +S11379D01018090D02050300140F0D180205030009 +S11379E0140F0D18020503001018090D02050300F9 +S11379F01018090D020503001018090D02050300F3 +S1137A001018090D02050300140F0D1802050300D8 +S1137A10140F0D18020503001318090D02050300C5 +S1137A201318090D020503001318090D02050300BC +S1137A301318090D02050300140F1318020503009F +S1137A40140F1318020503001018090D0205030092 +S1137A501018090D02050300171A180B020503007C +S1137A60171A180B02050300171A180B0205030056 +S1137A70171A180B02050300171A180B0205030046 +S1137A80171A180B02050300171A180B0205030036 +S1137A900C0A1807020503000C0A18070205030064 +S1137AA018101A0D0205030018101A0D0205030020 +S1137AB0140F1A18020503001A0F130D0205030010 +S1137AC01A13180D020503001A13180D02050300FA +S1137AD01A13180D02050300140F1A1802050300E7 +S1137AE0090B0F1C02050300090C111C02050300FD +S1137AF0090C111C02050300090A111C02050300EC +S1137B00090A111C020503000C0F0A1C02050300DC +S1137B100C0F0A1C020503000C0F0A1C02050300CB +S1137B200C0F121C020503000C09121802050300B5 +S1137B300D01121A2E66736C5F636C6F636B2E6398 +S1137B403A3636203A2028636F6E6669672D3E6C9C +S1137B506F6F7044697669646572203C3D204152C0 +S1137B604D5F504C4C5F4449565F53454C5F4D410B +S1137B7058292026262028636F6E6669672D3E6C7F +S1137B806F6F7044697669646572203E3D2041528E +S1137B904D5F504C4C5F4449565F53454C5F4D49D3 +S1137BA04E2900FF2E66736C5F636C6F636B2E63EC +S1137BB03A323231203A2066726163203C3D2050D3 +S1137BC046445F465241435F4D4158202626206675 +S1137BD0726163203E3D205046445F465241435FFC +S1137BE04D494E002E66736C5F636C6F636B2E633E +S1137BF03A323334203A2066616C736500FFFFFF2C +S1137C002E66736C5F636C6F636B2E633A3235362A +S1137C10203A2028706C6C203D3D206B434C4F4330 +S1137C204B5F506C6C5379733229207C7C20287014 +S1137C306C6C203D3D206B434C4F434B5F506C6C50 +S1137C4053797333290000002E66736C5F636C6F85 +S1137C50636B2E633A323639203A2066616C736561 +S1137C60000000002E66736C5F636C6F636B2E63A1 +S1137C703A323734203A202866726163203E3D2030 +S1137C805046445F465241435F4D494E29202626C3 +S1137C90202866726163203C3D205046445F465272 +S1137CA041435F4D415829002E66736C5F636C6FCE +S1137CB0636B2E633A353430203A206366670000E4 +S1137CC02E66736C5F636C6F636B2E633A3534326C +S1137CD0203A202866726571496E4D687A203C3DD1 +S1137CE020726566467265712920262620286672F0 +S1137CF06571496E4D687A203E3D20313536290044 +S1137D002E66736C5F636C6F636B2E633A3837381F +S1137D10203A2028706C6C203D3D206B434C4F432F +S1137D204B5F506C6C417564696F29207C7C202802 +S1137D30706C6C203D3D206B434C4F434B5F506C4B +S1137D406C566964656F29002E66736C5F636C6F93 +S1137D50636B2E633A393532203A2066616C736561 +S1137D60000000002E66736C5F636C6F636B2E63A0 +S1137D703A393535203A2066726571002E66736C87 +S1137D805F636C6F636B2E633A31303637203A2071 +S1137D9066616C73650000002E66736C5F636C6FC4 +S1137DA0636B2E633A31303730203A206672657146 +S1137DB000FFFFFF2E66736C5F636F6D6D6F6E2E39 +S1137DC0633A323438203A20305520213D2064650E +S1137DD06C61795F757300002E66736C5F636F6D01 +S1137DE06D6F6E2E633A323530203A20636F756EB4 +S1137DF074203C3D2055494E5433325F4D41580068 +S1137E000000000000C01240000013400040134076 +S1137E100080134000C013400000144000C0C5405F +S1137E200000C6400040C6400080C64000C0C640B6 +S1137E300000C7400000CA400080004200C0004269 +S1137E408A33333333333333333333333333FFFF0F +S1137E502E66736C5F6770696F2E633A3537203A0C +S1137E6020696E7374616E6365203C2041525241F7 +S1137E70595F53495A4528735F6770696F4261734C +S1137E80657329002E66736C5F6770696F2E633AA1 +S1137E90313133203A2070696E203C203332550052 +S1137EA00000000000C007400000084000400840F7 +S1137EB00080084000C0084000000940004009401C +S1137EC00080094000C0094000000A400040C24050 +S1137ED00080C2408A565758595A5B5C5D5E5F60A9 +S1137EE061FFFFFF2E66736C5F6C70756172742E98 +S1137EF0633A313236203A20696E7374616E636579 +S1137F00203C2041525241595F53495A4528735FDE +S1137F106C707561727442617365732900FFFFFFB1 +S1137F202E66736C5F6C70756172742E633A3234B2 +S1137F3035203A204E554C4C20213D20636F6E660F +S1137F40696700002E66736C5F6C70756172742EC5 +S1137F50633A323436203A203055203C20636F6E29 +S1137F606669672D3E62617564526174655F427033 +S1137F70730000002E66736C5F6C70756172742EF2 +S1137F80633A323438203A202875696E74385F7445 +S1137F902946534C5F464541545552455F4C505514 +S1137FA04152545F4649464F5F53495A456E2862D1 +S1137FB061736529203E3D20636F6E6669672D3EBF +S1137FC074784669666F57617465726D61726B008F +S1137FD02E66736C5F6C70756172742E633A323402 +S1137FE039203A202875696E74385F742946534CD9 +S1137FF05F464541545552455F4C50554152545F7C +S11380004649464F5F53495A456E28626173652954 +S1138010203E3D20636F6E6669672D3E7278466927 +S1138020666F57617465726D61726B002E66736C56 +S11380305F6C70756172742E633A353231203A2068 +S11380404E554C4C20213D20636F6E66696700FFDE +S11380502E66736C5F6C70756172742E633A383778 +S113806038203A204E554C4C20213D2064617461E7 +S113807000FFFFFF2E66736C5F706D752E633A38D8 +S11380803638203A20636F6E66696720213D204EA2 +S1138090554C4C002E66736C5F706D752E633A38C8 +S11380A03836203A20636F6E66696720213D204E82 +S11380B0554C4C000000000000C007400000084080 +S11380C0004008400080084000C00840000009400B +S11380D0004009400080094000C0094000000A40F7 +S11380E00040C2400080C2402E66736C5F616461D0 +S11380F0707465725F6C70756172742E633A323598 +S113810034203A2068616E646C6500002E66736CDE +S11381105F616461707465725F6C70756172742EF6 +S1138120633A323535203A20636F6E666967000022 +S11381302E66736C5F616461707465725F6C7075D8 +S11381406172742E633A323536203A20636F6E665C +S113815069672D3E696E7374616E6365203C2028E7 +S113816073697A656F6628735F4C707561727441C8 +S11381706461707465724261736529202F2073698C +S11381807A656F66284C50554152545F5479706536 +S1138190202A2929000000002E66736C5F61646147 +S11381A0707465725F6C70756172742E633A3235E7 +S11381B037203A20735F4C7075617274416461704A +S11381C0746572426173655B636F6E6669672D3EA9 +S11381D0696E7374616E63655D00FFFF2E66736C78 +S11381E05F616461707465725F6C70756172742E26 +S11381F0633A333534203A2068616E646C6500005C +S11382002E66736C5F616461707465725F6C707507 +S11382106172742E633A333535203A206461746197 +S1138220000000002E66736C5F6164617074657297 +S11382305F6C70756172742E633A333536203A2060 +S11382406C656E67746800FF433A5C5573657273BE +S11382505C6E786130363534385C446F63756D65B7 +S11382606E74735C4D43555870726573736F4944F3 +S1138270455F31312E332E305F353135385F7072C2 +S11382806332202D20436F70795C776F726B73704B +S11382906163655C65766B6D696D787274313137D5 +S11382A0305F696C65645F626C696E6B795F636D86 +S11382B0375F696E745F52414D5C647269766572B2 +S11382C0732F66736C5F636C6F636B2E683A323323 +S11382D03738203A206672657100FFFF02050300FB +S11382E007160F1C02050300140F091802050300EA +S11382F00F18090D02050300140F091802050300E5 +S113830018090B11020503001018090D02050300DA +S113831010180B0902050300140F0A1802050300C4 +S11383200910180A020503001018090D02050300BC +S11383301018090D020503000F181A0D0205030099 +S11383401018090D020503001018090D0205030099 +S1138350101813140205030010181A1C0205030058 +S113836010181A1C02050300101813140205030048 +S11383701018131402050300101813140205030047 +S113838011090C0F0205030011090C0F020503006B +S11383901018090D020503001018090D0205030049 +S11383A0140F0D18020503001018090D020503002F +S11383B01018090D020503001018090D0205030029 +S11383C01018090D020503001018090D0205030019 +S11383D01018090D020503001018090D0205030009 +S11383E01018090D020503001018090D02050300F9 +S11383F01018090D02050300140F0D1802050300DF +S1138400140F0D18020503001018090D02050300CE +S11384101018090D020503001018090D02050300C8 +S11384201018090D02050300140F0D1802050300AE +S1138430140F0D18020503001318090D020503009B +S11384401318090D020503001318090D0205030092 +S11384501318090D02050300140F13180205030075 +S1138460140F1318020503001018090D0205030068 +S11384701018090D02050300171A180B0205030052 +S1138480171A180B02050300171A180B020503002C +S1138490171A180B02050300171A180B020503001C +S11384A0171A180B02050300171A180B020503000C +S11384B00C0A1807020503000C0A1807020503003A +S11384C018101A0D0205030018101A0D02050300F6 +S11384D0140F1A18020503001A0F130D02050300E6 +S11384E01A13180D020503001A13180D02050300D0 +S11384F01A13180D02050300140F1A1802050300BD +S1138500090B0F1C02050300090C111C02050300D2 +S1138510090C111C02050300090A111C02050300C1 +S1138520090A111C020503000C0F0A1C02050300B2 +S11385300C0F0A1C020503000C0F0A1C02050300A1 +S11385400C0F121C020503000C091218020503008B +S11385500D01121A433A5C55736572735C6E78614F +S113856030363534385C446F63756D656E74735C96 +S11385704D43555870726573736F4944455F31318B +S11385802E332E305F353135385F70726332202DD3 +S113859020436F70795C776F726B73706163655C95 +S11385A065766B6D696D787274313137305F696CE3 +S11385B065645F626C696E6B795F636D375F696E6A +S11385C0745F52414D5C647269766572732F667391 +S11385D06C5F636C6F636B2E683A32323833203AC7 +S11385E020636F6E666967000205030007160F1C9F +S11385F002050300140F0918020503000F18090DE2 +S113860002050300140F09180205030018090B11D1 +S1138610020503001018090D0205030010180B09C8 +S113862002050300140F0A18020503000910180AB2 +S1138630020503001018090D020503001018090DA6 +S1138640020503000F181A0D020503001018090D86 +S1138650020503001018090D020503001018131475 +S11386600205030010181A1C0205030010181A1C36 +S11386700205030010181314020503001018131444 +S113868002050300101813140205030011090C0F4E +S11386900205030011090C0F020503001018090D4F +S11386A0020503001018090D02050300140F0D182C +S11386B0020503001018090D020503001018090D26 +S11386C0020503001018090D020503001018090D16 +S11386D0020503001018090D020503001018090D06 +S11386E0020503001018090D020503001018090DF6 +S11386F0020503001018090D020503001018090DE6 +S113870002050300140F0D1802050300140F0D18C1 +S1138710020503001018090D020503001018090DC5 +S1138720020503001018090D020503001018090DB5 +S113873002050300140F0D1802050300140F0D1891 +S1138740020503001318090D020503001318090D8F +S1138750020503001318090D020503001318090D7F +S113876002050300140F131802050300140F131855 +S1138770020503001018090D020503001018090D65 +S113878002050300171A180B02050300171A180B29 +S113879002050300171A180B02050300171A180B19 +S11387A002050300171A180B02050300171A180B09 +S11387B002050300171A180B020503000C0A180718 +S11387C0020503000C0A18070205030018101A0D0D +S11387D00205030018101A0D02050300140F1A18DD +S11387E0020503001A0F130D020503001A13180DD6 +S11387F0020503001A13180D020503001A13180DBD +S113880002050300140F1A1802050300090B0F1CBC +S113881002050300090C111C02050300090C111CBC +S113882002050300090A111C02050300090A111CB0 +S1138830020503000C0F0A1C020503000C0F0A1C9E +S1138840020503000C0F0A1C020503000C0F121C86 +S1138850020503000C091218020503000D01121A87 +S10B8860030000007200770020 +S107886800A4781FCD +S90334E1E7 diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin b/tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/output.bin similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin rename to tests/nxpimage/data/hab/export/rt1170_RAM_unsigned/output.bin diff --git a/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/config.bd b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/config.bd new file mode 100644 index 00000000..153de49b --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/config.bd @@ -0,0 +1,86 @@ +options { + flags = 0x08; + startAddress = 0x2024ff00; + ivtOffset = 0x0; + initialLoadSize = 0x100; + entryPointAddress = 0x202629e1; + signatureTimestamp = "27/04/2023 08:18:40"; +} + +sources { + elfFile = extern(0); +} + +constants { + SEC_CSF_HEADER = 20; + SEC_CSF_INSTALL_SRK = 21; + SEC_CSF_INSTALL_CSFK = 22; + SEC_CSF_INSTALL_NOCAK = 23; + SEC_CSF_AUTHENTICATE_CSF = 24; + SEC_CSF_INSTALL_KEY = 25; + SEC_CSF_AUTHENTICATE_DATA = 26; + SEC_CSF_INSTALL_SECRET_KEY = 27; + SEC_CSF_DECRYPT_DATA = 28; + SEC_NOP = 29; + SEC_SET_MID = 30; + SEC_SET_ENGINE = 31; + SEC_INIT = 32; + SEC_UNLOCK = 33; +} + +section (SEC_CSF_HEADER; + Header_Version="4.2", + Header_HashAlgorithm="sha256", + Header_Engine="ANY", + Header_EngineConfiguration=0, + Header_CertificateFormat="x509", + Header_SignatureFormat="CMS" + ) +{ +} + +section (SEC_CSF_INSTALL_SRK; + InstallSRK_Table="gen_hab_certs\SRK_hash.bin", + InstallSRK_SourceIndex=0 + ) +{ +} + +section (SEC_CSF_INSTALL_CSFK; + InstallCSFK_File="crts\CSF1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallCSFK_CertificateFormat="x509" + ) +{ +} + +section (SEC_CSF_AUTHENTICATE_CSF) +{ +} + +section (SEC_CSF_INSTALL_KEY; + InstallKey_File="crts\IMG1_1_sha256_2048_65537_v3_usr_crt.pem", + InstallKey_VerificationIndex=0, + InstallKey_TargetIndex=2) +{ +} + +section (SEC_CSF_AUTHENTICATE_DATA; + AuthenticateData_VerificationIndex=2, + AuthenticateData_Engine="ANY", + AuthenticateData_EngineConfiguration=0) +{ +} + +section (SEC_SET_ENGINE; + SetEngine_HashAlgorithm = "sha256", + SetEngine_Engine = "ANY", + SetEngine_EngineConfiguration = "0") +{ +} + +section (SEC_UNLOCK; + Unlock_Engine = "SNVS", + Unlock_Features = "ZMK WRITE" + ) +{ +} diff --git a/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..df1d79e2 --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419897 (0x12345679) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: Apr 24 16:20:47 2023 GMT + Not After : Apr 21 16:20:47 2033 GMT + Subject: CN=CSF1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cd:20:ef:85:67:08:f0:aa:69:c6:3f:1e:fd:ea: + ba:09:9f:23:2a:01:e3:9c:15:c9:f3:41:54:be:93: + e6:78:5d:8f:85:5d:f3:40:6c:aa:4b:d8:c5:ec:56: + b8:eb:34:82:7c:59:7c:38:5b:f3:d9:3b:91:29:d6: + 85:87:ab:b6:01:33:6b:01:51:f5:76:af:73:d0:ce: + 40:00:82:19:a7:25:05:de:55:de:ce:de:22:0a:02: + b4:cd:85:ef:7c:56:47:c9:2b:71:5b:0e:9e:74:70: + 0b:57:39:b6:53:3b:6f:65:37:1b:b0:ab:da:4f:05: + 79:99:12:d2:f1:82:29:9b:04:e2:a8:9d:34:6e:d1: + e7:81:ef:d8:12:55:7d:73:73:a5:6e:eb:f2:24:91: + 75:85:28:d0:5e:ad:ff:ee:1f:9f:f7:a7:a8:1f:de: + d8:3a:c2:ff:6a:4c:bc:e7:6c:f6:01:2c:83:70:1e: + 83:a6:34:13:63:c7:cf:85:7b:73:d4:d5:ef:6e:9b: + 70:da:41:f8:95:04:15:be:6b:16:19:8e:e1:cc:e5: + 6d:dc:8f:92:3f:0b:fa:4b:08:78:b3:17:b9:a9:63: + 3c:64:b1:84:88:fd:3f:2f:b4:4a:1b:eb:e6:70:f8: + a1:2c:58:d2:49:11:35:20:aa:1d:26:24:d6:c6:9f: + 2f:f1 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 95:9A:F4:C5:B6:46:3A:28:AE:A8:C0:3C:55:73:9F:54:81:9E:FC:F9 + X509v3 Authority Key Identifier: + keyid:47:02:B6:D3:0D:05:80:89:08:48:CC:C9:49:FE:79:DD:73:78:75:BD + + Signature Algorithm: sha256WithRSAEncryption + a7:e3:12:fb:c4:7f:f6:54:f8:01:b3:cc:af:5a:fa:ae:10:44: + 06:fa:23:f8:62:2e:a1:a2:45:1f:22:67:30:64:54:9a:2e:04: + ac:51:a0:79:87:87:c9:09:88:dc:60:a1:0c:aa:3d:5f:fe:40: + ce:1f:11:ab:33:63:51:14:d0:11:f4:04:3e:87:0c:1c:f3:f5: + c8:d2:3c:8f:aa:8e:19:01:78:f7:5e:38:a4:44:a3:ce:2a:eb: + 39:eb:c3:3a:94:2b:b0:e0:91:d3:a5:ba:0b:42:3f:cb:3f:45: + a3:48:dc:49:f6:23:6e:ff:af:ab:5c:29:b1:e8:6d:a8:08:19: + 7d:84:26:49:ae:9d:56:c2:29:d5:7f:4a:b4:16:fd:ee:10:63: + 4a:c5:87:d0:c0:28:4e:26:57:0e:2c:49:c3:22:fb:10:5a:b5: + 13:e0:c0:12:19:f9:e0:4a:42:45:1a:62:e0:e7:53:1f:80:ee: + cd:c7:72:21:ad:18:05:3e:e9:21:1c:cb:75:4b:17:be:d3:29: + f7:87:37:4a:c9:1c:20:77:9c:e7:70:e9:2b:c2:91:98:e9:fa: + 5b:d8:4c:b9:ac:74:ac:1c:94:84:cf:f1:d6:9c:32:23:7a:de: + ea:e6:dc:93:8d:0b:6a:19:78:09:1a:41:85:7c:33:61:15:a4: + 04:6a:ea:32 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWeTANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDQyNDE2MjA0N1oXDTMz +MDQyMTE2MjA0N1owKjEoMCYGA1UEAxQfQ1NGMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM0g74VnCPCq +acY/Hv3qugmfIyoB45wVyfNBVL6T5nhdj4Vd80BsqkvYxexWuOs0gnxZfDhb89k7 +kSnWhYertgEzawFR9Xavc9DOQACCGaclBd5V3s7eIgoCtM2F73xWR8krcVsOnnRw +C1c5tlM7b2U3G7Cr2k8FeZkS0vGCKZsE4qidNG7R54Hv2BJVfXNzpW7r8iSRdYUo +0F6t/+4fn/enqB/e2DrC/2pMvOds9gEsg3Aeg6Y0E2PHz4V7c9TV726bcNpB+JUE +Fb5rFhmO4czlbdyPkj8L+ksIeLMXualjPGSxhIj9Py+0Shvr5nD4oSxY0kkRNSCq +HSYk1safL/ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFJWa9MW2RjoorqjA +PFVzn1SBnvz5MB8GA1UdIwQYMBaAFEcCttMNBYCJCEjMyUn+ed1zeHW9MA0GCSqG +SIb3DQEBCwUAA4IBAQCn4xL7xH/2VPgBs8yvWvquEEQG+iP4Yi6hokUfImcwZFSa +LgSsUaB5h4fJCYjcYKEMqj1f/kDOHxGrM2NRFNAR9AQ+hwwc8/XI0jyPqo4ZAXj3 +XjikRKPOKus568M6lCuw4JHTpboLQj/LP0WjSNxJ9iNu/6+rXCmx6G2oCBl9hCZJ +rp1WwinVf0q0Fv3uEGNKxYfQwChOJlcOLEnDIvsQWrUT4MASGfngSkJFGmLg51Mf +gO7Nx3IhrRgFPukhHMt1Sxe+0yn3hzdKyRwgd5zncOkrwpGY6fpb2Ey5rHSsHJSE +z/HWnDIjet7q5tyTjQtqGXgJGkGFfDNhFaQEauoy +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem new file mode 100644 index 00000000..396b741a --- /dev/null +++ b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem @@ -0,0 +1,79 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 305419898 (0x1234567a) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=SRK1_sha256_2048_65537_v3_ca + Validity + Not Before: Apr 24 16:20:47 2023 GMT + Not After : Apr 21 16:20:47 2033 GMT + Subject: CN=IMG1_1_sha256_2048_65537_v3_usr + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ae:ed:d5:34:87:81:d0:ef:b2:c0:52:c4:77:96: + 9e:4f:dc:5b:cc:60:5a:a0:11:7b:e6:8f:ae:d0:97: + a6:7c:de:c1:89:e9:f1:6c:a4:2c:0c:e8:56:79:56: + 65:65:a5:67:65:58:bc:6a:77:88:43:c9:3d:0f:7c: + d3:7d:89:11:da:3e:70:76:93:08:d8:4b:35:6f:2c: + 0a:a4:5e:93:69:05:d7:55:e9:a7:12:a8:28:56:44: + 10:08:3d:c0:aa:ac:03:fd:d7:fe:87:f4:91:e7:9e: + 62:e8:53:46:86:5c:38:67:1b:a8:cb:b8:a8:8d:7b: + 9d:1b:d8:29:64:75:ba:6a:21:4d:d5:61:32:8b:33: + e6:0c:a6:2b:f5:ce:ef:42:a3:fa:c9:33:92:f5:9d: + 55:a3:c3:61:2b:b5:66:35:37:3d:7f:ff:91:89:4d: + e3:09:43:da:38:83:7a:e2:5b:8e:1e:37:26:07:cb: + df:5c:80:65:2b:b0:e0:ea:1d:47:ff:97:a3:90:3f: + d9:fe:1c:57:b1:a3:6e:61:2f:a0:b6:c9:14:a0:ff: + 10:78:f0:bb:00:14:4e:7d:f8:f4:30:51:0e:45:4b: + 52:54:88:35:58:a8:66:09:af:e7:f3:d2:b4:cf:04: + a3:ee:7c:54:22:f9:00:9a:0b:c1:f5:4b:9d:e4:60: + 1b:93 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 29:C8:75:6F:D4:2F:B7:9D:D3:0B:53:F4:32:74:05:5D:47:16:5D:45 + X509v3 Authority Key Identifier: + keyid:47:02:B6:D3:0D:05:80:89:08:48:CC:C9:49:FE:79:DD:73:78:75:BD + + Signature Algorithm: sha256WithRSAEncryption + 89:da:ed:7c:f2:b2:dc:f2:e9:ea:77:4f:16:c3:54:cc:15:40: + 0a:a6:25:3d:fa:7f:62:bf:df:32:5f:9e:f2:e0:e6:16:fc:81: + fa:be:60:7c:7b:99:56:30:16:a1:30:0c:49:f2:13:3d:06:89: + 23:f7:e9:60:95:40:ae:19:68:d2:20:dc:cd:1e:12:25:a4:01: + da:bd:74:41:9f:64:27:5b:e0:f1:61:60:e3:22:36:68:b6:c4: + 19:31:bc:9c:89:11:0a:84:d5:56:81:77:52:20:e5:f4:fc:f6: + 3c:2b:2d:89:97:df:ab:73:e8:89:f6:3a:74:2c:f3:ce:1f:8b: + 72:e1:c4:84:b0:54:f6:00:57:a6:05:a7:c4:d8:0e:8c:b4:02: + 9f:88:e7:8a:62:1c:88:93:94:ac:31:ea:13:34:10:47:84:68: + 73:81:c7:a2:de:ad:11:0b:32:b7:24:75:b6:e5:f5:be:d0:40: + c4:9c:09:b7:48:f4:23:01:e0:52:cf:e0:22:29:29:a5:00:fd: + 83:81:82:53:34:d3:18:6d:62:10:1b:0d:87:7b:6e:2a:24:1e: + fe:9b:72:9f:e5:99:d5:cb:e9:f5:ee:4a:29:02:39:a1:3b:c4: + 75:8b:93:8c:bf:3d:f8:99:b1:35:15:18:af:7e:fb:ac:fc:7e: + f0:4f:ca:75 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIEEjRWejANBgkqhkiG9w0BAQsFADAnMSUwIwYDVQQDFBxT +UksxX3NoYTI1Nl8yMDQ4XzY1NTM3X3YzX2NhMB4XDTIzMDQyNDE2MjA0N1oXDTMz +MDQyMTE2MjA0N1owKjEoMCYGA1UEAxQfSU1HMV8xX3NoYTI1Nl8yMDQ4XzY1NTM3 +X3YzX3VzcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK7t1TSHgdDv +ssBSxHeWnk/cW8xgWqARe+aPrtCXpnzewYnp8WykLAzoVnlWZWWlZ2VYvGp3iEPJ +PQ98032JEdo+cHaTCNhLNW8sCqRek2kF11XppxKoKFZEEAg9wKqsA/3X/of0keee +YuhTRoZcOGcbqMu4qI17nRvYKWR1umohTdVhMosz5gymK/XO70Kj+skzkvWdVaPD +YSu1ZjU3PX//kYlN4wlD2jiDeuJbjh43JgfL31yAZSuw4OodR/+Xo5A/2f4cV7Gj +bmEvoLbJFKD/EHjwuwAUTn349DBRDkVLUlSINVioZgmv5/PStM8Eo+58VCL5AJoL +wfVLneRgG5MCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFCnIdW/UL7ed0wtT +9DJ0BV1HFl1FMB8GA1UdIwQYMBaAFEcCttMNBYCJCEjMyUn+ed1zeHW9MA0GCSqG +SIb3DQEBCwUAA4IBAQCJ2u188rLc8unqd08Ww1TMFUAKpiU9+n9iv98yX57y4OYW +/IH6vmB8e5lWMBahMAxJ8hM9Bokj9+lglUCuGWjSINzNHhIlpAHavXRBn2QnW+Dx +YWDjIjZotsQZMbyciREKhNVWgXdSIOX0/PY8Ky2Jl9+rc+iJ9jp0LPPOH4ty4cSE +sFT2AFemBafE2A6MtAKfiOeKYhyIk5SsMeoTNBBHhGhzgcei3q0RCzK3JHW25fW+ +0EDEnAm3SPQjAeBSz+AiKSmlAP2DgYJTNNMYbWIQGw2He24qJB7+m3Kf5ZnVy+n1 +7kopAjmhO8R1i5OMvz34mbE1FRivfvus/H7wT8p1 +-----END CERTIFICATE----- diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_flashloader.srec b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/flashloader.srec similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_flashloader.srec rename to tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/flashloader.srec diff --git a/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/gen_hab_certs/SRK_hash.bin b/tests/nxpimage/data/hab/export/rt1170_flashloader_authenticated/gen_hab_certs/SRK_hash.bin new file mode 100644 index 0000000000000000000000000000000000000000..977e46f864fae74b78d27758b90df1f44f7f7344 GIT binary patch literal 1088 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 T{wwxMBEBC@WD6lLwoLkWE(i_4 literal 0 HcmV?d00001 diff --git a/tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned/ivt.bin b/tests/nxpimage/data/hab/parse/rt1170_RAM_unsigned/ivt.bin similarity index 100% rename from tests/nxpimage/data/hab/evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned/ivt.bin rename to tests/nxpimage/data/hab/parse/rt1170_RAM_unsigned/ivt.bin diff --git a/tests/nxpimage/data/iee/aes_xts512_custom_names/iee_config.yaml b/tests/nxpimage/data/iee/aes_xts512_custom_names/iee_config.yaml new file mode 100644 index 00000000..be48cae5 --- /dev/null +++ b/tests/nxpimage/data/iee/aes_xts512_custom_names/iee_config.yaml @@ -0,0 +1,38 @@ +# Copyright 2023 NXP +# +# SPDX-License-Identifier: BSD-3-Clause +--- # ---------------------------------------------------------------------------------------------------- +# =========== IEE: Inline Encryption Engine Configuration template for RT11xx. =========== +# ---------------------------------------------------------------------------------------------------- +# == Basic Settings == +family: rt117x # [Required], MCU family name +output_folder: iee_output # [Required], IEE output directory; Path to directory where the IEE output will be generated +output_name: "" # [Optional], Output binary image file name; File name of the output image containing keyblobs and encrypted data blobs +keyblob_name: "keyblob" # [Optional], Keyblob file name; File name of the keyblob, output_folder/keyblob_name +encrypted_name: "" # [Optional], Encrypted name; filename of the encrypted datablobs +generate_readme: true +generate_fuses_script: false +# ---------------------------------------------------------------------------------------------------- +# == IEE Settings == +# ---------------------------------------------------------------------------------------------------- +keyblob_address: 0x30000000 # [Required], Base address of the IEE keyblob; Should be aligned to 1 kB +data_blobs: # [Optional], Data blobs list; List of all data blobs that will be encrypted + - data: evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_bootable_nopadding.bin # [Required], Binary data blob; Path to binary file with plain text data to be encrypted + address: 0x30001000 # [Optional], Data blob address, it doesn't have to be specified for S-REC +# ---------------------------------------------------------------------------------------------------- +# == Keyblob Encryption Key == +# ---------------------------------------------------------------------------------------------------- +ibkek1: 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f # [Required], IBKEK1 AES-XTS 256-bit key; IBKEK1 AES-XTS key for keyblob encryption +ibkek2: 0x202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f # [Required], IBKEK2 AES-XTS 256-bit key; IBKEK2 AES-XTS key for keyblob encryption +# ---------------------------------------------------------------------------------------------------- +# == List of Key Blobs used by IEE == +# ---------------------------------------------------------------------------------------------------- +key_blobs: # [Optional], The list of definition of individual key blobs including plain data. Add other array items as you need and device allows + - region_lock: False # [Optional], Keyblob lock attribute; Determines if the ROM will lock the IEE configuration to prevent later changes. + aes_mode: AesXTS # [Required], AES mode, Encryption bypass, AES-XTS, AES-CTR (with or without address binding) or AES-CTR keystream only; Possible options:['Bypass', 'AesXTS', 'AesCTRWAddress', 'AesCTRWOAddress', 'AesCTRkeystream'] + key_size: CTR256XTS512 # [Required], AES key size, 128/256 for AES-CTR or 256/512 for AES-XTS; AES mode, AES-XTS or AES-CTR; Possible options:['CTR256XTS512', 'CTR128XTS256'] + page_offset: 0 # [Optional], Page offset, IEE_REG0PO value + key1: 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f # [Required], AES-XTS key1 / AES-CTR key; AES key for the key blob, size depends on key_size + key2: 0x202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f # [Required], AES-CTR Counter value or AES-XTS key2; AES key for the key blob, size depends on key_size + start_address: 0x30001000 # [Required], Start address of key blob data, it should be aligned to 1 KB (1024 B) + end_address: 0x30008000 # [Required], End address of key blob data, it should be aligned to 1 KB (1024 B) diff --git a/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x.yml b/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x.yml index aa67664b..18d1ca3d 100644 --- a/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x.yml +++ b/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: rt5xx outputImageExecutionTarget: External flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x_invalid.yml b/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x_invalid.yml index 49fff171..0182187a 100644 --- a/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x_invalid.yml +++ b/tests/nxpimage/data/mbi/ext_xip_signed_lpc55s3x_invalid.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: rt5xx outputImageExecutionTarget: External flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx.yml b/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx.yml index a5301ca1..17626f80 100644 --- a/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx.yml +++ b/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: rt5xx outputImageExecutionTarget: External flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx_invalid.yml b/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx_invalid.yml index cbad3bf4..d1c6698a 100644 --- a/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx_invalid.yml +++ b/tests/nxpimage/data/mbi/ext_xip_signed_rtxxxx_invalid.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: rt5xx outputImageExecutionTarget: External flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/int_xip_signed_kw45xx.yml b/tests/nxpimage/data/mbi/int_xip_signed_kw45xx.yml index 95036e73..c9335f31 100644 --- a/tests/nxpimage/data/mbi/int_xip_signed_kw45xx.yml +++ b/tests/nxpimage/data/mbi/int_xip_signed_kw45xx.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: kw45xx outputImageExecutionTarget: Internal flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/int_xip_signed_kw45xx_invalid.yml b/tests/nxpimage/data/mbi/int_xip_signed_kw45xx_invalid.yml index 38c4c750..ed401791 100644 --- a/tests/nxpimage/data/mbi/int_xip_signed_kw45xx_invalid.yml +++ b/tests/nxpimage/data/mbi/int_xip_signed_kw45xx_invalid.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: kw45xx outputImageExecutionTarget: Internal flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/int_xip_signed_xip.yml b/tests/nxpimage/data/mbi/int_xip_signed_xip.yml index b2af42b6..8764bfc8 100644 --- a/tests/nxpimage/data/mbi/int_xip_signed_xip.yml +++ b/tests/nxpimage/data/mbi/int_xip_signed_xip.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: lpc551x outputImageExecutionTarget: Internal flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/mbi/int_xip_signed_xip_invalid.yml b/tests/nxpimage/data/mbi/int_xip_signed_xip_invalid.yml index c5a5288c..5392d036 100644 --- a/tests/nxpimage/data/mbi/int_xip_signed_xip_invalid.yml +++ b/tests/nxpimage/data/mbi/int_xip_signed_xip_invalid.yml @@ -1,7 +1,7 @@ # Copyright 2023 NXP # # SPDX-License-Identifier: BSD-3-Clause - +--- family: lpc551x outputImageExecutionTarget: Internal flash (XIP) outputImageAuthenticationType: Signed diff --git a/tests/nxpimage/data/otfad/otfad_rt1170_custom_name.yaml b/tests/nxpimage/data/otfad/otfad_rt1170_custom_name.yaml new file mode 100644 index 00000000..a9855c58 --- /dev/null +++ b/tests/nxpimage/data/otfad/otfad_rt1170_custom_name.yaml @@ -0,0 +1,30 @@ +# Copyright 2023 NXP +# +# SPDX-License-Identifier: BSD-3-Clause +--- # ---------------------------------------------------------------------------------------------------- +# =========== On-The-Fly AES decryption Configuration template for rt5xx. =========== +# ---------------------------------------------------------------------------------------------------- +# == Basic Settings == +family: rt117x # [Required], MCU family, MCU family name., Possible options:['rt5xx', 'rt6xx'] +output_folder: otfad_rt1170_outputs # [Required], OTFAD output folder, Folder name to be stored generated OTFAD outputs +output_name: otfad_whole_image # [Optional], Output binary image file name; Filename of the output image containing keyblobs and encrypted data blobs without file extension (.bin will be appended) +keyblob_name: OTFAD_Table # [Optional], Keyblob file name; Filename of the keyblob without file extension (.bin will be appended) +encrypted_name: encrypted_blob # [Optional], Encrypted name; filename of the encrypted datablobs without file extension (.bin will be appended) +generate_readme: false # [Optional], Generate readme.txt; Readme file contains information about image layout +# ---------------------------------------------------------------------------------------------------- +# == OTFAD Settings == +# ---------------------------------------------------------------------------------------------------- +kek: kek_inc.bin # [Required], KEK, OTFAD Key Encryption Key to encrypt OTFAD table +otfad_table_address: 0x30000000 # [Required], OTFAD key blobs table address, The base address of key blob table, it should be aligned to 1 KB (1024 B) + +data_blobs: # [Optional], Data blobs list, List of all data blobs included in this key blob + - data: evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_bootable_nopadding.bin # [Required], Plain Text data blob, Path to binary file with plain text data to be encrypted if desired + address: 0x30001000 # [Required], Data blob address, Data blob address, it could be omitted if data blob starts at start_address + +key_blobs: # [Required], List of Key Blobs used by OTFAD, The list of definition of individual key blobs including plain data. Add other array items as you need and device allows + - aes_key: 0x000102030405060708090a0b0c0d0e0f # [Required], AES key, AES key for the key blob + aes_ctr: 0x0123456789abcdef # [Required], AES Counter value, AES counter value for the key blob + start_address: 0x30001000 # [Required], Start address of key blob data, Start address of key blob data, it should be aligned to 1 KB (1024 B) + end_address: 0x30008000 # [Required], End address of key blob data, End address of key blob data, it should be aligned to 1 KB (1024 B) + aes_decryption_enable: true # [Optional], AES decryption enable flag, For accesses hitting in a valid context, this bit indicates if the fetched data is to be decrypted or simply bypassed + valid: true # [Optional], Valid flag, This field signals if the context is valid or not diff --git a/tests/nxpimage/data/xmcd/rt116x/flexspi_ram_full.yaml b/tests/nxpimage/data/xmcd/rt116x/flexspi_ram_full.yaml index dcf7e1d6..71fe7143 100644 --- a/tests/nxpimage/data/xmcd/rt116x/flexspi_ram_full.yaml +++ b/tests/nxpimage/data/xmcd/rt116x/flexspi_ram_full.yaml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: BSD-3-Clause # =========== External Memory Configuration Data template for rt116x. =========== # ---------------------------------------------------------------------------------------------------- -# == General Options == +# == General Options == # ---------------------------------------------------------------------------------------------------- family: rt116x # [Required], MCU family, MCU family name., Possible options:['rt116x', 'rt117x', 'rt118x'] revision: latest # [Optional], Chip silicon revision, If needed this could be used to specify silicon revision of device., Possible options:['latest'] diff --git a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_full.yaml b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_full.yaml index aa971695..681551bd 100644 --- a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_full.yaml +++ b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_full.yaml @@ -18,20 +18,24 @@ xmcd_settings: # [Required], rt116x memoryInterface: 0 # [Optional], memoryInterface, Memory interface 0 - FlexSPI, 1 - SEMC version: 0 # [Optional], version, Version, fixed value 0x0 tag: 12 # [Optional], tag, Tag, fixed value 0xc - tag: # [Optional], tag, [0x000-0x003] Tag, fixed value 0x62666366 - value: '0x00000000' # [Required], tag, [0x000-0x003] Tag, fixed value 0x62666366 - version: # [Optional], version, [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix - value: '0x00000000' # [Required], version, [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix + tag: # [Optional], tag, [0x000-0x003] Tag; fixed value 0x62666366, ascii: 'fcfb' + value: '0x00000000' # [Required], tag; [0x000-0x003] Tag; fixed value 0x62666366, ascii: 'fcfb' + version: # [Optional], version; [0x004-0x007] Version: [31:24] - 'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix + bitfields: # [Required] + bugfix: 0 # [Optional], bugfix; bugfix + major: 1 # [Optional], major; major = 1 + minor: 0 # [Optional], minor; minor + ascii: 0 # [Optional], ascii; ascii 'V' reserved0: # [Optional], reserved0, [0x008-0x00b] Reserved for future use value: '0x00000000' # [Required], reserved0, [0x008-0x00b] Reserved for future use readSampleClkSrc: # [Optional], readSampleClkSrc, [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 value: '0x00' # [Required], readSampleClkSrc, [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 - csHoldTime: # [Optional], csHoldTime, [0x00d-0x00d] CS hold time, default value: 3 - value: '0x00' # [Required], csHoldTime, [0x00d-0x00d] CS hold time, default value: 3 - csSetupTime: # [Optional], csSetupTime, [0x00e-0x00e] CS setup time, default value: 3 - value: '0x00' # [Required], csSetupTime, [0x00e-0x00e] CS setup time, default value: 3 + csHoldTime: # [Optional], csHoldTime; [0x00d-0x00d] CS hold time, default value: 3 + value: '0x03' # [Required], csHoldTime; [0x00d-0x00d] CS hold time, default value: 3 + csSetupTime: # [Optional], csSetupTime; [0x00e-0x00e] CS setup time, default value: 3 + value: '0x03' # [Required], csSetupTime; [0x00e-0x00e] CS setup time, default value: 3 columnAddressWidth: # [Optional], columnAddressWidth, [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For Serial NAND, need to refer to datasheet - value: '0x00' # [Required], columnAddressWidth, [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For Serial NAND, need to refer to datasheet + value: '0x03' # [Required], columnAddressWidth; [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For Serial NAND, need to refer to datasheet deviceModeCfgEnable: # [Optional], deviceModeCfgEnable, [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable value: '0x00' # [Required], deviceModeCfgEnable, [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable deviceModeType: # [Optional], deviceModeType, [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch, Generic configuration, etc. @@ -78,14 +82,27 @@ xmcd_settings: # [Required], rt116x value: '0x00000000' # [Required], configCmdArgs_2, [0x030-0x03b] Arguments/Parameters for device Configuration commands reserved2: # [Optional], reserved2, [0x03c-0x03f] Reserved for future use value: '0x00000000' # [Required], reserved2, [0x03c-0x03f] Reserved for future use - controllerMiscOption: # [Optional], controllerMiscOption, [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more details - value: '0x00000000' # [Required], controllerMiscOption, [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more details + controllerMiscOption: # [Optional], controllerMiscOption; [0x040-0x043] Controller Misc Option, see Misc feature bit definitions for more details + bitfields: # [Required] + bit0: 0 # [Optional], bit0; Bit0 - differential clock enable + bit1: 0 # [Optional], bit1; Bit1 - CK2 enable + bit2: 0 # [Optional], bit2; Bit2 - ParallelModeEnable + bit3: 0 # [Optional], bit3; Bit3 - wordAddressableEnable + bit4: 0 # [Optional], bit4; Bit4 - Half-Speed access enable + bit5: 0 # [Optional], bit5; Bit5 - Pad Settings Override Enable + bit6: 0 # [Optional], bit6; Bit6 - DDR Mode Enable + bit7: 0 # [Optional], bit7; Bit7 - Pad Settings Overide Enable + bit8: 0 # [Optional], bit8; Bit8 - Second Pinmux group + bit9: 0 # [Optional], bit9; Bit9 - Second DQS pi mux group + bit10: 0 # [Optional], bit10; Bit10 - Write Mask Enable + bit11: 0 # [Optional], bit11; Bit11 - Write Opt1 Clear + reserved: 0 # [Optional], reserved; N/A deviceType: # [Optional], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details - value: '0x00' # [Required], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details + value: '0x03' # [Required], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details sflashPadType: # [Optional], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal - value: '0x00' # [Required], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal - serialClkFreq: # [Optional], serialClkFreq, [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot Chapter for more details - value: '0x00' # [Required], serialClkFreq, [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot Chapter for more details + value: '0x01' # [Required], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal + serialClkFreq: # [Optional], serialClkFreq, [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot Chapter for more details + value: '0x00' # [Required], serialClkFreq, [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot Chapter for more details lutCustomSeqEnable: # [Optional], lutCustomSeqEnable, [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot be done using 1 LUT sequence, currently, only applicable to HyperFLASH value: '0x00' # [Required], lutCustomSeqEnable, [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot be done using 1 LUT sequence, currently, only applicable to HyperFLASH reserved3_0: # [Optional], reserved3_0, [0x048-0x04f] Reserved for future use @@ -119,7 +136,8 @@ xmcd_settings: # [Required], rt116x busyOffset: # [Optional], busyOffset, [0x07c-0x07d] Busy offset, valid value: 0-31 value: '0x0000' # [Required], busyOffset, [0x07c-0x07d] Busy offset, valid value: 0-31 busyBitPolarity: # [Optional], busyBitPolarity, [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - busy flag is 0 when flash device is busy - value: '0x0000' # [Required], busyBitPolarity, [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - busy flag is 0 when flash device is busy + bitfields: # [Required] + busyBitPolarity: 0 # [Optional], busyBitPolarity; Busy flag polarity lookupTable_0: # [Optional], lookupTable_0, [0x080-0x17f] Lookup table holds Flash command sequences value: '0x00000000' # [Required], lookupTable_0, [0x080-0x17f] Lookup table holds Flash command sequences lookupTable_1: # [Optional], lookupTable_1, [0x080-0x17f] Lookup table holds Flash command sequences diff --git a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_simplified.yaml b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_simplified.yaml index 02efd788..91a4da6c 100644 --- a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_simplified.yaml +++ b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_flexspi_ram_simplified.yaml @@ -21,7 +21,7 @@ xmcd_settings: # [Required], rt116x configOption0: # [Optional], configOption0, XMCD Configuration Option 0 bitfields: # [Required] sizeInMB: 0 # [Optional], sizeInMB, Size in MB. 0 - Auto detection, Others - Size in MB - maximumFrequency: 0 # [Optional], maximumFrequency, Maximum frequency. SoC specific definitions + maximumFrequency: 7 # [Optional], maximumFrequency, Maximum frequency. SoC specific definitions misc: 0 # [Optional], misc, Misc. For HyperRAM 0 - 1.8V, 1 - 3V reserved: 0 # [Optional], reserved, Reserved for future use deviceType: 0 # [Optional], deviceType, Device type 0 - Hyper RAM, 1 - APMemory diff --git a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_full.yaml b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_full.yaml index dcf7e1d6..5cce6d55 100644 --- a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_full.yaml +++ b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_full.yaml @@ -30,20 +30,20 @@ xmcd_settings: # [Required], rt116x value: '0x00000000' # [Required], sdramSizeKb, Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 portSize: # [Optional], portSize, Port size of SDRAM. 0 - 8bit, 1 - 16bit, 2 - 32bit value: '0x00' # [Required], portSize, Port size of SDRAM. 0 - 8bit, 1 - 16bit, 2 - 32bit - pinConfigPull: # [Optional], pinConfigPull, Pull config of the SDRAM GPIO pin. 0 - Forbidden, 1 - Pull up, 2 - Pull down - value: '0x00' # [Required], pinConfigPull, Pull config of the SDRAM GPIO pin. 0 - Forbidden, 1 - Pull up, 2 - Pull down + pinConfigPull: # [Optional], pinConfigPull; Pull config of the SDRAM GPIO pin: 0 - Forbidden, 1 - Pull up, 2 - Pull down, 3 - No pull, Others - Invalid value + value: '0x03' # [Required], pinConfigPull; Pull config of the SDRAM GPIO pin: 0 - Forbidden, 1 - Pull up, 2 - Pull down, 3 - No pull, Others - Invalid value pinConfigDriveStrength: # [Optional], pinConfigDriveStrength, Driver config of SDRAM GPIO pin. 0 - High driver, 1 - Normal driver, Others- Invalid value: '0x00' # [Required], pinConfigDriveStrength, Driver config of SDRAM GPIO pin. 0 - High driver, 1 - Normal driver, Others- Invalid muxRdy: # [Optional], muxRdy, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxRdy, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxRdy, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx0: # [Optional], muxCsx0, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx0, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx0, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx1: # [Optional], muxCsx1, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx1, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx1, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx2: # [Optional], muxCsx2, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx2, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx2, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx3: # [Optional], muxCsx3, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx3, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx3, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM bank: # [Optional], bank, Bank numbers of SDRAM device. 0 - 4 banks, 1 - 2 banks, Others- Invalid value: '0x00' # [Required], bank, Bank numbers of SDRAM device. 0 - 4 banks, 1 - 2 banks, Others- Invalid burstLen: # [Optional], burstLen, Burst length.0 - 1, 1 - 2, 2 - 4, 3 - 8, Others- Invalid @@ -51,7 +51,7 @@ xmcd_settings: # [Required], rt116x columnAddrBitNum: # [Optional], columnAddrBitNum, Column address bit number.0 - 12 bit, 1 - 11 bit, 2 - 10 bit, 3 - 9 bit, 4 - 8 bit, Others- Invalid value: '0x00' # [Required], columnAddrBitNum, Column address bit number.0 - 12 bit, 1 - 11 bit, 2 - 10 bit, 3 - 9 bit, 4 - 8 bit, Others- Invalid casLatency: # [Optional], casLatency, CAS Latency, 1 - 1, 2 - 2, 3 - 3, Others- Invalid - value: '0x00' # [Required], casLatency, CAS Latency, 1 - 1, 2 - 2, 3 - 3, Others- Invalid + value: '0x01' # [Required], casLatency, CAS Latency, 1 - 1, 2 - 2, 3 - 3, Others- Invalid writeRecoveryNs: # [Optional], writeRecoveryNs, Write recovery time in unit of nanosecond. This could help to meet tWR timing requirement by the SDRAM device. value: '0x00' # [Required], writeRecoveryNs, Write recovery time in unit of nanosecond. This could help to meet tWR timing requirement by the SDRAM device. refreshRecoveryNs: # [Optional], refreshRecoveryNs, Refresh recovery time in unit of nanosecond. This could help to meet tRFC timing requirement by the SDRAM device. diff --git a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_simplified.yaml b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_simplified.yaml index bf77ebd0..e4e49dde 100644 --- a/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_simplified.yaml +++ b/tests/nxpimage/data/xmcd/rt116x/templates/xmcd_rt116x_semc_sdram_simplified.yaml @@ -5,28 +5,28 @@ # ---------------------------------------------------------------------------------------------------- # == General Options == # ---------------------------------------------------------------------------------------------------- -family: rt116x # [Required], MCU family, MCU family name., Possible options:['rt116x', 'rt117x', 'rt118x'] -revision: latest # [Optional], Chip silicon revision, If needed this could be used to specify silicon revision of device., Possible options:['latest'] -mem_type: semc_sdram # [Optional], Memory type, Specify type of memory used by XMCD description., Possible options:['flexspi_ram', 'semc_sdram'] -config_type: simplified # [Optional], Configuration type, Specify type of configuration used by XMCD description., Possible options:['simplified', 'full'] +family: rt116x # [Required], MCU family name; Possible options:['rt116x', 'rt117x', 'rt118x'] +revision: latest # [Optional], Chip silicon revision; If needed this could be used to specify silicon revision of device; Possible options:['latest'] +mem_type: semc_sdram # [Optional], Memory type; Specify type of memory used by XMCD description; Possible options:['flexspi_ram', 'semc_sdram'] +config_type: simplified # [Optional], Configuration type; Specify type of configuration used by XMCD description; Possible options:['simplified', 'full'] xmcd_settings: # [Required], rt116x - header: # [Optional], header, XMCD Header + header: # [Optional], header; XMCD Header bitfields: # [Required] - configurationBlockSize: 13 # [Optional], configurationBlockSize, Configuration block size including XMCD header itself - configurationBlockType: 0 # [Optional], configurationBlockType, Configuration block type - 0 - Simplified, 1 - Full - instance: 0 # [Optional], instance, SoC defined instances - memoryInterface: 1 # [Optional], memoryInterface, Memory interface 0 - FlexSPI, 1 - SEMC - version: 0 # [Optional], version, Version, fixed value 0x0 - tag: 12 # [Optional], tag, Tag, fixed value 0xc - magicNumber: # [Optional], magicNumber, Fixed to 0xA1 - value: '0xA1' # [Required], magicNumber, Fixed to 0xA1 - version: # [Optional], version, Set to 1 for this implementation - value: '0x01' # [Required], version, Set to 1 for this implementation - configOption: # [Optional], configOption, Simplified - 0x00, Full - 0xFF - Must be 0x00 in this case - value: '0x00' # [Required], configOption, Simplified - 0x00, Full - 0xFF - Must be 0x00 in this case - clkMhz: # [Optional], clkMhz, Set the working frequency in the unit of MHz - value: '0x00' # [Required], clkMhz, Set the working frequency in the unit of MHz - sdramSizeKb: # [Optional], sdramSizeKb, Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 - value: '0x00000000' # [Required], sdramSizeKb, Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 - portSize: # [Optional], portSize, Port size of SDRAM. - value: '0x00' # [Required], portSize, Port size of SDRAM. + configurationBlockSize: 13 # [Optional], configurationBlockSize; Configuration block size including XMCD header itself + configurationBlockType: 0 # [Optional], configurationBlockType; Configuration block type - 0 - Simplified, 1 - Full + instance: 0 # [Optional], instance; SoC defined instances + memoryInterface: 1 # [Optional], memoryInterface; Memory interface 0 - FlexSPI, 1 - SEMC + version: 0 # [Optional], Version, fixed value 0x0 + tag: 12 # [Optional], Tag, fixed value 0xC + magicNumber: # [Optional], magicNumber; Magic number: Fixed to 0xA1 + value: '0xA1' # [Required], magicNumber; Magic number: Fixed to 0xA1 + version: # [Optional], Version: Set to 1 for this implementation + value: '0x01' # [Required], Version: Set to 1 for this implementation + configOption: # [Optional], configOption; Config option: Simplified - 0x00, Full - 0xFF; Must be 0x00 in this case + value: '0x00' # [Required], configOption; Config option: Simplified - 0x00, Full - 0xFF; Must be 0x00 in this case + clkMhz: # [Optional], clkMhz; Set the working frequency in the unit of MHz + value: '0x00' # [Required], clkMhz; Set the working frequency in the unit of MHz + sdramSizeKb: # [Optional], sdramSizeKb; Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 + value: '0x00000000' # [Required], sdramSizeKb; Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 + portSize: # [Optional], portSize; Port size of SDRAM + value: '0x00' # [Required], portSize; Port size of SDRAM diff --git a/tests/nxpimage/data/xmcd/rt117x/flexspi_ram_full.yaml b/tests/nxpimage/data/xmcd/rt117x/flexspi_ram_full.yaml index 3eea3abe..e36802fa 100644 --- a/tests/nxpimage/data/xmcd/rt117x/flexspi_ram_full.yaml +++ b/tests/nxpimage/data/xmcd/rt117x/flexspi_ram_full.yaml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: BSD-3-Clause # =========== External Memory Configuration Data template for rt117x. =========== # ---------------------------------------------------------------------------------------------------- -# == General Options == +# == General Options == # ---------------------------------------------------------------------------------------------------- family: rt117x # [Required], MCU family, MCU family name., Possible options:['rt116x', 'rt117x', 'rt118x'] revision: latest # [Optional], Chip silicon revision, If needed this could be used to specify silicon revision of device., Possible options:['latest'] @@ -21,7 +21,11 @@ xmcd_settings: # [Required], rt117x tag: # [Optional], tag, [0x000-0x003] Tag, fixed value 0x62666366 value: '0x00000000' # [Required], tag, [0x000-0x003] Tag, fixed value 0x62666366 version: # [Optional], version, [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix - value: '0x00000000' # [Required], version, [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix + bitfields: # [Required] + bugfix: 0 # [Optional], bugfix; bugfix + major: 0 # [Optional], major; major = 0 + minor: 0 # [Optional], minor; minor + ascii: 0 # [Optional], ascii; ascii 'V' reserved0: # [Optional], reserved0, [0x008-0x00b] Reserved for future use value: '0x00000000' # [Required], reserved0, [0x008-0x00b] Reserved for future use readSampleClkSrc: # [Optional], readSampleClkSrc, [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 @@ -79,13 +83,26 @@ xmcd_settings: # [Required], rt117x reserved2: # [Optional], reserved2, [0x03c-0x03f] Reserved for future use value: '0x00000000' # [Required], reserved2, [0x03c-0x03f] Reserved for future use controllerMiscOption: # [Optional], controllerMiscOption, [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more details - value: '0x00000000' # [Required], controllerMiscOption, [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more details + bitfields: # [Required] + bit0: 0 # [Optional], bit0; Bit0 - differential clock enable + bit1: 0 # [Optional], bit1; Bit1 - CK2 enable + bit2: 0 # [Optional], bit2; Bit2 - ParallelModeEnable + bit3: 0 # [Optional], bit3; Bit3 - wordAddressableEnable + bit4: 0 # [Optional], bit4; Bit4 - Half-Speed access enable + bit5: 0 # [Optional], bit5; Bit5 - Pad Settings Override Enable + bit6: 0 # [Optional], bit6; Bit6 - DDR Mode Enable + bit7: 0 # [Optional], bit7; Bit7 - Pad Settings Override Enable + bit8: 0 # [Optional], bit8; Bit8 - Second Pinmux group + bit9: 0 # [Optional], bit9; Bit9 - Second DQS pi mux group + bit10: 0 # [Optional], bit10; Bit10 - Write Mask Enable + bit11: 0 # [Optional], bit11; Bit11 - Write Opt1 Clear + reserved: 0 # [Optional], reserved; N/A deviceType: # [Optional], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details value: '0x00' # [Required], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details sflashPadType: # [Optional], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal value: '0x00' # [Required], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal - serialClkFreq: # [Optional], serialClkFreq, [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot Chapter for more details - value: '0x00' # [Required], serialClkFreq, [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot Chapter for more details + serialClkFreq: # [Optional], serialClkFreq, [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot Chapter for more details + value: '0x00' # [Required], serialClkFreq, [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot Chapter for more details lutCustomSeqEnable: # [Optional], lutCustomSeqEnable, [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot be done using 1 LUT sequence, currently, only applicable to HyperFLASH value: '0x00' # [Required], lutCustomSeqEnable, [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot be done using 1 LUT sequence, currently, only applicable to HyperFLASH reserved3_0: # [Optional], reserved3_0, [0x048-0x04f] Reserved for future use @@ -119,7 +136,8 @@ xmcd_settings: # [Required], rt117x busyOffset: # [Optional], busyOffset, [0x07c-0x07d] Busy offset, valid value: 0-31 value: '0x0000' # [Required], busyOffset, [0x07c-0x07d] Busy offset, valid value: 0-31 busyBitPolarity: # [Optional], busyBitPolarity, [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - busy flag is 0 when flash device is busy - value: '0x0000' # [Required], busyBitPolarity, [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - busy flag is 0 when flash device is busy + bitfields: # [Required] + busyBitPolarity: 0 # [Optional], busyBitPolarity; Busy flag polarity lookupTable_0: # [Optional], lookupTable_0, [0x080-0x17f] Lookup table holds Flash command sequences value: '0x00000000' # [Required], lookupTable_0, [0x080-0x17f] Lookup table holds Flash command sequences lookupTable_1: # [Optional], lookupTable_1, [0x080-0x17f] Lookup table holds Flash command sequences diff --git a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_full.yaml b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_full.yaml index 3eea3abe..d7f7d7e1 100644 --- a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_full.yaml +++ b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_full.yaml @@ -18,20 +18,24 @@ xmcd_settings: # [Required], rt117x memoryInterface: 0 # [Optional], memoryInterface, Memory interface 0 - FlexSPI, 1 - SEMC version: 0 # [Optional], version, Version, fixed value 0x0 tag: 12 # [Optional], tag, Tag, fixed value 0xc - tag: # [Optional], tag, [0x000-0x003] Tag, fixed value 0x62666366 - value: '0x00000000' # [Required], tag, [0x000-0x003] Tag, fixed value 0x62666366 - version: # [Optional], version, [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix - value: '0x00000000' # [Required], version, [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix + tag: # [Optional], tag, [0x000-0x003] Tag; fixed value 0x62666366, ascii: 'fcfb' + value: '0x00000000' # [Required], tag; [0x000-0x003] Tag; fixed value 0x62666366, ascii: 'fcfb' + version: # [Optional], version; [0x004-0x007] Version: [31:24] - 'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix + bitfields: # [Required] + bugfix: 0 # [Optional], bugfix; bugfix + major: 1 # [Optional], major; major = 1 + minor: 0 # [Optional], minor; minor + ascii: 0 # [Optional], ascii; ascii 'V' reserved0: # [Optional], reserved0, [0x008-0x00b] Reserved for future use value: '0x00000000' # [Required], reserved0, [0x008-0x00b] Reserved for future use readSampleClkSrc: # [Optional], readSampleClkSrc, [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 value: '0x00' # [Required], readSampleClkSrc, [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 - csHoldTime: # [Optional], csHoldTime, [0x00d-0x00d] CS hold time, default value: 3 - value: '0x00' # [Required], csHoldTime, [0x00d-0x00d] CS hold time, default value: 3 - csSetupTime: # [Optional], csSetupTime, [0x00e-0x00e] CS setup time, default value: 3 - value: '0x00' # [Required], csSetupTime, [0x00e-0x00e] CS setup time, default value: 3 + csHoldTime: # [Optional], csHoldTime; [0x00d-0x00d] CS hold time, default value: 3 + value: '0x03' # [Required], csHoldTime; [0x00d-0x00d] CS hold time, default value: 3 + csSetupTime: # [Optional], csSetupTime; [0x00e-0x00e] CS setup time, default value: 3 + value: '0x03' # [Required], csSetupTime; [0x00e-0x00e] CS setup time, default value: 3 columnAddressWidth: # [Optional], columnAddressWidth, [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For Serial NAND, need to refer to datasheet - value: '0x00' # [Required], columnAddressWidth, [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For Serial NAND, need to refer to datasheet + value: '0x03' # [Required], columnAddressWidth; [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For Serial NAND, need to refer to datasheet deviceModeCfgEnable: # [Optional], deviceModeCfgEnable, [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable value: '0x00' # [Required], deviceModeCfgEnable, [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable deviceModeType: # [Optional], deviceModeType, [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch, Generic configuration, etc. @@ -78,14 +82,27 @@ xmcd_settings: # [Required], rt117x value: '0x00000000' # [Required], configCmdArgs_2, [0x030-0x03b] Arguments/Parameters for device Configuration commands reserved2: # [Optional], reserved2, [0x03c-0x03f] Reserved for future use value: '0x00000000' # [Required], reserved2, [0x03c-0x03f] Reserved for future use - controllerMiscOption: # [Optional], controllerMiscOption, [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more details - value: '0x00000000' # [Required], controllerMiscOption, [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more details + controllerMiscOption: # [Optional], controllerMiscOption; [0x040-0x043] Controller Misc Option, see Misc feature bit definitions for more details + bitfields: # [Required] + bit0: 0 # [Optional], bit0; Bit0 - differential clock enable + bit1: 0 # [Optional], bit1; Bit1 - CK2 enable + bit2: 0 # [Optional], bit2; Bit2 - ParallelModeEnable + bit3: 0 # [Optional], bit3; Bit3 - wordAddressableEnable + bit4: 0 # [Optional], bit4; Bit4 - Half-Speed access enable + bit5: 0 # [Optional], bit5; Bit5 - Pad Settings Override Enable + bit6: 0 # [Optional], bit6; Bit6 - DDR Mode Enable + bit7: 0 # [Optional], bit7; Bit7 - Pad Settings Overide Enable + bit8: 0 # [Optional], bit8; Bit8 - Second Pinmux group + bit9: 0 # [Optional], bit9; Bit9 - Second DQS pi mux group + bit10: 0 # [Optional], bit10; Bit10 - Write Mask Enable + bit11: 0 # [Optional], bit11; Bit11 - Write Opt1 Clear + reserved: 0 # [Optional], reserved; N/A deviceType: # [Optional], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details - value: '0x00' # [Required], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details + value: '0x03' # [Required], deviceType, [0x044-0x044] Device Type: See Flash Type Definition for more details sflashPadType: # [Optional], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal - value: '0x00' # [Required], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal - serialClkFreq: # [Optional], serialClkFreq, [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot Chapter for more details - value: '0x00' # [Required], serialClkFreq, [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot Chapter for more details + value: '0x01' # [Required], sflashPadType, [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal + serialClkFreq: # [Optional], serialClkFreq, [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot Chapter for more details + value: '0x00' # [Required], serialClkFreq, [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot Chapter for more details lutCustomSeqEnable: # [Optional], lutCustomSeqEnable, [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot be done using 1 LUT sequence, currently, only applicable to HyperFLASH value: '0x00' # [Required], lutCustomSeqEnable, [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot be done using 1 LUT sequence, currently, only applicable to HyperFLASH reserved3_0: # [Optional], reserved3_0, [0x048-0x04f] Reserved for future use @@ -119,7 +136,8 @@ xmcd_settings: # [Required], rt117x busyOffset: # [Optional], busyOffset, [0x07c-0x07d] Busy offset, valid value: 0-31 value: '0x0000' # [Required], busyOffset, [0x07c-0x07d] Busy offset, valid value: 0-31 busyBitPolarity: # [Optional], busyBitPolarity, [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - busy flag is 0 when flash device is busy - value: '0x0000' # [Required], busyBitPolarity, [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 - busy flag is 0 when flash device is busy + bitfields: # [Required] + busyBitPolarity: 0 # [Optional], busyBitPolarity; Busy flag polarity lookupTable_0: # [Optional], lookupTable_0, [0x080-0x17f] Lookup table holds Flash command sequences value: '0x00000000' # [Required], lookupTable_0, [0x080-0x17f] Lookup table holds Flash command sequences lookupTable_1: # [Optional], lookupTable_1, [0x080-0x17f] Lookup table holds Flash command sequences diff --git a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_simplified.yaml b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_simplified.yaml index 3c3fc979..e12a7899 100644 --- a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_simplified.yaml +++ b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_flexspi_ram_simplified.yaml @@ -21,7 +21,7 @@ xmcd_settings: # [Required], rt117x configOption0: # [Optional], configOption0, XMCD Configuration Option 0 bitfields: # [Required] sizeInMB: 0 # [Optional], sizeInMB, Size in MB. 0 - Auto detection, Others - Size in MB - maximumFrequency: 0 # [Optional], maximumFrequency, Maximum frequency. SoC specific definitions + maximumFrequency: 7 # [Optional], maximumFrequency, Maximum frequency. SoC specific definitions misc: 0 # [Optional], misc, Misc. For HyperRAM 0 - 1.8V, 1 - 3V reserved: 0 # [Optional], reserved, Reserved for future use deviceType: 0 # [Optional], deviceType, Device type 0 - Hyper RAM, 1 - APMemory diff --git a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_full.yaml b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_full.yaml index 0d6b69e2..d535d879 100644 --- a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_full.yaml +++ b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_full.yaml @@ -30,20 +30,20 @@ xmcd_settings: # [Required], rt117x value: '0x00000000' # [Required], sdramSizeKb, Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 portSize: # [Optional], portSize, Port size of SDRAM. 0 - 8bit, 1 - 16bit, 2 - 32bit value: '0x00' # [Required], portSize, Port size of SDRAM. 0 - 8bit, 1 - 16bit, 2 - 32bit - pinConfigPull: # [Optional], pinConfigPull, Pull config of the SDRAM GPIO pin. 0 - Forbidden, 1 - Pull up, 2 - Pull down - value: '0x00' # [Required], pinConfigPull, Pull config of the SDRAM GPIO pin. 0 - Forbidden, 1 - Pull up, 2 - Pull down + pinConfigPull: # [Optional], pinConfigPull; Pull config of the SDRAM GPIO pin: 0 - Forbidden, 1 - Pull up, 2 - Pull down, 3 - No pull, Others - Invalid value + value: '0x03' # [Required], pinConfigPull; Pull config of the SDRAM GPIO pin: 0 - Forbidden, 1 - Pull up, 2 - Pull down, 3 - No pull, Others - Invalid value pinConfigDriveStrength: # [Optional], pinConfigDriveStrength, Driver config of SDRAM GPIO pin. 0 - High driver, 1 - Normal driver, Others- Invalid value: '0x00' # [Required], pinConfigDriveStrength, Driver config of SDRAM GPIO pin. 0 - High driver, 1 - Normal driver, Others- Invalid muxRdy: # [Optional], muxRdy, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxRdy, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxRdy, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx0: # [Optional], muxCsx0, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx0, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx0, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx1: # [Optional], muxCsx1, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx1, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx1, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx2: # [Optional], muxCsx2, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx2, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx2, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM muxCsx3: # [Optional], muxCsx3, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM - value: '0x00' # [Required], muxCsx3, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM + value: '0x01' # [Required], muxCsx3, SDRAM CSn device selection. 1 - SDRAM CS1, 2 - SDRAM CS2, 3 - SDRAM CS3, Others- Invalid for SDRAM bank: # [Optional], bank, Bank numbers of SDRAM device. 0 - 4 banks, 1 - 2 banks, Others- Invalid value: '0x00' # [Required], bank, Bank numbers of SDRAM device. 0 - 4 banks, 1 - 2 banks, Others- Invalid burstLen: # [Optional], burstLen, Burst length.0 - 1, 1 - 2, 2 - 4, 3 - 8, Others- Invalid @@ -51,7 +51,7 @@ xmcd_settings: # [Required], rt117x columnAddrBitNum: # [Optional], columnAddrBitNum, Column address bit number.0 - 12 bit, 1 - 11 bit, 2 - 10 bit, 3 - 9 bit, 4 - 8 bit, Others- Invalid value: '0x00' # [Required], columnAddrBitNum, Column address bit number.0 - 12 bit, 1 - 11 bit, 2 - 10 bit, 3 - 9 bit, 4 - 8 bit, Others- Invalid casLatency: # [Optional], casLatency, CAS Latency, 1 - 1, 2 - 2, 3 - 3, Others- Invalid - value: '0x00' # [Required], casLatency, CAS Latency, 1 - 1, 2 - 2, 3 - 3, Others- Invalid + value: '0x01' # [Required], casLatency, CAS Latency, 1 - 1, 2 - 2, 3 - 3, Others- Invalid writeRecoveryNs: # [Optional], writeRecoveryNs, Write recovery time in unit of nanosecond. This could help to meet tWR timing requirement by the SDRAM device. value: '0x00' # [Required], writeRecoveryNs, Write recovery time in unit of nanosecond. This could help to meet tWR timing requirement by the SDRAM device. refreshRecoveryNs: # [Optional], refreshRecoveryNs, Refresh recovery time in unit of nanosecond. This could help to meet tRFC timing requirement by the SDRAM device. diff --git a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_simplified.yaml b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_simplified.yaml index c659d8f0..61480b8a 100644 --- a/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_simplified.yaml +++ b/tests/nxpimage/data/xmcd/rt117x/templates/xmcd_rt117x_semc_sdram_simplified.yaml @@ -5,28 +5,28 @@ # ---------------------------------------------------------------------------------------------------- # == General Options == # ---------------------------------------------------------------------------------------------------- -family: rt117x # [Required], MCU family, MCU family name., Possible options:['rt116x', 'rt117x', 'rt118x'] -revision: latest # [Optional], Chip silicon revision, If needed this could be used to specify silicon revision of device., Possible options:['latest'] -mem_type: semc_sdram # [Optional], Memory type, Specify type of memory used by XMCD description., Possible options:['flexspi_ram', 'semc_sdram'] -config_type: simplified # [Optional], Configuration type, Specify type of configuration used by XMCD description., Possible options:['simplified', 'full'] +family: rt117x # [Required], MCU family name; Possible options:['rt116x', 'rt117x', 'rt118x'] +revision: latest # [Optional], Chip silicon revision; If needed this could be used to specify silicon revision of device; Possible options:['latest'] +mem_type: semc_sdram # [Optional], Memory type; Specify type of memory used by XMCD description; Possible options:['flexspi_ram', 'semc_sdram'] +config_type: simplified # [Optional], Configuration type; Specify type of configuration used by XMCD description; Possible options:['simplified', 'full'] xmcd_settings: # [Required], rt117x - header: # [Optional], header, XMCD Header + header: # [Optional], header; XMCD Header bitfields: # [Required] - configurationBlockSize: 13 # [Optional], configurationBlockSize, Configuration block size including XMCD header itself - configurationBlockType: 0 # [Optional], configurationBlockType, Configuration block type - 0 - Simplified, 1 - Full - instance: 0 # [Optional], instance, SoC defined instances - memoryInterface: 1 # [Optional], memoryInterface, Memory interface 0 - FlexSPI, 1 - SEMC - version: 0 # [Optional], version, Version, fixed value 0x0 - tag: 12 # [Optional], tag, Tag, fixed value 0xc - magicNumber: # [Optional], magicNumber, Fixed to 0xA1 - value: '0xA1' # [Required], magicNumber, Fixed to 0xA1 - version: # [Optional], version, Set to 1 for this implementation - value: '0x01' # [Required], version, Set to 1 for this implementation - configOption: # [Optional], configOption, Simplified - 0x00, Full - 0xFF - Must be 0x00 in this case - value: '0x00' # [Required], configOption, Simplified - 0x00, Full - 0xFF - Must be 0x00 in this case - clkMhz: # [Optional], clkMhz, Set the working frequency in the unit of MHz - value: '0x00' # [Required], clkMhz, Set the working frequency in the unit of MHz - sdramSizeKb: # [Optional], sdramSizeKb, Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 - value: '0x00000000' # [Required], sdramSizeKb, Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 - portSize: # [Optional], portSize, Port size of SDRAM. - value: '0x00' # [Required], portSize, Port size of SDRAM. + configurationBlockSize: 13 # [Optional], configurationBlockSize; Configuration block size including XMCD header itself + configurationBlockType: 0 # [Optional], configurationBlockType; Configuration block type - 0 - Simplified, 1 - Full + instance: 0 # [Optional], instance; SoC defined instances + memoryInterface: 1 # [Optional], memoryInterface; Memory interface 0 - FlexSPI, 1 - SEMC + version: 0 # [Optional], Version, fixed value 0x0 + tag: 12 # [Optional], Tag, fixed value 0xC + magicNumber: # [Optional], magicNumber; Magic number: Fixed to 0xA1 + value: '0xA1' # [Required], magicNumber; Magic number: Fixed to 0xA1 + version: # [Optional], Version: Set to 1 for this implementation + value: '0x01' # [Required], Version: Set to 1 for this implementation + configOption: # [Optional], configOption; Config option: Simplified - 0x00, Full - 0xFF; Must be 0x00 in this case + value: '0x00' # [Required], configOption; Config option: Simplified - 0x00, Full - 0xFF; Must be 0x00 in this case + clkMhz: # [Optional], clkMhz; Set the working frequency in the unit of MHz + value: '0x00' # [Required], clkMhz; Set the working frequency in the unit of MHz + sdramSizeKb: # [Optional], sdramSizeKb; Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 + value: '0x00000000' # [Required], sdramSizeKb; Set the memory size of SDRAM CS0 in the unit of kilobytes.Range: 4~4*1024*1024 + portSize: # [Optional], portSize; Port size of SDRAM + value: '0x00' # [Required], portSize; Port size of SDRAM diff --git a/tests/nxpimage/test_nxpimage_hab.py b/tests/nxpimage/test_nxpimage_hab.py index ec7619c3..1f6b378e 100644 --- a/tests/nxpimage/test_nxpimage_hab.py +++ b/tests/nxpimage/test_nxpimage_hab.py @@ -7,91 +7,104 @@ """Test BEE part of nxpimage app.""" import filecmp import os -import shutil +from shutil import copytree import pytest from click.testing import CliRunner from spsdk.apps import nxpimage -from spsdk.utils.misc import load_binary, load_configuration, use_working_directory +from spsdk.utils.misc import load_file, use_working_directory + + +@pytest.fixture() +def hab_data_dir(data_dir): + return os.path.join(data_dir, "hab") @pytest.mark.parametrize( - "command_file, externals, ref_file", + "configuration, app_name", [ + ("rt1160_xip_mdk_unsigned", "evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec"), + ("rt1170_QSPI_flash_unsigned", "evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19"), ( - "evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bd", - ["evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19"], - "evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin", - ), - ( - "evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bd", - ["evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.s19"], - "evkmimxrt1170_iled_blinky_cm7_QSPI_FLASH_unsigned.bin", - ), - ( - "evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bd", - ["evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.srec"], - "evkbimxrt1160_iled_blinky_cm7_xip_mdk_unsigned.bin", - ), - ( - "evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bd", - ["evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19"], - "evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bin", - ), - ( - "evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bd", - ["evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19"], - "evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.bin", - ), - ( - "evkmimxrt1170_flashloader.bd", - ["evkmimxrt1170_flashloader.srec"], - "evkmimxrt1170_flashloader.bin", + "rt1170_RAM_non_xip_unsigned", + "evkmimxrt1170_iled_blinky_cm7_int_RAM_non_xip_unsigned.s19", ), + ("rt1170_RAM_unsigned", "evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.s19"), + ("rt1170_flashloader_unsigned", "evkmimxrt1170_flashloader.srec"), + ("rt1170_flashloader_authenticated", "flashloader.srec"), + ("rt1170_RAM_authenticated", "evkmimxrt1170_iled_blinky_cm7_int_RAM.s19"), + ("rt1050_xip_image_iar_authenticated", "led_blinky_xip_srec_iar.srec"), + ("rt1170_semcnand_authenticated", "evkmimxrt1170_iled_blinky_cm7_int_RAM.s19"), + ("rt1165_semcnand_authenticated", "evkmimxrt1064_iled_blinky_SDRAM.s19"), + ("rt1165_flashloader_authenticated", "flashloader.srec"), + ("rt1165_semcnand_encrypted", "evkmimxrt1064_iled_blinky_SDRAM.s19"), + ("rt1160_RAM_encrypted", "validationboard_imxrt1160_iled_blinky_cm7_int_RAM.s19"), ], ) -def test_nxpimage_hab_export(tmpdir, data_dir, command_file, externals, ref_file): - test_data_dir = os.path.join(data_dir, "hab") - command_file_path = os.path.join(test_data_dir, command_file) +def test_nxpimage_hab_export(tmpdir, hab_data_dir, configuration, app_name): + config_dir = os.path.join(hab_data_dir, "export", configuration) + command_file_path = os.path.join(config_dir, "config.bd") + ref_file_path = os.path.join(config_dir, "output.bin") + app_file_path = os.path.join(config_dir, app_name) runner = CliRunner() with use_working_directory(tmpdir): output_file_path = os.path.join(tmpdir, "image_output.bin") - cmd = f"hab export --command {command_file_path} --output {output_file_path}" - for external in externals: - ext_path = os.path.join(test_data_dir, external) - cmd = f"{cmd} {ext_path}" + cmd = ( + f"hab export --command {command_file_path} --output {output_file_path} {app_file_path}" + ) result = runner.invoke(nxpimage.main, cmd.split()) assert result.exit_code == 0 assert os.path.isfile(output_file_path) - - ref_file_path = os.path.join(test_data_dir, ref_file) - encrypted_image_enc = load_binary(ref_file_path) - encrypted_nxpimage = load_binary(output_file_path) - assert encrypted_image_enc == encrypted_nxpimage + assert load_file(ref_file_path, mode="rb") == load_file(output_file_path, mode="rb") @pytest.mark.parametrize( - "source_bin, segments", + "configuration, source_bin, segments", [ - ("evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin", ["ivt", "bdt", "app"]), + ( + "rt1170_RAM_unsigned", + "evkmimxrt1170_iled_blinky_cm7_int_RAM_unsigned.bin", + ["ivt", "bdt", "app"], + ), ], ) -def test_nxpimage_hab_parse(tmpdir, data_dir, source_bin: str, segments): - test_data_dir = os.path.join(data_dir, "hab") - source_bin_path = os.path.join(test_data_dir, source_bin) +def test_nxpimage_hab_parse(tmpdir, hab_data_dir, configuration, source_bin, segments): + config_dir = os.path.join(hab_data_dir, "parse", configuration) + source_bin_path = os.path.join(config_dir, source_bin) runner = CliRunner() with use_working_directory(tmpdir): cmd = f"hab parse --binary {source_bin_path} {tmpdir}" result = runner.invoke(nxpimage.main, cmd.split()) assert result.exit_code == 0 - ref_output_dir = os.path.join(test_data_dir, source_bin.split(".")[0]) for segment in segments: segment_file_name = f"{segment}.bin" segment_file_path = os.path.join(tmpdir, segment_file_name) assert os.path.isfile(segment_file_path) assert filecmp.cmp( - os.path.join(ref_output_dir, segment_file_name), + os.path.join(config_dir, segment_file_name), segment_file_path, shallow=False, ) + + +def test_nxpimage_hab_export_secret_key_generated(tmpdir, hab_data_dir): + config_dir = os.path.join(hab_data_dir, "export", "rt1165_semcnand_encrypted_random") + runner = CliRunner() + with use_working_directory(tmpdir): + copytree(config_dir, tmpdir, dirs_exist_ok=True) + command_file_path = os.path.join(tmpdir, "config.bd") + app_file_path = os.path.join(tmpdir, "evkmimxrt1064_iled_blinky_SDRAM.s19") + output_file_path = os.path.join(tmpdir, "image_output.bin") + cmd = ( + f"hab export --command {command_file_path} --output {output_file_path} {app_file_path}" + ) + result = runner.invoke(nxpimage.main, cmd.split()) + assert result.exit_code == 0 + assert os.path.isfile(output_file_path) + secret_key_path = os.path.join( + tmpdir, "gen_hab_encrypt", "evkmimxrt1064_iled_blinky_SDRAM_hab_dek.bin" + ) + assert os.path.isfile(secret_key_path) + secret_key = load_file(secret_key_path, "rb") + assert len(secret_key) == 32 diff --git a/tests/nxpimage/test_nxpimage_iee.py b/tests/nxpimage/test_nxpimage_iee.py index 1bf10008..76f611d8 100644 --- a/tests/nxpimage/test_nxpimage_iee.py +++ b/tests/nxpimage/test_nxpimage_iee.py @@ -9,6 +9,7 @@ import shutil import pytest +import yaml from click.testing import CliRunner from spsdk.apps import nxpimage @@ -95,3 +96,38 @@ def test_nxpimage_iee_template_cli(tmpdir): result = runner.invoke(nxpimage.main, cmd.split()) assert result.exit_code == 0 assert os.path.isfile(template) + + +@pytest.mark.parametrize( + "case, config", + [ + ( + "aes_xts512_custom_names", + "iee_config.yaml", + ) + ], +) +def test_iee_custom_output(tmpdir, data_dir, case, config): + runner = CliRunner() + work_dir = os.path.join(tmpdir, "iee", case) + shutil.copytree(os.path.join(data_dir, "iee", case), work_dir) + shutil.copy(os.path.join(data_dir, "iee", INPUT_BINARY), work_dir) + + with use_working_directory(work_dir): + config_dict = load_configuration(config) + out_dir = os.path.join(work_dir, config_dict["output_folder"]) + config_dict["output_name"] = os.path.join(tmpdir, "iee_output") + config_dict["keyblob_name"] = "keyblob" + config_dict["encrypted_name"] = "" + + modified_config = os.path.join(work_dir, "modified_config.yaml") + with open(modified_config, "w") as f: + yaml.dump(config_dict, f) + cmd = f"iee export {modified_config}" + result = runner.invoke(nxpimage.main, cmd.split()) + assert result.exit_code == 0 + + assert os.path.isfile(os.path.join(out_dir, "keyblob.bin")) + assert not os.path.isfile(os.path.join(out_dir, "iee_rt117x_blhost.bcf")) + assert os.path.isfile(os.path.join(out_dir, "readme.txt")) + assert os.path.isfile(config_dict["output_name"] + ".bin") diff --git a/tests/nxpimage/test_nxpimage_otfad.py b/tests/nxpimage/test_nxpimage_otfad.py index cee4a7ff..d4ce0722 100644 --- a/tests/nxpimage/test_nxpimage_otfad.py +++ b/tests/nxpimage/test_nxpimage_otfad.py @@ -11,6 +11,7 @@ import shutil import pytest +import yaml from click.testing import CliRunner from spsdk.apps import nxpimage @@ -220,3 +221,33 @@ def test_nxpimage_otfad_template_cli(tmpdir, family): result = runner.invoke(nxpimage.main, cmd.split()) assert result.exit_code == 0 assert os.path.isfile(template) + + +@pytest.mark.parametrize( + "config", + [ + ("otfad_rt1170_custom_name.yaml"), + ], +) +def test_iee_custom_output(tmpdir, data_dir, config): + runner = CliRunner() + work_dir = os.path.join(tmpdir, "otfad") + shutil.copytree(os.path.join(data_dir, "otfad"), work_dir) + + with use_working_directory(work_dir): + config_dict = load_configuration(config) + out_dir = os.path.join(work_dir, config_dict["output_folder"]) + config_dict["output_name"] = os.path.join(tmpdir, "otfad_output") + config_dict["keyblob_name"] = "keyblob" + config_dict["encrypted_name"] = "" + + modified_config = os.path.join(work_dir, "modified_config.yaml") + with open(modified_config, "w") as f: + yaml.dump(config_dict, f) + cmd = f"otfad export {modified_config}" + result = runner.invoke(nxpimage.main, cmd.split()) + assert result.exit_code == 0 + + assert os.path.isfile(os.path.join(out_dir, "keyblob.bin")) + assert not os.path.isfile(os.path.join(out_dir, "readme.txt")) + assert os.path.isfile(config_dict["output_name"] + ".bin") diff --git a/tests/nxpimage/test_nxpimage_xmcd.py b/tests/nxpimage/test_nxpimage_xmcd.py index c54cc340..476829d2 100644 --- a/tests/nxpimage/test_nxpimage_xmcd.py +++ b/tests/nxpimage/test_nxpimage_xmcd.py @@ -14,8 +14,9 @@ from click.testing import CliRunner from spsdk.apps import nxpimage +from spsdk.exceptions import SPSDKError from spsdk.image.xmcd.xmcd import XMCD -from spsdk.utils.misc import use_working_directory +from spsdk.utils.misc import load_configuration, use_working_directory @pytest.mark.parametrize( @@ -108,3 +109,42 @@ def test_nxpimage_xmcd_template_cli(tmpdir, data_dir, family): with open(ref_template_path) as f: ref_template = yaml.safe_load(f) assert new_template == ref_template + + +@pytest.mark.parametrize( + "mem_type,config_type,option", + [ + ("semc_sdram", "simplified", None), + ("semc_sdram", "full", None), + ("flexspi_ram", "simplified", 0), + ("flexspi_ram", "simplified", 1), + ("flexspi_ram", "full", None), + ], +) +def test_nxpimage_xmcd_export_invalid(data_dir, mem_type, config_type, option): + file_base_name = f"{mem_type}_{config_type}" + if option is not None: + file_base_name += f"_{option}" + config = os.path.join(data_dir, "xmcd", "rt116x", f"{file_base_name}.yaml") + mandatory_fileds = ["family", "mem_type", "config_type", "xmcd_settings"] + # Check mandatory fields + for mandatory_field in mandatory_fileds: + config_data = load_configuration(config) + config_data.pop(mandatory_field) + with pytest.raises(SPSDKError): + XMCD.load_from_config(config_data) + # Check invalid mem_type + config_data = load_configuration(config) + config_data["mem_type"] = "unknown" + with pytest.raises(SPSDKError): + XMCD.load_from_config(config_data) + # Check invalid config_type + config_data = load_configuration(config) + config_data["config_type"] = "unknown" + with pytest.raises(SPSDKError): + XMCD.load_from_config(config_data) + # Check unsupported family + config_data = load_configuration(config) + config_data["family"] = "rt5xx" + with pytest.raises(SPSDKError): + XMCD.load_from_config(config_data) diff --git a/tests/utils/test_registers.py b/tests/utils/test_registers.py index 1a4abb18..f51beebf 100644 --- a/tests/utils/test_registers.py +++ b/tests/utils/test_registers.py @@ -57,7 +57,7 @@ def create_simple_regs(): - """Create siple reg structure with basic cases.""" + """Create simple reg structure with basic cases.""" regs = Registers(TEST_DEVICE_NAME) reg1 = RegsRegister(