From ec1f6accbfcb42e455c5905176edcf9637a90c1c Mon Sep 17 00:00:00 2001 From: Ryan Moran Date: Mon, 23 Jan 2023 10:48:59 -0800 Subject: [PATCH] Fix sbom syft tests --- .../cyclonedxhelpers/component_test.go | 6 +++--- .../formats/spdx22/model/to_syft_model.go | 2 +- .../spdx22/model/to_syft_model_test.go | 4 ++-- .../formats/spdx22/to_format_model.go | 2 +- .../formats/spdx22/to_format_model_test.go | 16 ++++++++-------- .../snapshot/TestImageEncoder.golden | 14 +++++++------- .../stereoscope-fixture-image-simple.golden | Bin 15360 -> 15360 bytes .../snapshot/TestImageEncoder.golden | 14 +++++++------- .../stereoscope-fixture-image-simple.golden | Bin 15360 -> 15360 bytes 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/sbom/internal/formats/cyclonedx13/cyclonedxhelpers/component_test.go b/sbom/internal/formats/cyclonedx13/cyclonedxhelpers/component_test.go index 2dbebfbf..c2ad5f6a 100644 --- a/sbom/internal/formats/cyclonedx13/cyclonedxhelpers/component_test.go +++ b/sbom/internal/formats/cyclonedx13/cyclonedxhelpers/component_test.go @@ -89,8 +89,8 @@ func Test_encodeComponentProperties(t *testing.T) { Version: "v0.0.0-20211006190231-62292e806868", Language: pkg.Go, Type: pkg.GoModulePkg, - MetadataType: pkg.GolangMetadataType, - Metadata: pkg.GolangMetadata{ + MetadataType: pkg.GolangBinMetadataType, + Metadata: pkg.GolangBinMetadata{ GoCompiledVersion: "1.17", Architecture: "amd64", H1Digest: "h1:KlOXYy8wQWTUJYFgkUI40Lzr06ofg5IRXUK5C7qZt1k=", @@ -98,7 +98,7 @@ func Test_encodeComponentProperties(t *testing.T) { }, expected: &[]cyclonedx.Property{ {Name: "syft:package:language", Value: pkg.Go.String()}, - {Name: "syft:package:metadataType", Value: "GolangMetadata"}, + {Name: "syft:package:metadataType", Value: "GolangBinMetadata"}, {Name: "syft:package:type", Value: "go-module"}, {Name: "syft:metadata:architecture", Value: "amd64"}, {Name: "syft:metadata:goCompiledVersion", Value: "1.17"}, diff --git a/sbom/internal/formats/spdx22/model/to_syft_model.go b/sbom/internal/formats/spdx22/model/to_syft_model.go index 3dc1d1bf..872efe94 100644 --- a/sbom/internal/formats/spdx22/model/to_syft_model.go +++ b/sbom/internal/formats/spdx22/model/to_syft_model.go @@ -371,7 +371,7 @@ func extractMetadata(p *spdx.Package, info pkgInfo) (pkg.MetadataType, interface h1Digest = digest break } - return pkg.GolangMetadataType, pkg.GolangMetadata{ + return pkg.GolangBinMetadataType, pkg.GolangBinMetadata{ H1Digest: h1Digest, } } diff --git a/sbom/internal/formats/spdx22/model/to_syft_model_test.go b/sbom/internal/formats/spdx22/model/to_syft_model_test.go index 6f4353cf..c3db26ef 100644 --- a/sbom/internal/formats/spdx22/model/to_syft_model_test.go +++ b/sbom/internal/formats/spdx22/model/to_syft_model_test.go @@ -302,8 +302,8 @@ func TestH1Digest(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { p := toSyftPackage(&test.pkg) - require.Equal(t, pkg.GolangMetadataType, p.MetadataType) - meta := p.Metadata.(pkg.GolangMetadata) + require.Equal(t, pkg.GolangBinMetadataType, p.MetadataType) + meta := p.Metadata.(pkg.GolangBinMetadata) require.Equal(t, test.expectedDigest, meta.H1Digest) }) } diff --git a/sbom/internal/formats/spdx22/to_format_model.go b/sbom/internal/formats/spdx22/to_format_model.go index 5d994e98..38cd58b3 100644 --- a/sbom/internal/formats/spdx22/to_format_model.go +++ b/sbom/internal/formats/spdx22/to_format_model.go @@ -433,7 +433,7 @@ func toPackageChecksums(p pkg.Package) ([]common.Checksum, bool) { }) } } - case pkg.GolangMetadata: + case pkg.GolangBinMetadata: // because the H1 digest is found in the Golang metadata we cannot claim that the files were analyzed algo, hexStr, err := util.HDigestToSHA(meta.H1Digest) if err != nil { diff --git a/sbom/internal/formats/spdx22/to_format_model_test.go b/sbom/internal/formats/spdx22/to_format_model_test.go index b86ec419..02b28362 100644 --- a/sbom/internal/formats/spdx22/to_format_model_test.go +++ b/sbom/internal/formats/spdx22/to_format_model_test.go @@ -78,8 +78,8 @@ func Test_toPackageChecksums(t *testing.T) { Name: "test", Version: "1.0.0", Language: pkg.Go, - MetadataType: pkg.GolangMetadataType, - Metadata: pkg.GolangMetadata{ + MetadataType: pkg.GolangBinMetadataType, + Metadata: pkg.GolangBinMetadata{ H1Digest: "h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=", }, }, @@ -383,8 +383,8 @@ func Test_H1Digest(t *testing.T) { pkg: pkg.Package{ Name: "github.com/googleapis/gnostic", Version: "v0.5.5", - MetadataType: pkg.GolangMetadataType, - Metadata: pkg.GolangMetadata{ + MetadataType: pkg.GolangBinMetadataType, + Metadata: pkg.GolangBinMetadata{ H1Digest: "h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=", }, }, @@ -395,8 +395,8 @@ func Test_H1Digest(t *testing.T) { pkg: pkg.Package{ Name: "github.com/googleapis/gnostic", Version: "v0.5.5", - MetadataType: pkg.GolangMetadataType, - Metadata: pkg.GolangMetadata{ + MetadataType: pkg.GolangBinMetadataType, + Metadata: pkg.GolangBinMetadata{ H1Digest: "h1:9fHAtK0uzzz", }, }, @@ -407,8 +407,8 @@ func Test_H1Digest(t *testing.T) { pkg: pkg.Package{ Name: "github.com/googleapis/gnostic", Version: "v0.5.5", - MetadataType: pkg.GolangMetadataType, - Metadata: pkg.GolangMetadata{ + MetadataType: pkg.GolangBinMetadataType, + Metadata: pkg.GolangBinMetadata{ H1Digest: "h12:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=", }, }, diff --git a/sbom/internal/formats/syft2/test-fixtures/snapshot/TestImageEncoder.golden b/sbom/internal/formats/syft2/test-fixtures/snapshot/TestImageEncoder.golden index f8c8aaef..9c0231fd 100644 --- a/sbom/internal/formats/syft2/test-fixtures/snapshot/TestImageEncoder.golden +++ b/sbom/internal/formats/syft2/test-fixtures/snapshot/TestImageEncoder.golden @@ -9,7 +9,7 @@ "locations": [ { "path": "/somefile-1.txt", - "layerID": "sha256:1f81e31b95fc8faee977cec0c9e2e7c7f8ee3b2ac44263a644e13a99daae33cd" + "layerID": "sha256:5cfa01376a90b8c5f98cebf09cbe95787159204609eb9745d0737c8d0b9906d3" } ], "licenses": [ @@ -40,7 +40,7 @@ "locations": [ { "path": "/somefile-2.txt", - "layerID": "sha256:1e294a74dcffa572a1a975d2fe82cc05b0832577ec9a35bc7b6fc2231dc6802a" + "layerID": "sha256:fea46ffc9ebb89aaf4ceae475266d57cdd9431f6a10cec18b28731c84a601bec" } ], "licenses": [], @@ -67,7 +67,7 @@ "type": "image", "target": { "userInput": "user-image-input", - "imageID": "sha256:ddd39d286d8bf3f5f918e73688fc7f538d188c6e85444f3a53c19d04da3a2890", + "imageID": "sha256:f09538f29e84126b5935870d2226c99561a668709065b6bdc3be9453164eb848", "manifestDigest": "sha256:2731251dc34951c0e50fcc643b4c5f74922dad1a5d98f302b504cf46cd5d9368", "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "tags": [ @@ -77,17 +77,17 @@ "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", - "digest": "sha256:1f81e31b95fc8faee977cec0c9e2e7c7f8ee3b2ac44263a644e13a99daae33cd", + "digest": "sha256:5cfa01376a90b8c5f98cebf09cbe95787159204609eb9745d0737c8d0b9906d3", "size": 22 }, { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", - "digest": "sha256:1e294a74dcffa572a1a975d2fe82cc05b0832577ec9a35bc7b6fc2231dc6802a", + "digest": "sha256:fea46ffc9ebb89aaf4ceae475266d57cdd9431f6a10cec18b28731c84a601bec", "size": 16 } ], - "manifest": "eyJzY2hlbWFWZXJzaW9uIjoyLCJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZG9ja2VyLmRpc3RyaWJ1dGlvbi5tYW5pZmVzdC52Mitqc29uIiwiY29uZmlnIjp7Im1lZGlhVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5kb2NrZXIuY29udGFpbmVyLmltYWdlLnYxK2pzb24iLCJzaXplIjo2NjcsImRpZ2VzdCI6InNoYTI1NjpkZGQzOWQyODZkOGJmM2Y1ZjkxOGU3MzY4OGZjN2Y1MzhkMTg4YzZlODU0NDRmM2E1M2MxOWQwNGRhM2EyODkwIn0sImxheWVycyI6W3sibWVkaWFUeXBlIjoiYXBwbGljYXRpb24vdm5kLmRvY2tlci5pbWFnZS5yb290ZnMuZGlmZi50YXIuZ3ppcCIsInNpemUiOjIwNDgsImRpZ2VzdCI6InNoYTI1NjoxZjgxZTMxYjk1ZmM4ZmFlZTk3N2NlYzBjOWUyZTdjN2Y4ZWUzYjJhYzQ0MjYzYTY0NGUxM2E5OWRhYWUzM2NkIn0seyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZG9ja2VyLmltYWdlLnJvb3Rmcy5kaWZmLnRhci5nemlwIiwic2l6ZSI6MjA0OCwiZGlnZXN0Ijoic2hhMjU2OjFlMjk0YTc0ZGNmZmE1NzJhMWE5NzVkMmZlODJjYzA1YjA4MzI1NzdlYzlhMzViYzdiNmZjMjIzMWRjNjgwMmEifV19", - "config": "eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsImNvbmZpZyI6eyJFbnYiOlsiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iXSwiV29ya2luZ0RpciI6Ii8iLCJPbkJ1aWxkIjpudWxsfSwiY3JlYXRlZCI6IjIwMjMtMDEtMTFUMTY6NDQ6NTAuNzIxOTcyMloiLCJoaXN0b3J5IjpbeyJjcmVhdGVkIjoiMjAyMy0wMS0xMVQxNjo0NDo1MC42ODY5OTI0WiIsImNyZWF0ZWRfYnkiOiJBREQgZmlsZS0xLnR4dCAvc29tZWZpbGUtMS50eHQgIyBidWlsZGtpdCIsImNvbW1lbnQiOiJidWlsZGtpdC5kb2NrZXJmaWxlLnYwIn0seyJjcmVhdGVkIjoiMjAyMy0wMS0xMVQxNjo0NDo1MC43MjE5NzIyWiIsImNyZWF0ZWRfYnkiOiJBREQgZmlsZS0yLnR4dCAvc29tZWZpbGUtMi50eHQgIyBidWlsZGtpdCIsImNvbW1lbnQiOiJidWlsZGtpdC5kb2NrZXJmaWxlLnYwIn1dLCJvcyI6ImxpbnV4Iiwicm9vdGZzIjp7InR5cGUiOiJsYXllcnMiLCJkaWZmX2lkcyI6WyJzaGEyNTY6MWY4MWUzMWI5NWZjOGZhZWU5NzdjZWMwYzllMmU3YzdmOGVlM2IyYWM0NDI2M2E2NDRlMTNhOTlkYWFlMzNjZCIsInNoYTI1NjoxZTI5NGE3NGRjZmZhNTcyYTFhOTc1ZDJmZTgyY2MwNWIwODMyNTc3ZWM5YTM1YmM3YjZmYzIyMzFkYzY4MDJhIl19fQ==", + "manifest": "eyJzY2hlbWFWZXJzaW9uIjoyLCJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZG9ja2VyLmRpc3RyaWJ1dGlvbi5tYW5pZmVzdC52Mitqc29uIiwiY29uZmlnIjp7Im1lZGlhVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5kb2NrZXIuY29udGFpbmVyLmltYWdlLnYxK2pzb24iLCJzaXplIjo2NjcsImRpZ2VzdCI6InNoYTI1NjpmMDk1MzhmMjllODQxMjZiNTkzNTg3MGQyMjI2Yzk5NTYxYTY2ODcwOTA2NWI2YmRjM2JlOTQ1MzE2NGViODQ4In0sImxheWVycyI6W3sibWVkaWFUeXBlIjoiYXBwbGljYXRpb24vdm5kLmRvY2tlci5pbWFnZS5yb290ZnMuZGlmZi50YXIuZ3ppcCIsInNpemUiOjIwNDgsImRpZ2VzdCI6InNoYTI1Njo1Y2ZhMDEzNzZhOTBiOGM1Zjk4Y2ViZjA5Y2JlOTU3ODcxNTkyMDQ2MDllYjk3NDVkMDczN2M4ZDBiOTkwNmQzIn0seyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZG9ja2VyLmltYWdlLnJvb3Rmcy5kaWZmLnRhci5nemlwIiwic2l6ZSI6MjA0OCwiZGlnZXN0Ijoic2hhMjU2OmZlYTQ2ZmZjOWViYjg5YWFmNGNlYWU0NzUyNjZkNTdjZGQ5NDMxZjZhMTBjZWMxOGIyODczMWM4NGE2MDFiZWMifV19", + "config": "eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsImNvbmZpZyI6eyJFbnYiOlsiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iXSwiV29ya2luZ0RpciI6Ii8iLCJPbkJ1aWxkIjpudWxsfSwiY3JlYXRlZCI6IjIwMjItMDMtMTFUMjA6NTQ6MjAuMjU4OTM3MVoiLCJoaXN0b3J5IjpbeyJjcmVhdGVkIjoiMjAyMi0wMy0xMVQyMDo1NDoyMC4yMTQxMjM2WiIsImNyZWF0ZWRfYnkiOiJBREQgZmlsZS0xLnR4dCAvc29tZWZpbGUtMS50eHQgIyBidWlsZGtpdCIsImNvbW1lbnQiOiJidWlsZGtpdC5kb2NrZXJmaWxlLnYwIn0seyJjcmVhdGVkIjoiMjAyMi0wMy0xMVQyMDo1NDoyMC4yNTg5MzcxWiIsImNyZWF0ZWRfYnkiOiJBREQgZmlsZS0yLnR4dCAvc29tZWZpbGUtMi50eHQgIyBidWlsZGtpdCIsImNvbW1lbnQiOiJidWlsZGtpdC5kb2NrZXJmaWxlLnYwIn1dLCJvcyI6ImxpbnV4Iiwicm9vdGZzIjp7InR5cGUiOiJsYXllcnMiLCJkaWZmX2lkcyI6WyJzaGEyNTY6NWNmYTAxMzc2YTkwYjhjNWY5OGNlYmYwOWNiZTk1Nzg3MTU5MjA0NjA5ZWI5NzQ1ZDA3MzdjOGQwYjk5MDZkMyIsInNoYTI1NjpmZWE0NmZmYzllYmI4OWFhZjRjZWFlNDc1MjY2ZDU3Y2RkOTQzMWY2YTEwY2VjMThiMjg3MzFjODRhNjAxYmVjIl19fQ==", "repoDigests": [] } }, diff --git a/sbom/internal/formats/syft2/test-fixtures/snapshot/stereoscope-fixture-image-simple.golden b/sbom/internal/formats/syft2/test-fixtures/snapshot/stereoscope-fixture-image-simple.golden index e58b9849687a4cfcf8559b8a87c301997c2bab25..fc8bec3c136bb09582ca6a0650bb68e8647a160c 100644 GIT binary patch literal 15360 zcmeHOTW{Mo6!!Ceg{Qs7Ht!b$d&rssEl?~)n{~i~AfPBR(PB%6Bo_&c{P!LCmc&@1 zC9<6qqhLV19#Y@oIU4*M52sG%-|R$gvU}lLleq$f}B*G#>O)xrKLnd zT5yM*af43tg%CrM^A1{EoAsY$Ks{^$C~{k@>PLOa~w z7y_;B|L-!-8lI`a{xQd5)Bc&{!TuXy-AeT=N|R_9wOt0$K{PRi%PNq?Vq}a`))}vq zh>17GbHN10&JjZ~Gs1|3IxC^tCd%_f8V*|z?HwnUgDhJ(Q@MI#1QF6hw1@EtK|{`l z1oa75no9gv-7wE8lV+|shm=n*qTww1ke5|v#twQzi=%uD4es)Pl&)CR99EUFmtU(S z&7z?#}?bkFr_l3h25lJgIKh>EnsZ9?F^Ljx!6BShjzkeUFCObTm4M-i_hO z7RirebFrN0w|q1myK+_YXI@;T*~L-1obCIpDsCouT0^|(dz}3?O-E}{pG@pV%kH;x zWZpg=r_txblMlZRre!f0<<^V_Wt?Wid--+tu3}!a$U-tYdkLTeSQ*bn)D-qIt(>i< zMXfS3P6PunIba@*(rkJi-EPGs_bQ~V;SWaU#ufc~5B=!X;QtwH05|+UVVDK~|0tka ztSIxb^XbU-NWZ$SwkY_Xs0RHbIPb0WPbd)`gt25K=>HysJ4-Hf->u)H@b)f$-q}Dw za6lj+5D*9myeS0Q9@cgh|HTmh3-RCGFO}B%-%oDM6h7N-S1Ofs9fq=j( zBH)qcRC%JEVwi}SYs!@b{wE>AYRv^ULO_8=g2y6GERCIJoMORTteEPzKmTDuH~D{v zgzvxmSroJA5n96?pJvWn*%DLZ0js4ZVLTwQ)U=iLDYAk21N)XLFMxw{I&12LVP#V> zKY}i#pU2QIIy^d>?|gdmt#5bma4X#Xr5o4unya*`54ZVvykIx23j0ZJuUt`Yo%-KV zbbHV^jeD%6f1Sqs3;exlEb`Bs2C!l7ohA>WBF`%i43$|_-AroQ%ABuJ!XqWA_vdK> zb*E8zX$TiXZoNU6N?|mLmE~Roiz@~fVZrFRR1$Md5EDoPU0gDrAW5ZF35qrNhlGOE zr6lhR6W&{B7%L3~Fa~rm2dq9KM8c&_63r;~!eC^b#VRIBQfw7)!w`<0jm~a=Kr+pK zOm?fIj7^q$S62VUkH2)_CjJNKbj1m;8RB#P2M*`|m%{z5e&9XdEt!+iR`vqm1HQOP zeqt^bo~3ey%S)S2T+gT1HFvI;)}+T?nT{tTH&h%6VL3)h#YsXW^U^5ow07{f5skcn zTBe;OwKw5hB5)qUVdaq{Ko*T_{@@y+dmw-2%h>_V#UB&;vL_CLjb(Nv6&|T literal 15360 zcmeHOTW{Mo6!!Ceg{Qs7Ht(bi?4fH4v_P>GZPo!Rih?2!6RoynNOF-N$bTQ{TjFf3 z+R9PWm4X3_w?pbXJk;UgCoHI;n1Rep3R+@IFp<_G0vRxjwW5w1OJ!<7TgNrUBoo#l z$WrDTy2+sZLWm*B`2el2yZ<3~fEneI3n~y9AcC0WgCTDh-Mz-LZgk~`)K${mhwCb@ zr}nt3{$D?N`Rdup@1Ghj!Uze*?&^J;_Q=sY`p2Bo!LYMVJ~gOq*^jROaW5!u(T@KQ z41vz}|94#$Ezi_q|CnQO*Z!%*(f(UtJxK9YlG|jObe#stQL@k#6pfdq38RV#!w@)y zEER+biL6YK!WJ@2DJ24FLY&A1$6OnM4028wk#gt2%Q6+{2ExDyB6NiC2;);Mri@KF z8cTvxNyuNJVp%jgFQ9to?_7SCOs|rsW!)5d4!*Uoaa_)Qg`4yrHB{@8M@^&6`K!j} zMKX1IR>M)U%PW`uQSN3!<(qCYPn*l#{mBA~eL1VtNn!jTHuawrAChUYoXw7s$8-N= z>)U5@eYP3s>vFc7L%l8ev#j3d#o2Mb8SRszsV)~~9w1(~Jt=-$=Chrs=Q@Mgrup>> znTLT(V)pTUTXn~Uavf^Ugx(LeJ0z3uy-guMX5STeu=>%}wu!TtZW?uX$$>fhe=&$rYT zZzBQ`frvmv;D3xj*Uj3!#DB4rn8f&RAJeY0{_iFJ>yHbf|KErD2RO!md%^jkcGB7Y zyT^Z#Ab7j~+n)c0W5Bro>tWJt;=f&|K?ud}Vzxdyi$cs6;ZuaBt6z-OekxY`4MT`s z6@NeRKg>yt|MXz}gTXHThrea~Z+HH;i~sSs{`aE)<~*;5AqY4;*Yz$8*h|;3lZZe> zAR-VE_=X5rYiVkU5>{o7I_^@eKvJQUGtzOYELO@0P@FO5sOHq*)FNgz)kLLe+=XuyGf%@Z%4vX9N&^OYYB&Mu*8>GWGolS+L{RNHy@07s zQ>!&lPZRf2w~~OQOiN~sbDB${u}&qo#DOBlAf6#b36~N~swvNm%!D(<(>|;b3K5;W zz5Wi#G`(2tVLO@YB6m#OaU_J{7%7!mOC)nrs}#}{ z{AVL6a>AFg6eMxZq?}76jTL~E{{)2)!?VEudmcDwtL_dL&hpQ3IBuL@&ffm?`AX@r zX61EN=l)HaLw#S}w%I?q`8Fu50>S=;i1vS9>e!QemDDX38hnS&MtT5-`Sta~w4gmW PV4*M52sG%-|R$gvU}lLleq$f}B*G#>O)xrKLnd zT5yM*af43tg%CrM^A1{EoAsY$Ks{^$C~{k@>PLOa~w z7y_;B|L-!-8lI`a{xQd5)Bc&{!TuXy-AeT=N|R_9wOt0$K{PRi%PNq?Vq}a`))}vq zh>17GbHN10&JjZ~Gs1|3IxC^tCd%_f8V*|z?HwnUgDhJ(Q@MI#1QF6hw1@EtK|{`l z1oa75no9gv-7wE8lV+|shm=n*qTww1ke5|v#twQzi=%uD4es)Pl&)CR99EUFmtU(S z&7z?#}?bkFr_l3h25lJgIKh>EnsZ9?F^Ljx!6BShjzkeUFCObTm4M-i_hO z7RirebFrN0w|q1myK+_YXI@;T*~L-1obCIpDsCouT0^|(dz}3?O-E}{pG@pV%kH;x zWZpg=r_txblMlZRre!f0<<^V_Wt?Wid--+tu3}!a$U-tYdkLTeSQ*bn)D-qIt(>i< zMXfS3P6PunIba@*(rkJi-EPGs_bQ~V;SWaU#ufc~5B=!X;QtwH05|+UVVDK~|0tka ztSIxb^XbU-NWZ$SwkY_Xs0RHbIPb0WPbd)`gt25K=>HysJ4-Hf->u)H@b)f$-q}Dw za6lj+5D*9myeS0Q9@cgh|HTmh3-RCGFO}B%-%oDM6h7N-S1Ofs9fq=j( zBH)qcRC%JEVwi}SYs!@b{wE>AYRv^ULO_8=g2y6GERCIJoMORTteEPzKmTDuH~D{v zgzvxmSroJA5n96?pJvWn*%DLZ0js4ZVLTwQ)U=iLDYAk21N)XLFMxw{I&12LVP#V> zKY}i#pU2QIIy^d>?|gdmt#5bma4X#Xr5o4unya*`54ZVvykIx23j0ZJuUt`Yo%-KV zbbHV^jeD%6f1Sqs3;exlEb`Bs2C!l7ohA>WBF`%i43$|_-AroQ%ABuJ!XqWA_vdK> zb*E8zX$TiXZoNU6N?|mLmE~Roiz@~fVZrFRR1$Md5EDoPU0gDrAW5ZF35qrNhlGOE zr6lhR6W&{B7%L3~Fa~rm2dq9KM8c&_63r;~!eC^b#VRIBQfw7)!w`<0jm~a=Kr+pK zOm?fIj7^q$S62VUkH2)_CjJNKbj1m;8RB#P2M*`|m%{z5e&9XdEt!+iR`vqm1HQOP zeqt^bo~3ey%S)S2T+gT1HFvI;)}+T?nT{tTH&h%6VL3)h#YsXW^U^5ow07{f5skcn zTBe;OwKw5hB5)qUVdaq{Ko*T_{@@y+dmw-2%h>_V#UB&;vL_CLjb(Nv6&|T literal 15360 zcmeHOTW{Mo6!!Ceg{Qs7Ht(bi?4fH4v_P>GZPo!Rih?2!6RoynNOF-N$bTQ{TjFf3 z+R9PWm4X3_w?pbXJk;UgCoHI;n1Rep3R+@IFp<_G0vRxjwW5w1OJ!<7TgNrUBoo#l z$WrDTy2+sZLWm*B`2el2yZ<3~fEneI3n~y9AcC0WgCTDh-Mz-LZgk~`)K${mhwCb@ zr}nt3{$D?N`Rdup@1Ghj!Uze*?&^J;_Q=sY`p2Bo!LYMVJ~gOq*^jROaW5!u(T@KQ z41vz}|94#$Ezi_q|CnQO*Z!%*(f(UtJxK9YlG|jObe#stQL@k#6pfdq38RV#!w@)y zEER+biL6YK!WJ@2DJ24FLY&A1$6OnM4028wk#gt2%Q6+{2ExDyB6NiC2;);Mri@KF z8cTvxNyuNJVp%jgFQ9to?_7SCOs|rsW!)5d4!*Uoaa_)Qg`4yrHB{@8M@^&6`K!j} zMKX1IR>M)U%PW`uQSN3!<(qCYPn*l#{mBA~eL1VtNn!jTHuawrAChUYoXw7s$8-N= z>)U5@eYP3s>vFc7L%l8ev#j3d#o2Mb8SRszsV)~~9w1(~Jt=-$=Chrs=Q@Mgrup>> znTLT(V)pTUTXn~Uavf^Ugx(LeJ0z3uy-guMX5STeu=>%}wu!TtZW?uX$$>fhe=&$rYT zZzBQ`frvmv;D3xj*Uj3!#DB4rn8f&RAJeY0{_iFJ>yHbf|KErD2RO!md%^jkcGB7Y zyT^Z#Ab7j~+n)c0W5Bro>tWJt;=f&|K?ud}Vzxdyi$cs6;ZuaBt6z-OekxY`4MT`s z6@NeRKg>yt|MXz}gTXHThrea~Z+HH;i~sSs{`aE)<~*;5AqY4;*Yz$8*h|;3lZZe> zAR-VE_=X5rYiVkU5>{o7I_^@eKvJQUGtzOYELO@0P@FO5sOHq*)FNgz)kLLe+=XuyGf%@Z%4vX9N&^OYYB&Mu*8>GWGolS+L{RNHy@07s zQ>!&lPZRf2w~~OQOiN~sbDB${u}&qo#DOBlAf6#b36~N~swvNm%!D(<(>|;b3K5;W zz5Wi#G`(2tVLO@YB6m#OaU_J{7%7!mOC)nrs}#}{ z{AVL6a>AFg6eMxZq?}76jTL~E{{)2)!?VEudmcDwtL_dL&hpQ3IBuL@&ffm?`AX@r zX61EN=l)HaLw#S}w%I?q`8Fu50>S=;i1vS9>e!QemDDX38hnS&MtT5-`Sta~w4gmW PV