diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2026-07-06 16:40:47 +0000 |
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2026-07-06 16:41:15 +0000 |
| commit | 3838aee84536f5957d08f2914aa03181f9c41c89 (patch) | |
| tree | 6de1ade940992eb97a1ee4dce7d4be77a7393987 | |
| parent | 2c72d8219c5679490c3becad8118ea5c8950b893 (diff) | |
177 files changed, 37621 insertions, 15680 deletions
@@ -73,6 +73,7 @@ kexgexs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compa kexmlkem768x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h log.h kexsntrup761x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssherr.h sshkey.h misc.h log.h digest.h bitmap.h utf8.h krl.h +libcrux-mlkem-mldsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h loginrec.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h ssh.h loginrec.h log.h ssherr.h atomicio.h packet.h dispatch.h canohost.h auth.h auth-pam.h audit.h sshbuf.h misc.h logintest.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h loginrec.h @@ -126,7 +127,7 @@ sk-usbhid.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-com sntrup761.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h srclimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h canohost.h log.h ssherr.h misc.h srclimit.h xmalloc.h servconf.h match.h ssh-add.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h log.h ssherr.h sshkey.h sshbuf.h authfd.h authfile.h pathnames.h misc.h digest.h ssh-sk.h sk-api.h hostfile.h -ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h digest.h match.h msg.h pathnames.h ssh-pkcs11.h sk-api.h myproposal.h +ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h digest.h match.h msg.h pathnames.h ssh-pkcs11.h sk-api.h myproposal.h version.h ssh-ecdsa-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h sshbuf.h ssherr.h digest.h sshkey.h ssh-ecdsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh-ed25519-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h digest.h @@ -136,6 +137,7 @@ ssh-keygen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-co ssh-keyscan.o: atomicio.h misc.h hostfile.h ssh_api.h ssh2.h dns.h addr.h ssh-keyscan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h kex.h mac.h crypto_api.h compat.h myproposal.h packet.h dispatch.h log.h ssherr.h ssh-keysign.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h ssh.h ssh2.h misc.h sshbuf.h authfile.h msg.h canohost.h pathnames.h readconf.h uidswap.h +ssh-mldsa-eddsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh-pkcs11-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h pathnames.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h atomicio.h ssh-pkcs11.h ssh-pkcs11-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h ssh-pkcs11.h ssh-pkcs11.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshkey.h ssh-pkcs11.h diff --git a/.git_allowed_signers.asc b/.git_allowed_signers.asc index 1a8401b838a3..4d7269b1b485 100644 --- a/.git_allowed_signers.asc +++ b/.git_allowed_signers.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmYHnZ8ACgkQKj9BTnNg -YLquuQ/6A8E6P2jcgn3wmbbCTXP7kmxoh3nmw/e6PC8CEua1512oT3GHOKVD5cGK -cgYRObpWvjOjg7L1HRABftq7a9M2zfsGnY/WNe3/fbetfkyY8hG8c31vA1ePIOt2 -AjBLCWFblH0CtyH/MssoQ19JCLtXK/GmekB1Q0JzyOog7w/0r3CKuUnZ0juCYR1R -4FBePl5l3nFSZEcFEdptGlNGeuolS5XBCqB9Y91TCzkVkH5eXUUW+shgjNhWCEhT -pZvkxfhsmOEnwNofyPdgKVfDBVkHmvuC67EU395mJVN4c2NZ8pOztb9hOt3xr980 -q44I4kT2NpaApCx1dWIGhMy/37LJ8heI0W1B+ofTA5n34/RU8UXH3SCkj2AK6Ao5 -H2u8vbmuWKUCiECmrw35EeKGmtuK/bWJzx3KBP7fx5J9S3mWUgT4W4xlWNN9RWoU -sSvH1ppie5ARINVaAWl5k44fk60ahTf80DbQBIOZBmQn7myZZka+yGcQbAiZZ1Gc -0l8+Nf5Ao1ckmuyY5o8FyWdsyDeK3+MqjPn5Rr1CqbKCn2VnqrVWbI33Eyu8c96U -bxVgU5H1BDhNjJC8UrT3LFPvJMO8p3a0IJ3eHydjk2jVOhOdBZmA0yoqUTrhPpXq -ymIHESjDJR8TDe4TCfb46o9oEC3cdbDwgnzPqdg0n+0uIsJLYiU= -=gl+l +iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmnevEAACgkQKj9BTnNg +YLr72w//ay7JpFSfUF5h97Vi2T58fwkRO2aapXrK8f3mnzeelN9H09XBpRquFZCL +o5S/8RSmVtRjCTXyo7GjwhaAF6+XyKiKgwvjTnY9EA4leCCoNdBJ2/77xlBZdPD4 +AuKPRQKpGjJi+P+2yB0ocgpT6MWXDlg0xkdLWaiQC4xpADUD9AlebUVHtCPOqXWb +LgGampMjQu8usg9QX3x0oHpuMUot+wo3dTD2xjgWv03DmPK7wCUiA760GeEGibma +jv3JT8JZnDtPk4J0PpoJecoJsMhH9Zoy55yi3d4y/SxBUSIBFs2qcw4tO3iixZwD +mlZVW83KFhIlH6Q8GJtymrYrQ2Gw88wWZ6Oj3glzHCkrxUeO9MIbnTSzXekg6+O7 +qBxQC4xdlNtHFS+GvG3EZzztl8C4Qfmdl35bStQaVhWzygI5+o19yoeYi4lMTYQM +CAH6ONeDFvm3SwlTJk41O/zXz7mO1vRpsn5QMCHt3KLBZkkMrSKl4C2r9iuq7MeY +gx3mnPW6/yu1TzGUl5wtzeb6I2R1/zPK3ibhbGQyt4WggCio3D8xmcmhyxKL79fi +Pb02QXRYplXrkR6Lf2HCRdJoNu3bodqelkeiAtgj0CLHlK355dtmya6txn4Ccoc1 ++kH7vdHqPKJSrsMBZ/Qm+0dA9Kq4Qoib2tog9De09u5p8XQUdAY= +=9i1L -----END PGP SIGNATURE----- diff --git a/.github/ci-status.md b/.github/ci-status.md index 00a1db0df76a..5d17f893761d 100644 --- a/.github/ci-status.md +++ b/.github/ci-status.md @@ -8,6 +8,11 @@ master : [](https://scan.coverity.com/projects/openssh-portable) <br> +10.3 : +[](../../../actions/workflows/c-cpp.yml?query=branch:V_10_3) +[](../../../actions/workflows/vm.yml?query=branch:V_10_3) +[](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_3) + 10.2 : [](../../../actions/workflows/c-cpp.yml?query=branch:V_10_2) [](../../../actions/workflows/vm.yml?query=branch:V_10_2) @@ -18,10 +23,3 @@ master : [](../../../actions/workflows/vm.yml?query=branch:V_10_1) [](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_1) -10.0 : -[](../../../actions/workflows/c-cpp.yml?query=branch:V_10_0) -[](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_0) - -9.9 : -[](../../../actions/workflows/c-cpp.yml?query=branch:V_9_9) -[](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_9_9) diff --git a/.github/configs b/.github/configs index 9ad2439df493..ece6441b1617 100755 --- a/.github/configs +++ b/.github/configs @@ -185,6 +185,11 @@ case "$config" in libressl-*) LIBCRYPTOFLAGS="--with-ssl-dir=/opt/libressl --with-rpath=-Wl,-rpath," ;; + dropbear-*) + CONFIGFLAGS="--with-dbclient=/usr/local/bin/plink --with-dropbear=/usr/local/sbin/dropbear" + # We don't need to rerun the regular tests, just the interop ones. + TEST_TARGET=interop-tests + ;; putty-*) CONFIGFLAGS="--with-plink=/usr/local/bin/plink --with-puttygen=/usr/local/bin/puttygen" # We don't need to rerun the regular tests, just the interop ones. @@ -203,7 +208,7 @@ case "$config" in ;; sk) CONFIGFLAGS="--with-security-key-builtin --with-security-key-standalone" - ;; + ;; without-openssl) LIBCRYPTOFLAGS="--without-openssl" TEST_TARGET=t-exec diff --git a/.github/install_dropbear.sh b/.github/install_dropbear.sh new file mode 100755 index 000000000000..ed91c52f7cdb --- /dev/null +++ b/.github/install_dropbear.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Install specified Dropbear version into /usr/local. +# + +ver="$1" + +echo +echo --------------------------------------------- +echo Installing dropbear version: ${ver} +echo --------------------------------------------- + +set -e + +cd /tmp + +if [ ! -d dropbear-clean ]; then + git clone https://github.com/mkj/dropbear.git dropbear-clean + (cd dropbear-clean && git config --global advice.detachedHead false) +fi + +rm -rf dropbear +cp -a dropbear-clean dropbear +cd dropbear +git checkout "$ver" +git status +echo "Building Dropbear version '$ver'" +( + autoreconf 2>&1 && + ./configure 2>&1 && + make clean 2>&1 && + make 2>&1 && + sudo make install 2>&1) >/tmp/db-build.log 2>&1 || cat /tmp/db-build.log + +echo "Installed dropbear version: '$(/usr/local/bin/dbclient -V 2>&1)'" diff --git a/.github/install_libcrypto.sh b/.github/install_libcrypto.sh index d1aa23450679..cef9416808d8 100755 --- a/.github/install_libcrypto.sh +++ b/.github/install_libcrypto.sh @@ -51,7 +51,7 @@ if [ "${abi_compat_test}" = "y" ]; then ver="${major}.$((${minor} + 1))" echo selecting next release branch ${ver} ;; - openssl-3.*.*) + openssl-[34].*.*) major=$(echo ${ver} | cut -f1 -d.) minor=$(echo ${ver} | cut -f2 -d.) patch=$(echo ${ver} | cut -f3 -d.) diff --git a/.github/pin_actions.sh b/.github/pin_actions.sh new file mode 100755 index 000000000000..8b64e823827e --- /dev/null +++ b/.github/pin_actions.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Look up specified version of Github Actions an pin to that specific +# revision. +# + +set -e + +github=https://github.com + +for workflow in workflows/*.yml; do + sed 's/ - / /' ${workflow} | grep -v '^#' | awk '/uses:/ {print}' | \ + while read line; do + action_ver=$(awk '{print $2}' <<<${line}) + action=$(cut -f1 -d@ <<<${action_ver}) + ver=$(cut -f2 -d@ <<<${action_ver}) + intendedver=$(awk '{print $4}' <<<${line}) + if [ -z "${intendedver}" ]; then + intendedver=${ver} + fi + case "${action}" in + google/oss-fuzz/*) actiondir=google/oss-fuzz ;; + *) actiondir="${action}" ;; + esac + if [ ! -d /tmp/${actiondir} ]; then + git clone ${github}/${actiondir} /tmp/${actiondir} + fi + hash=$(cd /tmp/${actiondir} && git rev-parse ${intendedver}) + sed -i -e "s|uses: ${action}@.*|uses: ${action}@${hash} # ${intendedver}|" \ + ${workflow} + done +done + +# Output actions for allowlist. +awk 'BEGIN{IFS=":"} /^ +uses:.*@/{print $2","}' workflows/*.yml | sort -u diff --git a/.github/run_test.sh b/.github/run_test.sh index c67d00700f23..63aa31f6c004 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -15,8 +15,8 @@ if [ ! -z "$SUDO" ] && [ ! -z "$TEST_SSH_HOSTBASED_AUTH" ]; then $SUDO mkdir -p $sshconf $SUDO make install for key in $sshconf/ssh_host*key*.pub; do - echo `hostname` `cat $key` | \ - $SUDO tee -a $sshconf/ssh_known_hosts >/dev/null + echo `hostname` `cat $key` | \ + $SUDO tee -a $sshconf/ssh_known_hosts >/dev/null done fi @@ -45,6 +45,22 @@ if [ "$1" = "putty-versions" ]; then exit 0 fi +if [ "$1" = "dropbear-versions" ]; then + make regress-binaries + # Work backward from current version to last version we support. + for ver in main `cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn`; do + year=`echo "$ver" | cut -f2 -d_ | cut -f1 -d.` + if [ "$ver" != "master" ] && [ "$year" -lt "2020" ]; then + exit 0 + fi + .github/install_dropbear.sh "${ver}" + ${env} make ${TEST_TARGET} \ + SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}" + done + + exit 0 +fi + if [ -z "${LTESTS}" ]; then ${env} make ${TEST_TARGET} SKIP_LTESTS="${SKIP_LTESTS}" else @@ -59,8 +75,8 @@ fi if [ ! -z "${SSHD_CONFOPTS}" ]; then echo "rerunning t-exec with TEST_SSH_SSHD_CONFOPTS='${SSHD_CONFOPTS}'" if [ -z "${LTESTS}" ]; then - ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" + ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" else - ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" + ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" fi fi diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index e1b3dcf04a84..6ab4e4fb56f2 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -8,8 +8,8 @@ PACKAGES="tmux" echo Running as: id -echo Environment: -set +echo Saving environment to runner-env.txt +set >runner-env.txt . .github/configs ${config} @@ -20,16 +20,36 @@ case "$host" in PACKAGER=setup echo Setting CYGWIN system environment variable. setx CYGWIN "winsymlinks:native" - echo Removing extended ACLs so umask works as expected. - set -x - setfacl -b . regress - icacls regress /c /t /q /Inheritance:d - icacls regress /c /t /q /Grant ${USERNAME}:F - icacls regress /c /t /q /Remove:g "Authenticated Users" \ - BUILTIN\\Administrators BUILTIN Everyone System Users - takeown /F regress + echo Removing extended ACLs on regress so umask works as expected. + echo "Original ACLs" icacls regress - set +x + setfacl -b regress + icacls regress /c /t /q /grant 'BUILTIN\Administrators:(RX)' + echo "Modifiled ACLs" + icacls regress + + echo Enabling OpenSSL rh-allow-sha1-signatures for unit tests. + cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak + cat >>/etc/pki/tls/openssl.cnf <<EOD +[openssl_init] +alg_section = evp_properties + +[evp_properties] +rh-allow-sha1-signatures = yes +EOD + openssl list -providers -provider legacy + printf "Test openssl signing with RSA+SHA1: " + openssl genpkey -quiet -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048 + openssl pkey -in private_key.pem -pubout -out public_key.pem + if ! openssl dgst -sha1 -sign private_key.pem -out signature.sig public_key.pem; then + echo fail + echo "openssl could not sign with RSA+SHA1." + cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak regress/ + exit 1 + else + echo success + fi + PACKAGES="$PACKAGES,autoconf,automake,cygwin-devel,gcc-core" PACKAGES="$PACKAGES,make,openssl,libssl-devel,zlib-devel" ;; @@ -87,82 +107,88 @@ echo "Setting up for '$TARGETS'" for TARGET in $TARGETS; do case $TARGET in default|without-openssl|without-zlib|c89) - # nothing to do - ;; + # nothing to do + ;; clang-sanitize*) - PACKAGES="$PACKAGES clang-12" - ;; + PACKAGES="$PACKAGES clang-12" + ;; cygwin-release) - PACKAGES="$PACKAGES libcrypt-devel libfido2-devel libkrb5-devel" - ;; + PACKAGES="$PACKAGES libcrypt-devel libfido2-devel libkrb5-devel" + ;; gcc-sanitize*) - ;; + ;; clang-*|gcc-*) - compiler=$(echo $TARGET | sed 's/-Werror//') - PACKAGES="$PACKAGES $compiler" - ;; + compiler=$(echo $TARGET | sed 's/-Werror//') + PACKAGES="$PACKAGES $compiler" + ;; krb5) - PACKAGES="$PACKAGES libkrb5-dev libnss-wrapper krb5-admin-server" + PACKAGES="$PACKAGES libkrb5-dev libnss-wrapper krb5-admin-server" ;; heimdal) - PACKAGES="$PACKAGES heimdal-dev libnss-wrapper krb5-admin-server" - ;; + PACKAGES="$PACKAGES heimdal-dev libnss-wrapper krb5-admin-server" + ;; libedit) case "$PACKAGER" in setup) PACKAGES="$PACKAGES libedit-devel" ;; apt) PACKAGES="$PACKAGES libedit-dev" ;; esac - ;; + ;; *pam) case "$PACKAGER" in apt) PACKAGES="$PACKAGES libpam0g-dev" ;; esac - ;; + ;; sk) - INSTALL_FIDO_PPA="yes" - PACKAGES="$PACKAGES libfido2-dev libu2f-host-dev libcbor-dev" - ;; + INSTALL_FIDO_PPA="yes" + PACKAGES="$PACKAGES libfido2-dev libu2f-host-dev libcbor-dev" + ;; selinux) - PACKAGES="$PACKAGES libselinux1-dev selinux-policy-dev libaudit-dev" - ;; + PACKAGES="$PACKAGES libselinux1-dev selinux-policy-dev libaudit-dev" + ;; hardenedmalloc) - INSTALL_HARDENED_MALLOC=yes - ;; + INSTALL_HARDENED_MALLOC=yes + # Need clang >= 19 for constexpr. + PACKAGES="$PACKAGES clang-19" + ;; musl) PACKAGES="$PACKAGES musl-tools" ;; tcmalloc) - PACKAGES="$PACKAGES libgoogle-perftools-dev" - ;; + PACKAGES="$PACKAGES libgoogle-perftools-dev" + ;; openssl-noec) INSTALL_OPENSSL=OpenSSL_1_1_1k SSLCONFOPTS="no-ec" ;; openssl-*) - INSTALL_OPENSSL=$(echo ${TARGET} | cut -f2 -d-) - case ${INSTALL_OPENSSL} in - 1.1.1_stable) INSTALL_OPENSSL="OpenSSL_1_1_1-stable" ;; - 1.*) INSTALL_OPENSSL="OpenSSL_$(echo ${INSTALL_OPENSSL} | tr . _)" ;; - 3.*) INSTALL_OPENSSL="openssl-${INSTALL_OPENSSL}" ;; - esac - PACKAGES="${PACKAGES} putty-tools dropbear-bin" + INSTALL_OPENSSL=$(echo ${TARGET} | cut -f2 -d-) + case ${INSTALL_OPENSSL} in + 1.1.1_stable) INSTALL_OPENSSL="OpenSSL_1_1_1-stable" ;; + 1.*) INSTALL_OPENSSL="OpenSSL_$(echo ${INSTALL_OPENSSL} | tr . _)" ;; + master) ;; + *) INSTALL_OPENSSL="openssl-${INSTALL_OPENSSL}" ;; + esac + PACKAGES="${PACKAGES} putty-tools dropbear-bin" ;; libressl-*) - INSTALL_LIBRESSL=$(echo ${TARGET} | cut -f2 -d-) - case ${INSTALL_LIBRESSL} in - master) ;; - *) INSTALL_LIBRESSL="$(echo ${TARGET} | cut -f2 -d-)" ;; - esac - PACKAGES="${PACKAGES} putty-tools dropbear-bin" + INSTALL_LIBRESSL=$(echo ${TARGET} | cut -f2 -d-) + case ${INSTALL_LIBRESSL} in + master) ;; + *) INSTALL_LIBRESSL="$(echo ${TARGET} | cut -f2 -d-)" ;; + esac + PACKAGES="${PACKAGES} putty-tools dropbear-bin" ;; boringssl) - INSTALL_BORINGSSL=1 - PACKAGES="${PACKAGES} cmake ninja-build" + INSTALL_BORINGSSL=1 + PACKAGES="${PACKAGES} cmake ninja-build" ;; aws-lc) - INSTALL_AWSLC=1 - PACKAGES="${PACKAGES} cmake ninja-build" - ;; + INSTALL_AWSLC=1 + PACKAGES="${PACKAGES} cmake ninja-build" + ;; + dropbear-versions) + INSTALL_DROPBEAR=main + ;; putty-*) INSTALL_PUTTY=0.83 PACKAGES="${PACKAGES} cmake" @@ -173,8 +199,8 @@ for TARGET in $TARGETS; do zlib-*) ;; *) echo "Invalid option '${TARGET}'" - exit 1 - ;; + exit 1 + ;; esac done @@ -221,7 +247,7 @@ if [ "${INSTALL_HARDENED_MALLOC}" = "yes" ]; then (cd ${HOME} && git clone https://github.com/GrapheneOS/hardened_malloc.git && cd ${HOME}/hardened_malloc && - make && sudo cp out/libhardened_malloc.so /usr/lib/) + make CC=clang-19 && sudo cp out/libhardened_malloc.so /usr/lib/) fi if [ ! -z "${INSTALL_OPENSSL}" ]; then @@ -231,20 +257,20 @@ fi if [ ! -z "${INSTALL_LIBRESSL}" ]; then if [ "${INSTALL_LIBRESSL}" = "master" ]; then - (mkdir -p ${HOME}/libressl && cd ${HOME}/libressl && - git clone https://github.com/libressl-portable/portable.git && - cd ${HOME}/libressl/portable && - git checkout ${INSTALL_LIBRESSL} && - sh update.sh && sh autogen.sh && - ./configure --prefix=/opt/libressl && - make && sudo make install) + (mkdir -p ${HOME}/libressl && cd ${HOME}/libressl && + git clone https://github.com/libressl-portable/portable.git && + cd ${HOME}/libressl/portable && + git checkout ${INSTALL_LIBRESSL} && + sh update.sh && sh autogen.sh && + ./configure --prefix=/opt/libressl && + make && sudo make install) else - LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL - (cd ${HOME} && - wget ${LIBRESSL_URLBASE}/libressl-${INSTALL_LIBRESSL}.tar.gz && - tar xfz libressl-${INSTALL_LIBRESSL}.tar.gz && - cd libressl-${INSTALL_LIBRESSL} && - ./configure --prefix=/opt/libressl && make && sudo make install) + LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL + (cd ${HOME} && + wget ${LIBRESSL_URLBASE}/libressl-${INSTALL_LIBRESSL}.tar.gz && + tar xfz libressl-${INSTALL_LIBRESSL}.tar.gz && + cd libressl-${INSTALL_LIBRESSL} && + ./configure --prefix=/opt/libressl && make && sudo make install) fi fi @@ -272,6 +298,9 @@ if [ ! -z "${INSTALL_ZLIB}" ]; then sudo make install prefix=/opt/zlib) fi +if [ ! -z "${INSTALL_DROPBEAR}" ]; then + .github/install_dropbear.sh "${INSTALL_DROPBEAR}" +fi if [ ! -z "${INSTALL_PUTTY}" ]; then .github/install_putty.sh "${INSTALL_PUTTY}" fi diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 02cd10bfbb6e..ffead602f5d3 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -9,6 +9,7 @@ name: CI # fail immediately. # # LTESTS: Override the set of tests run. +# TEST_SSH_TRACE: Set to yes for additional regress output. on: push: @@ -51,7 +52,6 @@ jobs: - { target: ubuntu-22.04, config: gcc-12-Werror } - { target: ubuntu-22.04, config: gcc-sanitize-address } - { target: ubuntu-22.04, config: gcc-sanitize-undefined } - - { target: ubuntu-22.04, config: hardenedmalloc } - { target: ubuntu-22.04, config: heimdal } - { target: ubuntu-22.04, config: kitchensink } - { target: ubuntu-22.04, config: krb5 } @@ -63,7 +63,7 @@ jobs: - { target: ubuntu-22.04, config: valgrind-2 } - { target: ubuntu-22.04, config: valgrind-3 } - { target: ubuntu-22.04, config: valgrind-4 } - - { target: ubuntu-22.04, config: valgrind-pam-1 } + # - { target: ubuntu-22.04, config: valgrind-pam-1 } - { target: ubuntu-22.04, config: valgrind-unit } - { target: ubuntu-22.04, config: without-openssl } - { target: ubuntu-latest, config: gcc-14 } @@ -71,6 +71,7 @@ jobs: - { target: ubuntu-latest, config: clang-19 } - { target: ubuntu-latest, config: boringssl } - { target: ubuntu-latest, config: aws-lc } + - { target: ubuntu-latest, config: hardenedmalloc } - { target: ubuntu-latest, config: libressl-master } - { target: ubuntu-latest, config: libressl-3.2.7 } - { target: ubuntu-latest, config: libressl-3.3.6 } @@ -83,6 +84,7 @@ jobs: - { target: ubuntu-latest, config: libressl-4.0.1 } - { target: ubuntu-latest, config: libressl-4.1.1 } - { target: ubuntu-latest, config: libressl-4.2.0 } + - { target: ubuntu-latest, config: libressl-4.3.2 } - { target: ubuntu-latest, config: openssl-master } - { target: ubuntu-latest, config: openssl-noec } - { target: ubuntu-latest, config: openssl-1.1.1 } @@ -93,12 +95,14 @@ jobs: - { target: ubuntu-latest, config: openssl-3.1.0 } - { target: ubuntu-latest, config: openssl-3.1.8 } - { target: ubuntu-latest, config: openssl-3.2.6 } - - { target: ubuntu-latest, config: openssl-3.3.5 } + - { target: ubuntu-latest, config: openssl-3.3.7 } - { target: ubuntu-latest, config: openssl-3.4.0 } - - { target: ubuntu-latest, config: openssl-3.4.3 } + - { target: ubuntu-latest, config: openssl-3.4.5 } - { target: ubuntu-latest, config: openssl-3.5.0 } - { target: ubuntu-latest, config: openssl-3.5.3 } # keep - - { target: ubuntu-latest, config: openssl-3.5.4 } + - { target: ubuntu-latest, config: openssl-3.5.6 } + - { target: ubuntu-latest, config: openssl-3.6.2 } + - { target: ubuntu-latest, config: openssl-4.0.0 } - { target: ubuntu-latest, config: openssl-1.1.1_stable } - { target: ubuntu-latest, config: openssl-3.0 } # stable branch - { target: ubuntu-latest, config: openssl-3.1 } # stable branch @@ -107,6 +111,8 @@ jobs: - { target: ubuntu-latest, config: openssl-3.4 } # stable branch - { target: ubuntu-latest, config: openssl-3.5 } # stable branch - { target: ubuntu-latest, config: openssl-3.6 } # stable branch + - { target: ubuntu-latest, config: openssl-4.0 } # stable branch + - { target: ubuntu-latest, config: dropbear-versions } - { target: ubuntu-latest, config: putty-versions } - { target: ubuntu-latest, config: zlib-develop } - { target: ubuntu-latest, config: tcmalloc } @@ -118,6 +124,7 @@ jobs: runs-on: ${{ matrix.target }} env: EPHEMERAL_VM: yes + CYGWIN: "winsymlinks:native" steps: - name: check RUN_ONLY_TARGET_CONFIG if: vars.RUN_ONLY_TARGET_CONFIG != '' @@ -128,12 +135,12 @@ jobs: - name: install cygwin id: cygwin_install if: ${{ startsWith(matrix.target, 'windows') }} - uses: cygwin/cygwin-install-action@master - env: - CYGWIN: "winsymlinks:native" - - uses: actions/checkout@main + uses: cygwin/cygwin-install-action@a3d72946b163026bbd0fa9a88379ccbda4bd86bb # master + - name: checkout openssh git repo + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: setup CI system - run: sh ./.github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} + run: | + sh -c "timeout 1200 .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} || .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }}" env: CYGWIN_SETUP: ${{ steps.cygwin_install.outputs.setup }} - name: autoreconf @@ -141,34 +148,35 @@ jobs: - name: configure run: sh ./.github/configure.sh ${{ matrix.config }} - name: save config - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-config path: config.h - name: make clean run: make clean - name: make - run: make + run: make -j2 - name: make tests run: sh ./.github/run_test.sh ${{ matrix.config }} env: TEST_SSH_UNSAFE_PERMISSIONS: 1 TEST_SSH_HOSTBASED_AUTH: yes + TEST_SSH_TRACE: ${{ vars.TEST_SSH_TRACE }} LTESTS: ${{ vars.LTESTS }} - name: test OpenSSL3 ABI compatibility if: ${{ startsWith(matrix.config, 'openssl-3') }} run: | sh .github/install_libcrypto.sh -a ${{ matrix.config }} /opt/openssl sh .github/run_test.sh ${{ matrix.config }} - - name: show logs - if: failure() - run: for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done - name: chown logs if: failure() - run: test -x "$(which sudo 2>&1)" && sudo chown -R "${LOGNAME}" regress + run: sh -c 'SUDO="$(which sudo 2>/dev/null)"; $SUDO chown -R "${LOGNAME}" regress' + - name: show logs + if: failure() + run: sh -c "for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done" - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-logs path: | diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index ab8b1c6e0971..286b39c12cb0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -12,20 +12,20 @@ jobs: steps: - name: Build Fuzzers id: build - uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@b1836d5aed2e5aaae7f618ddd40bbcc477119825 # master with: oss-fuzz-project-name: 'openssh' dry-run: false language: c++ - name: Run Fuzzers - uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@b1836d5aed2e5aaae7f618ddd40bbcc477119825 # master with: oss-fuzz-project-name: 'openssh' fuzz-seconds: 600 dry-run: false language: c++ - name: Upload Crash - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main if: failure() && steps.build.outcome == 'success' with: name: artifacts diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index aa01c8b296a9..d9f38472c405 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -88,7 +88,7 @@ jobs: - { target: nbsd10, config: pam, host: libvirt } - { target: omnios, config: pam, host: libvirt } # ARM64 VMs - - { target: obsd-arm64, config: default, host: libvirt-arm64 } + - { target: obsdsnap-arm64, config: default, host: libvirt-arm64 } # VMs with persistent disks that have their own runner. - { target: win10, config: default, host: persist-win10 } - { target: win10, config: cygwin-release, host: persist-win10 } @@ -105,7 +105,7 @@ jobs: - name: shutdown VM if running if: env.VM == 'true' run: vmshutdown - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: autoreconf - name: startup VM @@ -119,7 +119,7 @@ jobs: - name: configure run: vmrun ./.github/configure.sh ${{ matrix.config }} # - name: save config -# uses: actions/upload-artifact@main +# uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main # with: # name: ${{ matrix.target }}-${{ matrix.config }}-config # path: config.h @@ -135,7 +135,7 @@ jobs: run: vmrun 'for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done' - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-logs path: | @@ -184,7 +184,7 @@ jobs: - name: bigendian interop - save logs if: failure() && env.BIGENDIAN == 'true' - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-interop-logs path: | diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index a190a490ecbb..8a105ce6844f 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -36,7 +36,7 @@ jobs: - name: shutdown VM if running run: vmshutdown working-directory: ${{ runner.temp }} - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: startup VM run: vmstartup working-directory: ${{ runner.temp }} @@ -45,16 +45,24 @@ jobs: working-directory: ${{ runner.temp }} - name: update source run: vmrun "cd /usr/src && if [ -d .git ]; then git pull && git log -n1; else cvs -q up -dPA usr.bin/ssh regress/usr.bin/ssh usr.bin/nc; fi" + - name: set build options in /etc/mk.conf + run: | + case ${{ matrix.config }} in \ + without-openssl) o='OPENSSL=no' ;; \ + kerberos5) o='KERBEROS5=yes' ;; \ + ubsan) o='DEBUG=-fsanitize-minimal-runtime -fsanitize=undefined';; \ + esac + vmrun "echo $o | sudo tee -a /etc/mk.conf" - name: update netcat run: vmrun "cd /usr/src/usr.bin/nc && make clean all && sudo make install" - name: make clean - run: vmrun "cd /usr/src/usr.bin/ssh && make obj && make clean && cd /usr/src/regress/usr.bin/ssh && make obj && make clean && sudo chmod -R g-w /usr/src /usr/obj" + run: vmrun "make -C /usr/src/usr.bin/ssh obj clean && make -C /usr/src/regress/usr.bin/ssh obj clean && sudo chmod -R g-w /usr/src /usr/obj" - name: make - run: vmrun "cd /usr/src/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; kerberos5) make KERBEROS5=yes;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac" + run: vmrun " make -C /usr/src/usr.bin/ssh" - name: make install - run: vmrun "cd /usr/src/usr.bin/ssh && sudo make install && sudo /etc/rc.d/sshd -f restart" + run: vmrun "sudo make -C /usr/src/usr.bin/ssh install && sudo /etc/rc.d/sshd -f restart" - name: make tests` - run: vmrun "cd /usr/src/regress/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac" + run: vmrun "cd /usr/src/regress/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; *) make;; esac" env: SUDO: sudo timeout-minutes: 300 @@ -63,7 +71,7 @@ jobs: run: vmrun 'for i in /usr/src/regress/usr.bin/ssh/obj/*.log; do echo ====; echo logfile $i; echo =====; cat $i; done' - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-logs path: | diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index dbfd6c186c33..0235285714c6 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -2,11 +2,7 @@ # Security -> Actions -> Variables) to restrict the tests that are run # The supported variables are: # -# RUN_ONLY_TARGET_CONFIG: Run only the single matching target and config, -# separated by spaces, eg "ubuntu-latest default". All other tests will -# fail immediately. -# -# LTESTS: Override the set of tests run. +# RUN_ONLY_PLATFORM: run only tests on specified platform. name: CI VM on: @@ -18,7 +14,7 @@ on: jobs: dragonflybsd: name: "dragonflybsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'dragonflybsd') strategy: fail-fast: false matrix: @@ -27,17 +23,17 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start DragonFlyBSD ${{ matrix.target }} VM - uses: vmactions/dragonflybsd-vm@v1 + uses: vmactions/dragonflybsd-vm@4ba8127bd95c94b66fc4b885e37c99955ba308ea # v1 with: release: ${{ matrix.target }} usesh: true prepare: | - pkg install -y sudo + timeout 600 pkg install -y sudo || pkg install -y sudo pw useradd builder -m echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/local/etc/sudoers mkdir -p /var/empty /usr/local/etc @@ -70,37 +66,50 @@ jobs: - name: "PAM: make" shell: dragonflybsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make tests" + - name: "PAM: make t-exec" shell: dragonflybsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests + sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec freebsd: name: "freebsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'freebsd') strategy: fail-fast: false matrix: target: + - "12.4" - "13.5" - - "14.3" - # - "15.0" # "pkg" breaks with a libutil.so error... + - "14.4" + - "15.0" config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start FreeBSD ${{ matrix.target }} VM - uses: vmactions/freebsd-vm@v1 + uses: vmactions/freebsd-vm@b84ab5559b5a1bb4b8ee2737d2506a16e1737636 # v1 with: release: ${{ matrix.target }} usesh: true prepare: | - pkg install -y sudo - pw useradd builder -m + case $(uname -r) in + 12.*) + timeout 600 ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz || \ + ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz + tar xfz sudo-1.8.32.tar.gz + (cd sudo-1.8.32 && ./configure --sysconfdir=/usr/local/etc && make && make install) + ;; + *) + timeout 600 pkg install -y sudo || pkg install -y sudo + ;; + esac + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + pw useradd builder -m -h0 <$GITHUB_WORKSPACE/regress/password + chown builder $GITHUB_WORKSPACE/regress/password echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/local/etc/sudoers mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -121,7 +130,7 @@ jobs: shell: freebsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make tests + sudo -u builder env SUDO=sudo make tests SKIP_LTESTS=scp3 - name: "PAM: configure" shell: freebsd {0} @@ -132,16 +141,22 @@ jobs: - name: "PAM: make" shell: freebsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make tests" + - name: "PAM: make t-exec UsePAM=no" + shell: freebsd {0} + run: | + cd $GITHUB_WORKSPACE + sudo -u builder env SUDO=sudo make t-exec SKIP_LTESTS=scp3 + - name: "PAM: make t-exec UsePAM=yes" shell: freebsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests + cp regress/password regress/kbdintpw + sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec SKIP_LTESTS=scp3 netbsd: name: "netbsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'netbsd') strategy: fail-fast: false matrix: @@ -153,18 +168,25 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start NetBSD ${{ matrix.target }} VM - uses: vmactions/netbsd-vm@v1 + uses: vmactions/netbsd-vm@99816dccf75edf233ed6cd00a159e3a5b85ea373 # v1 with: release: ${{ matrix.target }} usesh: true + sync: scp + copyback: false prepare: | - /usr/sbin/pkg_add sudo - /usr/sbin/useradd -m builder + case "$(uname -r)" in + 9.*) export PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/9.0_2026Q1/All" ;; + esac + timeout 600 /usr/sbin/pkg_add sudo || /usr/sbin/pkg_add sudo + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | pwhash) + /usr/sbin/useradd -m -p "${pw}" builder echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/pkg/etc/sudoers mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -196,38 +218,46 @@ jobs: - name: "PAM: make" shell: netbsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make tests" + - name: "PAM: make t-exec UsePAM=no" + shell: netbsd {0} + run: | + cd $GITHUB_WORKSPACE + sudo -u builder env SUDO=sudo make t-exec + - name: "PAM: make t-exec UsePAM=yes" shell: netbsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests + cp regress/password regress/kbdintpw + sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec omnios: name: "omnios-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'omnios') strategy: fail-fast: false matrix: target: - - "r151054" - - "r151046" + - "r151056-build" + - "r151058-build" config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start OmniOS ${{ matrix.target }} VM - uses: vmactions/omnios-vm@v1 + uses: vmactions/omnios-vm@7f2be0b927aad1a78498c8aeeac4c4ce1fabd322 # v1 with: release: ${{ matrix.target }} usesh: true prepare: | set -x - pfexec pkg refresh - pfexec pkg install build-essential + if [ ! -x $(which gcc 2>/dev/null) ]; then + timeout 900 pfexec pkg refresh || pfexec pkg refresh + timeout 900 pfexec pkg install build-essential || pfexec pkg install build-essential + fi useradd -m builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers @@ -256,7 +286,7 @@ jobs: openbsd: name: "openbsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'openbsd') strategy: fail-fast: false matrix: @@ -266,15 +296,16 @@ jobs: - "7.6" - "7.7" - "7.8" + - "7.9" config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start OpenBSD ${{ matrix.target }} VM - uses: vmactions/openbsd-vm@v1 + uses: vmactions/openbsd-vm@18edb32f4e48dae5865d7b8b3a9587bc01218a20 # v1 with: release: ${{ matrix.target }} usesh: true @@ -312,19 +343,20 @@ jobs: # plaform (the latest snapshot) and most recent upstream code (or at least # the most recent code in the github mirror) instead of OpenSSH Portable. name: "openbsd-current-upstream" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'openbsd') strategy: fail-fast: false runs-on: ubuntu-latest steps: - name: start OpenBSD VM - uses: vmactions/openbsd-vm@v1 + uses: vmactions/openbsd-vm@18edb32f4e48dae5865d7b8b3a9587bc01218a20 # v1 with: copyback: false nat: | "20022": "22" usesh: true prepare: | + timeout 600 pkg_add git || pkg_add git useradd -g wobj -m builder echo "permit nopass keepenv root" >/etc/doas.conf echo "permit nopass keepenv builder" >>/etc/doas.conf @@ -332,15 +364,14 @@ jobs: chown root:wheel /etc/doas.conf chmod 644 /etc/doas.conf touch /etc/ssh/ssh_known_hosts - pkg_add git - - name: Fetch sysupgrade version + - name: fetch sysupgrade version run: | ver=$(curl -s https://cdn.openbsd.org/pub/OpenBSD/snapshots/amd64/BUILDINFO) echo "SNAPSHOT_VERSION=${ver}" >> $GITHUB_ENV - name: check for cached sysupgrade id: cache-sysupgrade - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: key: openbsd-sysupgrade ${{ env.SNAPSHOT_VERSION }} path: /tmp/_sysupgrade/ @@ -360,7 +391,7 @@ jobs: rsync -av openbsd:/home/_sysupgrade/ /tmp/_sysupgrade/ - name: save sysupgrade to cache if: steps.cache-sysupgrade.outputs.cache-hit != 'true' - uses: actions/cache/save@v4 + uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: key: openbsd-sysupgrade ${{ env.SNAPSHOT_VERSION }} path: /tmp/_sysupgrade/ @@ -400,7 +431,7 @@ jobs: for i in regress-logs/failed*.log; do echo ===; echo LOGFILE: $i; echo ===; cat $i; echo; done - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: openbsd-current-upstream-logs path: regress-logs/*.log @@ -408,30 +439,41 @@ jobs: solaris: name: "solaris-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'solaris') strategy: fail-fast: false matrix: target: - "11.4-gcc" + - "11.4-clang-19" config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start Solaris ${{ matrix.target }} VM - uses: vmactions/solaris-vm@v1 + uses: vmactions/solaris-vm@d30dd6c228c8661ade859e36ead7660b9a62efcc # v1 with: release: ${{ matrix.target }} usesh: true prepare: | - set -x + echo Setting up user builder. useradd -m builder + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + chown builder $GITHUB_WORKSPACE/regress/password + pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | openssl passwd -6 -stdin) + passwd -p "$pw" builder + echo Setting up sudo. sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers - echo "builder ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers + echo "builder ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/builder + echo 'Testing sudo config for root->builder.' + sudo -u builder id + echo 'Testing sudo config for builder->root.' + sudo -u builder sudo id + echo Creating directories. mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -451,7 +493,7 @@ jobs: shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder make tests + sudo -u builder env SUDO=sudo make tests - name: "PAM: configure" shell: solaris {0} @@ -462,9 +504,14 @@ jobs: - name: "PAM: make" shell: solaris {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make - - name: "PAM: make tests" + - name: "PAM: make t-exec UsePAM=no" shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder make tests - + sudo -u builder env SUDO=sudo make t-exec + - name: "PAM: make t-exec UsePAM=yes" + shell: solaris {0} + run: | + cd $GITHUB_WORKSPACE + cp regress/password regress/kbdintpw + sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec diff --git a/.skipped-commit-ids b/.skipped-commit-ids index f4b7ee22e092..8de9e24033ea 100644 --- a/.skipped-commit-ids +++ b/.skipped-commit-ids @@ -47,6 +47,8 @@ da414a364c25b187fc686da7aacec2c35d29238a ssh-keygen, fixup'ed into 21682417 a05e13a7e2c0b65bb4b47184fef731243431c6ff Makefile.inc 7e8178786157e863f6ff63c5d55200d7b6b04f9e remove old sandbox files 98eefed432ff8253b307002e20d28da14b93e7e3 Makefile.inc +eb4169949bf61188fb7336b11b73833019d10d7b Makefile changes +df5c950444e208b320265fa8a1afd676e2edfa6e Makefile changes Old upstream tree: diff --git a/ChangeLog b/ChangeLog index 65e75a5a529f..8d71745072ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,1872 @@ +commit 449d25b4f8b8d3bb55a865ebcbec17b39b37c208 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jul 6 17:56:53 2026 +1000 + + depend + +commit 0227fe4606ebf86b3f6f9b80af12e171eaa58416 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jul 6 17:56:10 2026 +1000 + + crank version numbers + +commit 0210c7cc942ee54bd6a647d5732df9786c4b08d0 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jul 6 07:54:26 2026 +0000 + + upstream: openssh-10.4 + + OpenBSD-Commit-ID: ce7b0749e5139c70410ee92a13d368d7d34262b5 + +commit 5d04ca6af739b82fd30d84d2783ca802ebfa1192 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jul 6 07:53:30 2026 +0000 + + upstream: Fix multiple RFC 4462 (GSSAPIAuthentication) compliance + + problems + + 1) Remove an early failure return for GSSAPI authentication attempts + made for invalid accounts that yielded different behaviour for + valid vs invalid accounts. + + 2) Fix a situation where some GSSAPI requestes were not correctly + subjected to MaxAuthTries. + + 3) Fix a moderate pre-authentication resource DoS related to #2. + + Add missing logging for error cases. + + Report and fixes from Manfred Kaiser, milCERT AT + + OpenBSD-Commit-ID: ca0acdd64eea435d6f89534538a9eb404a5629d3 + +commit e8bdfb151a356d0171fea4194dd205fbb252be23 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jul 6 07:49:58 2026 +0000 + + upstream: fix ownership and lifetime of several bits of client + + state that need to persist for the life of the connection, especially the + cached hostkey that was being incorrectly freed early on some paths, possibly + allowing its use after free. + + Reported by Zhenpeng (Leo) Lin from depthfirst.com + + OpenBSD-Commit-ID: faaa6ad72e7d69d41fa8b197b606265b7d9bc73f + +commit d43ba60c91cb323ca921049b7d43b1908c318454 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jul 6 07:44:48 2026 +0000 + + upstream: Fix cases in GSSAPI and keyboard-interactive + + authentication where the minimum per-attempt delay was not being enforced. + + Reported by Orange Cyberdefense Vulnerability Team + + OpenBSD-Commit-ID: c40bd35cc2428fcaccad7a141703c28baa6da01e + +commit cf67d46cba77d493152830a108b5f294ee9c5140 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Sun Jul 5 02:46:44 2026 +0000 + + upstream: void functions should not return anything. Patch from Tim + + Rice. + + OpenBSD-Commit-ID: bb5021b2b45d9d3f54a012d569872805d107f59c + +commit 93d6348ae44491b7542d78c0d55da7130e9db017 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Jul 5 00:16:21 2026 +0000 + + upstream: fix inverted test that broke ssh-add with keys on stdin. From + + Laurence Tratt + + OpenBSD-Commit-ID: bcef522cfa587c7cf035660bb347cff36b65bfbd + +commit aab5620a66777afbe9e0939b4961e5751d6e7938 +Author: Damien Miller <djm@mindrot.org> +Date: Fri Jul 3 14:20:02 2026 +1000 + + grammar fix; from Daniel O'Connor + +commit c123ac1c579212c08c17d927cb8e379d45f9fccb +Author: Damien Miller <djm@mindrot.org> +Date: Fri Jul 3 14:16:29 2026 +1000 + + more config option details in README.privsep + +commit 3912be7baa05819c382ce0e5d0ef847c9d80f230 +Author: Damien Miller <djm@mindrot.org> +Date: Fri Jul 3 14:10:16 2026 +1000 + + more README.privsep polish + +commit f80e6545ee9eb60b3fb8b0097fcc12aad47a54b4 +Author: Damien Miller <djm@mindrot.org> +Date: Fri Jul 3 13:33:16 2026 +1000 + + tweak; from dlg@ + +commit 01ed1c648a2c42e85e73cac3b7647f1cddc4abba +Author: Damien Miller <djm@mindrot.org> +Date: Fri Jul 3 12:49:26 2026 +1000 + + tweak previous + +commit 85dcff277e7a5299ec13af12517aefb123b1aa95 +Author: Damien Miller <djm@mindrot.org> +Date: Fri Jul 3 12:31:27 2026 +1000 + + revise README.privsep for multi-binary model + + This rewrites most of the privsep description to more accurately capture + recent changes in how sshd managed privilege across its lifecycle, + including describing the roles of the sshd-session and sshd-auth + helper binaries. + + Also 100% more ASCII art + +commit a5ecfdc21864b29ef9a939b9cfe7a2a8ffcdf439 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Jul 2 10:05:43 2026 +1000 + + Need clang >= 19 for constexpr in hardened_malloc. + +commit c53864fc40045d0413c36a19ca784b1b2f985dd9 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Jun 25 18:43:48 2026 +1000 + + Tabs -> spaces. + +commit 0a75a95d582028c5ce91f524c20365df9f2515f2 +Author: Zoltan Fridrich <zfridric@redhat.com> +Date: Wed Apr 16 15:11:59 2025 +0200 + + Provide better error for non-supported private keys + + Signed-off-by: Zoltan Fridrich <zfridric@redhat.com> + +commit 654e1a3e5b58029b05f1df0308e7e4d4407b37c2 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jul 1 01:14:39 2026 +0000 + + upstream: more missing mldsa44-ed25519, based on GHPR696 from Loganaden + + Velvindron + + OpenBSD-Commit-ID: f32e17df54fa66b0e936f1aeb3963f949e4a9bb8 + +commit 088ca00b8f19a0257b2f869cb828ab75e99ab3a1 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jul 1 01:08:51 2026 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 730e54174b2182c7011cc87a0fdae595cd9bcc2d + +commit 0cdead097bde10712cd0635b5d350c16e07ba52a +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jul 1 01:06:54 2026 +0000 + + upstream: simplify SIGINFO output: remove list of active channels (too + + verbose) and just display destination and connection duration; requested + deraadt@ + + OpenBSD-Commit-ID: cb36192cd53483f8e452ea91bc42be7bbb2fffa3 + +commit 55ffd11b88f073662cdf0c8c48fe0800b8a71fc4 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jul 1 00:52:31 2026 +0000 + + upstream: Tighten up the introduction a little: + + Mention Match as a conditional directive (previously it only + mentioned Host) + + Try to use consistent language in the introduction to refer to + configuration directives (previously it used "parameters" and + "keywords" interchangeably). + + Mention that comments may appear at the end of the line too, and that + whitespace at the beginning/end of lines is not significant. + + OpenBSD-Commit-ID: e08f34413eeced47478c14d5005726f9bdd5d80e + +commit 8b05bbeb293c5f777915e37e9ed43a06fb8e7614 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Wed Jul 1 00:52:23 2026 +0000 + + upstream: Move negative-FD checks to before first use. CID 909998, + + ok djm@ + + OpenBSD-Commit-ID: f0208911d27fd5bd66cd608c7b6fb5a36002d6a5 + +commit 296393226e4849010516150f3e19dbfc68789503 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jul 1 00:04:46 2026 +0000 + + upstream: ssh -o doesn't support Host or Include options, they are only + + valid in the config file. bz3968 from xspielinbox + + OpenBSD-Commit-ID: cbecf11f2eea63e3cf6752e9bbe59091ba60cd32 + +commit fe85df40aed36a49b9883186a123a1435c17f895 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Jun 30 23:55:32 2026 +0000 + + upstream: mention mldsa44-ed25519 in usage(); based on GHPR695 from + + Loganaden Velvindron + + OpenBSD-Commit-ID: 4af2400312b6ca232a68a758160ca5c64ca6a168 + +commit aabe6d25498d9dc69fa21fbb14352fd4b3d5e9fa +Author: tb@openbsd.org <tb@openbsd.org> +Date: Tue Jun 30 03:42:53 2026 +0000 + + upstream: ssherr-libcrypto: avoid use of deprecated + + ERR_load_crypto_strings() + + Follow regress and use unchecked OPENSSL_init_crypto() because + ERR_load_crypto_strings() has been deprecated in OpenSSL 1.1.0. + This call can in principle fail, in which case there's a fallback + to generic error strings. + + There is still use of OpenSSL 3.x-deprecated API in here. That's + a problem for someone else to solve. + + ok djm + + OpenBSD-Commit-ID: 3e9dc94caa83b361775b83a92425e858f8680c05 + +commit dcba967d3f39f89d17634e550e1741b2b91f4c5c +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Jun 30 02:30:19 2026 +0000 + + upstream: another ruser_name/ruser_group vs attrib_to_stat() ordering + + screwup. Coverity CID 910530 via dtucker@ + + OpenBSD-Commit-ID: d8c4656119f09304e79fcf2ab32299ed68006a29 + +commit 710cd5abcea22aeddbd5d5d661c224eaa05e47b9 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Jun 30 00:10:48 2026 +0000 + + upstream: set FD_CLOEXEC on the fds between sftp and its ssh + + process, avoids risk of subcommands that write on odd fds breaking the + connection. GHPR693 from Manuel Einfalt; feedback deraadt@ ok dtucker@ + + OpenBSD-Commit-ID: 91b12cd66580dab6b3bfe5e507a1a8310c8f9149 + +commit fa447bd5836f6d1c742c543207a3a6ec2909da75 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Jun 30 00:09:01 2026 +0000 + + upstream: check key and IV length received in privsep state + + transfer exactly match the expected sizes for the selected cipher; partially + redundant to similar checks in cipher_init(), but nice to be more exact. + + GHPR from jmestwa-coder; ok dtucker@ + + OpenBSD-Commit-ID: d4a9deef194cc44189e835ac59b7b800b9b5c281 + +commit 23a7c4d1284694f9973ebdae7884cd25d33e5cf8 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 23:00:00 2026 +0000 + + upstream: revert bits that weren't ready for commit yet + + OpenBSD-Commit-ID: ee8a219f02db32778444356ad2d93b983a38a704 + +commit b9d2162e4a919168bbd983fa68663f813b534034 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 22:56:44 2026 +0000 + + upstream: Move user/group name lookup to correct place; coverity + + CID 910530 via dtucker@ + + OpenBSD-Commit-ID: 03ba9f8c720eea38436e4fef4c40814eae1b1fe3 + +commit 0875a78bb7228986c2e89ef2f5fe041d2ab27ed7 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 09:14:25 2026 +0000 + + upstream: fix ineffective max file size check when loading + + blobs/keys from files and add another one on a patch that was not covered by + the existing ones. From Tess Gauthier via bz3969 and bz3970 + + OpenBSD-Commit-ID: c0dec6c587853349113df85b6dc528dc15079af0 + +commit 5d8e42933ab3f1a1c17608c32d680300f5524a99 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 08:59:31 2026 +0000 + + upstream: check strdup() return to avoid NULL deref on failure. + + bz3948 from RuiHe-MO + + OpenBSD-Commit-ID: 2b1fbfb2e1f3359150feadfdf05acaa1c7d211e8 + +commit 0eaeddeefa4bd9b1241788b27ed2967ab596c759 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 08:57:06 2026 +0000 + + upstream: s/calloc/xcalloc/ to reduce noise from AI bug detectors + + that don't understand context + + OpenBSD-Commit-ID: dcef5b1804620f2aed108267bbf5023a81230e14 + +commit a9cb2e30d3a50ba6a24047d87cd80e4b4a18b5ff +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 08:48:22 2026 +0000 + + upstream: fix "ls -n", which was still displaying user/group names + + rather than numeric uids/gids. Based on patch from Tamilan in bz3953 + + OpenBSD-Commit-ID: 65dd2ecb870b727e872cf9df544f8767426d2cc0 + +commit 3c3226f79cf4fa1c0436a91768760b92df87ffab +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 08:21:50 2026 +0000 + + upstream: move documentation of the Include directive to near the + + start of the options list, alongside that for Match and Host which are + similar insofar as they all affect configuration parsing rather than altering + the configuration directly. from xspielinbox via bz3968 + + OpenBSD-Commit-ID: 1cde8af8d40dbbe3ea49cf56c5d408946c875230 + +commit ce697f1eaf76a3d8d700894726c7a826af393ed5 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 08:19:21 2026 +0000 + + upstream: mention RefuseConnection, VersionAddendum and + + WarnWeakCrypto along with other options. from xspielinbox via bz3968 + + OpenBSD-Commit-ID: 5d4ef72dc703a74e64175e4611961ea338379d66 + +commit 849748c6e5d79274020489b03d068361d98ff42f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 08:16:46 2026 +0000 + + upstream: correct directive name (s/Host/Match) in error message + + from xspielinbox via bz3968 + + OpenBSD-Commit-ID: 3aec5cc9d349bcef12abc951490474f1217b4aeb + +commit c8716138281d3dac33c2c7e98615c52d2b606d85 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 07:56:19 2026 +0000 + + upstream: report errors in fill_default_options() properly, based on + + GHPR649 by Zoltán Fridrich + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + OpenBSD-Commit-ID: 10137e31df74c3100e3abc7d008b1645ca5b45af + +commit d9df26d7e93f76bc5b1c0cbd31cde0af00ccbbc0 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 07:46:22 2026 +0000 + + upstream: don't use deprecated ERR_load_crypto_strings() + + GHPR650 from Mike Frysinger + + OpenBSD-Regress-ID: bfe86d9be1db4569c091f3d763cba04ddbb86ec0 + +commit 365522938f7a44df993c38f8a51836bab3628211 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 29 17:21:01 2026 +1000 + + don't leak rrset on fail; GHPR681 from metsw24-max + + ok dtucker + +commit fceb78d14abc710f2bab31f28d321a9bb2476781 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 29 17:18:58 2026 +1000 + + check sockaddr length; GHPR681 from metsw24-max + + ok dtucker + +commit 9d5238f44dda8d9455c085f51f2fb00774f69d38 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 29 17:17:28 2026 +1000 + + return result of raise(2); GHPR681 from metsw24-max + + ok dtucker + +commit fa5416dec1232dc67d979d28942344cdc8086ae6 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 29 17:16:55 2026 +1000 + + use size_t for lengths; GHPR681 from metsw24-max + + ok dtucker + +commit ef6bef31de60b077cb7da954b202d65156fd510e +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 29 17:15:10 2026 +1000 + + fix leak of error path; GHPR681 from metsw24-max + + ok dtucker + +commit 84365594f44423b69392f295f82e9cbcdd8c2640 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 07:36:37 2026 +0000 + + upstream: don't print an error message when trying to load a host + + private key when PKCS#11 keys are in use, as these don't need the private + half on the filesystem. GHPR664 from Ingo Franzki + + OpenBSD-Commit-ID: c93352e218cb1b74af04e8dc3a42eddec1f312c0 + +commit d6a589d3c8530375c2d56bcfb914575a7fcd3715 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 02:13:05 2026 +0000 + + upstream: make ssh-add open it's connection to the agent after it + + has finished getopt() processing and not before. This allows the -v flag to + work properly. + + ok jca@ + + OpenBSD-Commit-ID: b9ac820018875aeb5b43ae2119a70c16a5cd2aef + +commit 1cfbed8a131de166d86fbf5ac3245d55046cfab3 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 02:08:55 2026 +0000 + + upstream: Fix bounds checking when signing messages of length + + greater than will fit in a size_t. In OpenSSH, messages sizes are bounded by + SSHBUF_SIZE_MAX so this was unreachable. From Swival scanner. + + OpenBSD-Commit-ID: 31ab874abe21a528fa995d78023c5ad9444a31e1 + +commit c58b363e4f7c10134b583fc92556229bf6c2c16b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 01:58:29 2026 +0000 + + upstream: fix ECDSA order check for curves with cofactor != 1. All + + supported EC curves have cofactor 1, so this is a nop. From Swival scanner + + OpenBSD-Commit-ID: 4ae44cc97714fcb6d19fa56714ede56c1ef521e1 + +commit c1cebbc7c69acfe5df07b4a95e4c32cebc3e105a +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 01:53:21 2026 +0000 + + upstream: avoid situation where sftp_download() could get stuck in + + a loop if a broken server repeatedly returned zero length while reading a + file. Identified by Swival scanner + + OpenBSD-Commit-ID: 53f1de5065ff01952d2abb51747c2418ce21cd96 + +commit 1b39f39657d2e58f8ec57341581a39bbf0be645b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 29 01:47:21 2026 +0000 + + upstream: avoid download to server-controlled path when performing + + download on the commandline. From Swival scanner + + OpenBSD-Commit-ID: d1b2c44305fdfe6d51eed9ecc727e59478bf311f + +commit 36480181fa22f98e180b4f9e10203480c0346c78 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Jun 28 23:47:16 2026 +0000 + + upstream: resist that return ".." via remote glob during + + remote/remote copies, similar to fixes for bz3871 for remote/local copies. + From Swival scanner + + OpenBSD-Commit-ID: c0c20a1b746db55c08e53658bf21ea9405b300a5 + +commit 8dec7df34b38ea510b5548a020f2664e59700d23 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Jun 28 23:31:28 2026 +0000 + + upstream: avoid possible NULL deref; from Swival scanner + + OpenBSD-Commit-ID: 62ea8e12b7cddee933596e72f8ab0f7364147c0f + +commit 09c2eeb9c8a0f42716d67548c75a6f4870732caa +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Jun 26 06:17:13 2026 +0000 + + upstream: mention that ssh-keyscan output is only as trustworthy as + + the network between it and the SSH server; ok markus@ + + OpenBSD-Commit-ID: 067845df7e8eb776408de5f23a2e6e7019945834 + +commit 6f74eb3c56f8dc4886d2bc5b068c5bf82cb6db74 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Jun 25 08:14:47 2026 +1000 + + Dropbear master -> main here too. + +commit b0894a23a6bcb4f008d119854cb520f0b44b0973 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Wed Jun 24 22:05:05 2026 +1000 + + Dropbear's master is now main. + +commit aa60cf3f41e89530448a720e08ec31a6d8ffd79e +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Wed Jun 24 11:59:09 2026 +0000 + + upstream: Avoid printf("%s", NULL) since it's not guaranteed to be safe + + and will segfault on some -portable platforms. + + OpenBSD-Commit-ID: b49d588f8becf6363305aac42d7d9660fc7fe3ba + +commit 7c70c3d352f7e8f16ed799f03957ee87840da4e6 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Wed Jun 24 19:22:36 2026 +1000 + + Fix handling of rh-allow-sha1-signatures on Cygwin + + The format of openssl.cnf has changed, so append to it instead of trying + to insert into it. Test that openssl can sign RSA with SHA1 before + proceeding. + +commit a4c5d09657860cb8583e4cb176b2396fc8bdb523 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Wed Jun 24 19:05:12 2026 +1000 + + Make -j2 for faster builds. + +commit 110117accb95fc310a3923115e9316a9748ff6ae +Author: Darren Tucker <dtucker@dtucker.net> +Date: Wed Jun 24 19:04:48 2026 +1000 + + Set CYGWIN at top-level. + + The ensures the symlinks created in any step (eg, logs) are native + symlinks and can be understood by the log upload step. + +commit 8058c5bdb507591b79ec926221fbe6fcc296d432 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jun 24 06:55:12 2026 +0000 + + upstream: mention a caveat regarding GSSAPIStrictAcceptorCheck in + + some environments + + OpenBSD-Commit-ID: aa7158d8f22cb34063c1c2d3cbcf30a9489847c2 + +commit 87e21b16d033700819a1381b9a2bfa2f8b3a217d +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jun 24 06:53:57 2026 +0000 + + upstream: add some logging to make debugging interactive/bulk + + classification mistakes easier next time (though I think we've got them all + now, really) + + OpenBSD-Commit-ID: 5fe3dd4e76ffba787a423e301095d55cf5b0f0dc + +commit 162cb8721ca0fdb71aaf00688ac7d59a81fc8d5f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jun 24 06:53:11 2026 +0000 + + upstream: add a missing channels type for bulk/interactive + + classification bz3972; ok dtucker@ + + OpenBSD-Commit-ID: 9c9442ea14be74877e2c876b1fe9fa20d158dd97 + +commit 5dac5a9252074fb39da617ffc123830266614a4c +Author: Darren Tucker <dtucker@dtucker.net> +Date: Wed Jun 24 12:19:53 2026 +1000 + + Set build options in /etc/mk.conf once at startup. + +commit 512bfedf61129788d680210081e89843858dde85 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Mon Jun 22 12:28:48 2026 +0000 + + upstream: Check return values from malloc. + + OpenBSD-Regress-ID: 28c8ab94a4fa5d047cec9c865b10bbf3c9ccf6d1 + +commit e683097d90e4698893c86a6f61c8c994b68cbcc6 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Mon Jun 22 12:08:33 2026 +0000 + + upstream: Check return value of sscanf. + + OpenBSD-Regress-ID: e06a8c769541b1aa7d663cc8859ddabd93847e81 + +commit b88165a06c8e195f267909de002450245e60002e +Author: tb@openbsd.org <tb@openbsd.org> +Date: Sun Jun 21 19:23:56 2026 +0000 + + upstream: annotate tm_wday = -1 with /* sentinel for error */ per + + timegm(3) manpage + + suggested by deraadt + + OpenBSD-Commit-ID: 2fa92f0b826f0ab9e5d1cb0b2243b8e2f80951b2 + +commit 0d08d384a6783d3f3bc5a01d10015f527e0792ba +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Jun 19 05:26:04 2026 +0000 + + upstream: remove cipher_set_keyiv() as nothing uses it from + + Loganaden Velvindron + + OpenBSD-Commit-ID: 2a6636388028e6f7aa6837d6484a369f3d9c0818 + +commit 10715f25c40f5f7c670c341fadc52fbe1935db08 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Jun 22 21:28:58 2026 +1000 + + Output Actions allowlist for uploading to Github. + +commit 01404fa5da11ed08c6ebecd09aaa3ebfbd79f206 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Jun 22 19:00:15 2026 +1000 + + Add script to lookup and pin Actions to hashes. + + Update recently changed Cygwin Actions and pin remaining unpinned ones. + +commit faa646a9bf6c8d0ec2d8a52dcd155979c8f7eb8e +Author: El Mehdi Abenhazou <mehdiananas007@gmail.com> +Date: Wed Jun 3 02:02:31 2026 +0100 + + ci: pin upstream.yml actions to full commit SHAs + + Signed-off-by: El Mehdi Abenhazou <mehdiananas007@gmail.com> + +commit 983096a7b27eaf789b5ceb321867d4511ba779c3 +Author: El Mehdi Abenhazou <mehdiananas007@gmail.com> +Date: Wed Jun 3 02:02:30 2026 +0100 + + ci: pin GitHub Actions to full commit SHAs + + Pinning actions/checkout, actions/upload-artifact, and + cygwin/cygwin-install-action to their full commit SHA instead of + mutable branch/tag references (main, master). + + Using mutable refs means a compromised or malicious update to the + action repository could silently alter the workflow behavior. + Pinning to SHA makes the exact version immutable and auditable. + + Signed-off-by: El Mehdi Abenhazou <mehdiananas007@gmail.com> + +commit 0d156d385e1e9c31bd5fb3652cf620a1f51c9b19 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Jun 16 22:27:10 2026 +0000 + + upstream: Factor out hex2bin into a shared helper function. + + Replace sscanf %hhx (which is C99) with plain %x for better compatibility + in -portable. ok djm@ + + OpenBSD-Regress-ID: 4d30bb27ffdf2154f1a9f2317df18d256717b300 + +commit b9d134a0b16a1810e9bbfac5bc687f5dbc75e7fa +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Jun 16 10:58:42 2026 +0000 + + upstream: Use awk instead of cut to help -portable. + + Some platforms have size limits on cut. + + OpenBSD-Regress-ID: fe871e8ed43fd92efb0df76f61c5cc9c5429ea82 + +commit 60978ddb08701d409c8236765caab10d1acded1b +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Jun 16 09:00:47 2026 +0000 + + upstream: Include stdarg.h for va_list (needed for xmalloc.h). + + OpenBSD-Regress-ID: 34a6d5db48eec77f92f868093dfa0bfc10ae4622 + +commit 3de49e0d281ac7efb766f06eb2942ae147f64bbb +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Jun 16 08:15:35 2026 +0000 + + upstream: Include stdlib.h for malloc/free and sort headers. + + OpenBSD-Regress-ID: 4f5f427b131f5d6b32ed107b9bef098153f768ce + +commit 61ca39c119108e95f94e3d914aa6fd79d99e288d +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Jun 16 18:16:32 2026 +1000 + + Remove check for OpenSSL w/out AES192/256. + + This was the case for some old Solaris versions, but the support for it + has long been removed from our compat layer so there's no point checking + for it. + +commit f433c09931665b1139dc9ef0951d3540242e4a38 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 15 06:36:52 2026 +0000 + + upstream: use different strategy to check whether keys are present or + + absent in the agent; helps some -portable tests on platforms that have stupid + grep(1) + + OpenBSD-Regress-ID: 0cee7ecc437eee7471dc6ccc3b3a0c2b60c1ad2d + +commit 860ed04158f2c6dc870ea7c98c23dcafc7772dd4 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 15 06:24:20 2026 +0000 + + upstream: avoid use of paste(1); helps portable + + OpenBSD-Regress-ID: ce3ad41b34af9fc16af83e4711a62231ee52a95c + +commit f5f02aafe89971d838d7fbc6b0cf240cee4d48bc +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 15 12:53:53 2026 +1000 + + another place mldsa-ed25519 keys need deactivation + +commit 1d6064d25fed17b184ead85ef6fddec1a2132c53 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 15 01:55:44 2026 +0000 + + upstream: fix multiple problems with testing hostkey types that are not + + enabled by default. + + 1) Add all hostkey types in the "multiple hostkeys" subtest. + Previously known_hosts was accidentally clobbered, causing + only the last added hostkey type to be used. + 2) Explicitly enable the hostkey types under test via + HostKeyAlgorithms + + OpenBSD-Regress-ID: 8f12d18b79b5cc8a748e187a0e95529cd85a9dcc + +commit ebdaacf4907033af1cbf1fef593436081dcd67a7 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Jun 15 11:43:52 2026 +1000 + + bring back mlkem768x25519-sha256 stubs + + should fix C89 compile + +commit b35a6a153f4164a56174e4795d4384867349e9aa +Author: Damien Miller <djm@mindrot.org> +Date: Sun Jun 14 20:32:12 2026 +1000 + + don't build ML-KEM/ML-DSA code with <C99 compilers + +commit 1c46384db91a724a214ce96297d64c7ea9274a4c +Author: Damien Miller <djm@mindrot.org> +Date: Sun Jun 14 20:24:25 2026 +1000 + + include includes.h + +commit ea505c83ecae67c66c020f03b964cf471055191e +Author: Damien Miller <djm@mindrot.org> +Date: Sun Jun 14 18:56:31 2026 +1000 + + provide a htobe32() replacement + +commit 8e0cb471774e39a308e41cf5890823dfb418fd5b +Author: Damien Miller <djm@mindrot.org> +Date: Sun Jun 14 15:02:24 2026 +1000 + + hook up new regress/unittests/crypto + +commit 5a474d1bf338a895ce5973883c2f79d766f7dd42 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Jun 14 04:08:05 2026 +0000 + + upstream: unit and regression tests for composite PQ ML-DSA44/Ed25519 + + keys. + + Includes a new unittests/crypto test that tests basic functionality + of the underlying crypto primitives against public test vectors + + OpenBSD-Regress-ID: 4463b2e8adec391efa24a953f3c911b72892ca80 + +commit db1bad146ff3e9aa8e2e8eac926b185870417b2f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Jun 14 04:16:19 2026 +0000 + + upstream: make crypto_sign_ed25519_keypair_from_seed non-static. + + The new ML-DSA/ed25519 code needs it + + OpenBSD-Commit-ID: 48d00a2094bca8e422494aaa76105c708837436e + +commit 81ca1451bf94edd9533c4f6787130f2396219049 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Jun 14 03:59:34 2026 +0000 + + upstream: Add experimental support for a composite post-quantum + + signature scheme that combines ML-DSA 44 and Ed25519 using the construction + specified in draft-ietf-lamps-pq-composite-sigs. There's also an early draft + documenting use of the integration of this scheme into SSH as + draft-miller-sshm-mldsa44-ed25519-composite-sigs + + This scheme is not enabled by default. To you use, you'll need + to add it to HostKeyAlgorithms, PubkeyAcceptedAlgorithms, etc. + Keys may be generated using "ssh-keygen -t mldsa44-ed25519". + + The ML-DSA implementation comes from libcrux. Thanks to + Jonas Schneider-Bensch and Jonathan Protzenko for their work to + make this available. + + Consensus is that it's time to get this in to allow people to + experiment with it. + + feedback markus@ tb@ logan@ deraadt@ + + OpenBSD-Commit-ID: 85f2d41e3d3374b4e8c28a45a7c92f153c4489e2 + +commit b7e552138b8861469295e33e1457040e3f747d06 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sat Jun 13 00:37:13 2026 +0000 + + upstream: when replying to a "query" SSH_AGENTC_EXTENSION request, + + don't append an SSH_AGENT_SUCCESS to the reply to the query. bz3967 ok + dtucker@ + + OpenBSD-Commit-ID: b51418708096e26dbf73a0c1d3cb49b7352bc899 + +commit 5af8f3f290bd892352eb007866c066b7bf4a4385 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Sun Jun 7 08:50:17 2026 +0000 + + upstream: Make crypto_sign_ed25519_keypair_from_seed() + + static to prevent compiler warnings since it's only used within ed25519.c. + + OpenBSD-Commit-ID: cf8b1e8f364167eb1766f646cc18a40f32242991 + +commit 5ebfdf3afaede40b1f0f9b5874ba53bf9d21d6d5 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Sun Jun 7 08:21:07 2026 +0000 + + upstream: Import updated moduli + + OpenBSD-Commit-ID: c3081ccc6e4c1cb21e68c36f5a92e6d9f09e70b3 + +commit 47af21eb8d480c0f368a629ab58e31b993ed28f2 +Author: Damien Miller <djm@mindrot.org> +Date: Sun Jun 7 09:56:41 2026 +1000 + + sync fmt_scaled.c with OpenBSD upstream + + Notably picks up this commit: + + revision 1.24 + date: 2026/06/06 23:49:25; author: djm; state: Exp; lines: +28 -12; commitid: oznzDs0MaUT3FEqO; + rearrange scan_scaled(3) ordering of multiplications and divisions + to better preserve accuracy for large exponents. From metsw24-max + via https://github.com/openssh/openssh-portable/pull/671/ + + ok tb@ + +commit e9916c44c1324ab9ab022719e4df08a390a83014 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Jun 5 08:53:07 2026 +0000 + + upstream: pass >9 commandline arguments to the internal-sftp server, + + previously they were silently dropped; reported by Steve Caffrey ok deraadt@ + + OpenBSD-Commit-ID: ee6cd5430a3ca027c3223af54b58ad3cc7ccd624 + +commit 70d7044a966a541d9df6002fbeb62d005555cc78 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Jun 5 08:48:43 2026 +0000 + + upstream: avoid truncation of pathnames headed to lstat() for + + systems where PATH_MAX is not the actual max; reported by sahvx655-wq via + GHPR688 + + OpenBSD-Commit-ID: fcbeeff99d857f2f3916ad06570fa05fc38b0f07 + +commit 37bf1431aa0f5e746f9ae0247f52da1e8b5758d6 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Jun 5 06:51:02 2026 +0000 + + upstream: rename a variable to be more accurate + + OpenBSD-Commit-ID: bf277f2832125eb40ac2c9fa3ea66e31214f2131 + +commit 7763a38bc2595be50baf1d72b19bf4720e41e8e3 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Jun 4 04:26:51 2026 +0000 + + upstream: add signature malleability and pubkey validity checks to + + ed25519 verification (SSH doesn't depend on these properties) Pointed out by + Soatok Dreamseeker + + Add an explicit-seed variant of the keygen function. + + feedback / "looks fine" tb@ + + OpenBSD-Commit-ID: 2a71926bfda24628cf34a88357f44a790e338d5d + +commit 65c6ac0a82f8bc3faf5a18fef36112fec1b54fc2 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Jun 2 06:18:27 2026 +0000 + + upstream: refer to RFC9987 instead of I-D + + OpenBSD-Commit-ID: 6b273c50c2aa818b9144b8d9ab568c4239023297 + +commit c9ebebb22fa50ca50bd036599028d7e09f841c3f +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Jun 2 21:57:42 2026 +1000 + + Reformat setup_ci command line. + + This prevents setup_ci from running twice on Cygwin due to different + parsing of the command line since on Windows it's run via Powershell. + +commit 60343e46d5f8b79137a14d2ea5c85bf0b7359cc1 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Jun 2 22:20:44 2026 +1000 + + Fix search for awk formatter. + + AC_PATH_PROG only takes a single binary to look for, AC_PATH_PROGS is + what's needed for more than one. Looks like an error by me in 285546b. + +commit 7e5590cf8ff732a946629b6f766c7a2c9b2ac425 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Jun 2 18:49:02 2026 +1000 + + Replace shell-level timeout with dedicated command. + + It turns out the systems we run this workflow on all have timeout(1), + +commit 41bb8c1823a337dca1b027a1e5c560f6a5fc4acc +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Jun 2 18:10:25 2026 +1000 + + Add a single retry to VM package install steps. + + These are potentially flaky due to network issues, so hopefully this + will reduce the number of manual retries needed. + +commit 14d88d4da7fb72d94239049d76c7651723b1a3d9 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Jun 2 17:44:12 2026 +1000 + + Add includes.h for compat functions. + + Fixes build on at least old AIX. + +commit e8c12cc085272894e7c14eb761e82ec7c0d8f599 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Jun 1 20:43:31 2026 +1000 + + setup_ci.sh: add timeout and allow one retry + +commit de97e5a44c88179b834939b84cd555249382de0e +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 1 08:27:28 2026 +0000 + + upstream: differentiate between execution failures and subsystem not + + found when logging why a subsystem failed to start; GHPR#637 from cuiweixie + + OpenBSD-Commit-ID: 42bc40dd6272b7f6726b069a8c4e16025a354056 + +commit 51db029b53488bc972deba13724034f8e35e6e38 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Jun 1 18:26:31 2026 +1000 + + Don't install shim for AWK=awk. + + If configure finds an undadorned awk, don't install the shim to prevent + recursive calls to it. + +commit 2afcdf7b3e429428d9b6415e0c948001bf968477 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Jun 1 17:40:03 2026 +1000 + + Pass awk detected by configure to regress tests. + + Some platforms' basic awk don't have toupper, but other awks like nawk + or gawk do. Pass the one found by configure through to the regress + tests, and make a wrapper for it so we don't need to modify any tests. + +commit 7b776066bc00a12ec3a7f9b04cf8a69a8d260c2c +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Jun 1 17:39:40 2026 +1000 + + Update LibreSSL test 4.3.1->4.3.2. + +commit 684d26a3c4d07e78027517fd6e98875ae5dff71d +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 1 05:49:20 2026 +0000 + + upstream: sk-usbhid: skip unsupported key types in read_rks() + + When enumerating resident keys, encountering a credential with an + unsupported COSE key type (not ES256 or EdDSA) caused the entire + enumeration to abort via goto out, discarding all valid keys. + + Move the key type check before the per-credential allocation so + unsupported types can be skipped with continue instead. This + preserves all valid resident keys on the token. + + Patch from Akhilesh Arora via GHPR657 + + OpenBSD-Commit-ID: b344a44ff97d26faf099b8e0cad72ad1e793ac0f + +commit de24573efc60ca145e4f2d7e45787eccf8bd41a4 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jun 1 05:40:13 2026 +0000 + + upstream: Actually set pollfd.events correctly for socket type + + channels; previously we were throwing away the events we computed if the + channel had a c->sock distinct from it's other read and write fds. + Fortunately, it appears that this case happens rarely, if ever. + + Reported by Darafei Praliaskouski via GHPR660 + + OpenBSD-Commit-ID: d3f483b7919946c5649e8c697d5b927af35aac4b + +commit 58b9381e0b1dbc8e56190b26fb61bae4cfb240be +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 13:12:07 2026 +0000 + + upstream: handle compiled-time unsupported options in servconf.h + + better; leave a zero placeholder variable so we don't have #ifdef around + their absence elsehwere in the tree + + OpenBSD-Commit-ID: 9601de2c67042aacb0ea12ca424e67c092fa7801 + +commit ea91c7a1a9ccb22bacd8fcff824c84e3b8414af5 +Author: Damien Miller <djm@mindrot.org> +Date: Sun May 31 22:03:56 2026 +1000 + + depend + +commit 3bc4ac43943852b214a3d85e3424d9304c8a736d +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 11:39:44 2026 +0000 + + upstream: unit test for new servconf.[ch] code, including a basic + + fuzz test for deserialisation + + OpenBSD-Regress-ID: f182c21485dc37a41a125f067b59bee48adbfe6c + +commit f2b815e42d9fd654cb457cd7e7d1cb751f1a5a33 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 11:31:57 2026 +0000 + + upstream: the new configuration dump code emits configuration + + directives with capitalisation (previously they were all lowercase), so make + the tests that consume them insensitive to case + + OpenBSD-Regress-ID: 9a81d8501b8b8fc1c1a0d268d4cc91cbb19668f5 + +commit 633a4c1a24605e48c46fe76afc0814d20593fc00 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:20:58 2026 +0000 + + upstream: flesh out match_pattern() tests, including a new + + comparison test of the new NFA-based implementation against the original one + for all possible combinations of short inputs and patterns constructed from a + small dictionary of possibilities. + + OpenBSD-Regress-ID: a18e86c95afb6243ac270468f5dd0ab4a78c8074 + +commit bebc855fdb3f8c7f96fd392f67bec2134cc42b1b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 11:30:50 2026 +0000 + + upstream: big refactor of sshd config management code. + + This generates much of the initialisation, defaults and keyword table + code from a set of macros rather than hand coding them. These same + macros are also used to generate serialisation and deserialisation + code. + + The macros are admittedly ugly but have the advantage of forcing a + good degree of consistency across places that need to stay in sync + with each other. + + The new de/serialisation code is used to pass configurations across + the various sshd-* process boundaries. This removes the need to pass + around raw text configurations that need to be re-parsed as well as + eliminating some raw pointer leakage across the processes where + structures were previously clumsily serialised. + + feedback/ok markus@ + + OpenBSD-Commit-ID: 9a5109a480637e08c290eeb82aa8ef2ca7e848ce + +commit a1dd1c80687fbfbdca19d3a314a8176b90ae471b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 06:14:42 2026 +0000 + + upstream: avoid strlen(NULL) crash if an X11 channel was created before + + the x11-req SSH_MSG_CHANNEL_REQUEST was sent. Reported by Ben Perry via + GHPR679 + + OpenBSD-Commit-ID: 31db0da9ab6c73e6bbf4021ffd53dc3ce5c65f23 + +commit df18979e1137f41a3ffa25f9d06c4fc55073cb34 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 05:55:21 2026 +0000 + + upstream: DNS0x20[1] can randomise the case of domain names returned by + + lookup to force some more uniqueness in queries to reduce the likelihood of + spoofing attacks succeeding. + + Normally this should be hidden from the user by the resolver, but + in some cases it can leak through. When it does, it can mess up + ssh's CanonicalizePermittedCNAMEs. + + Fix this by forcing the name we received from the system resolver to + lowercase. + + bz3966, report and fix by Martin D Kealey + + [1] https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 + + OpenBSD-Commit-ID: e0b300d3b3af289e053d928380af71949f95bfb0 + +commit 5a5e47740b6466d58242aca28b9e584bab4ccf1d +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:59:51 2026 +0000 + + upstream: disallow use of the copy-data extension to read and write + + to the same inode simultaneously; reported by Qifan Zhang of Palo Alto + Networks; ok markus@ + + OpenBSD-Commit-ID: 94ceb85146d92dbc1289c55d308498d5f56f274a + +commit 073faa6beceea162eeeb7963c7352a6c851e507a +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:51:45 2026 +0000 + + upstream: Fix two separate one-byte out-of-cound reads + + 1) if a server sent an empty reply to a SSH2_FXP_REALPATH request + 2) if a batch command used the full 2048 byte buffer but ended in a + literal backslash character + + Both reported by Zhenpeng (Leo) Lin from depthfirst + + ok markus@ + + OpenBSD-Commit-ID: d1ccc1f5a6eb109065ce8a552fea8e502381ce59 + +commit 8dfe7ed6e2fd988de08df508355a196b956b2753 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:47:29 2026 +0000 + + upstream: DisableForwarding=yes didn't override PermitTunnel=yes + + Reported independently by Huzaifa Sidhpurwala of Redhat and Marko + Jevtic; ok markus@ + + OpenBSD-Commit-ID: b5c13f0746cf079b21f8deba47407fad49ccbf4c + +commit 72b05ecd141b9683285dcdb439de01903c1a07d3 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:44:38 2026 +0000 + + upstream: make the transport protocol stricter by disconnecting if + + the peer sends non-KEX messages during a key re-exchange. + + Previously an evil peer could continue sending non-KEX messages + without penalty, causing memory to be wasted up until the + connection terminated or the server/client hit a OOM limit. + + reported by Marko Jevtic; ok markus@ + + OpenBSD-Commit-ID: 8937f0f2096156f5c68ae2dce77956373589d757 + +commit 26cde4cfc55eb1d336e1249d702c0c4705b0424b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:37:56 2026 +0000 + + upstream: stricter validation of the transport state passed from + + the unprivileged preauth sshd-auth process to the user-privileged postauth + sshd-session process. + + These are harmless unless an attacker had an exploit for sshd-auth + in which case they could be used for post-auth memory DoS or to + crash you own session in a new and exciting way. + + Reported by bylee3 and Kayky Vinicius + + ok markus + + OpenBSD-Commit-ID: 214e256904a4ae4f83d2083096796c9689c1d7b5 + +commit 10f66b2af950c94af3b25027abec5209d90eb451 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:31:04 2026 +0000 + + upstream: Enforce a maximum size for usernames in agent key use + + constraints + + Along with the match_pattern() performance change that was just + committed this avoids a denial-of-service where an agent client could + waste CPU on an agent by sending user constraints with lots of + wildcards. + + Reported by Huzaifa Sidhpurwala of Redhat + + ok markus + + OpenBSD-Commit-ID: 0483817f1a8accf4dbff42b7073ee4d119105d71 + +commit 1e82d2cfcfd05ec2e4515894a92223f40839c7b8 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:24:39 2026 +0000 + + upstream: fix client use-after-free on error path if cipher_init() + + fails; reported by Qualys Security Advisory Team, ok markus@ + + OpenBSD-Commit-ID: a8731da0c462b2b9d11314ba505c26ee0cdada83 + +commit 9d4c0b31f172782def72ccc2fb2dc217d3135e6f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun May 31 04:19:16 2026 +0000 + + upstream: Replace the old recursive match_pattern() with an + + implementation that uses a NFA for matching. This avoids the exponential + worst- case behaviour for the old implementation. + + ok markus@ + + OpenBSD-Commit-ID: fc6b75a52f4c0acb52b7900658c8d25ff873cbae + +commit 7ab700f1706b154d4bc5cf66e19c05be6d9b1fc1 +Author: Damien Miller <djm@mindrot.org> +Date: Sat May 30 23:24:01 2026 +1000 + + Make failure to set SECCOMP or NO_NEW_PRIVS fatal + + If your Linux system lacks support for these then please don't + enable the seccomp sandbox. + + Prompted by manfred.kaiser@ssh-mitm.at + +commit 4f4aeee6edaa248f1e7ce22ee3f35ce183eabf38 +Author: Manfred Kaiser <manfred.kaiser@ssh-mitm.at> +Date: Sun May 24 09:53:42 2026 +0200 + + sandbox-seccomp-filter: remove duplicate SC_ALLOW(__NR_clock_gettime64) + + The syscall is already permitted at line 297 in its own ifdef guard. + No functional change. + +commit 16908221360a01b1801c6ca70c26b73c83509ea3 +Author: deraadt@openbsd.org <deraadt@openbsd.org> +Date: Wed May 27 13:57:26 2026 +0000 + + upstream: Use the new RELINK feature in bsd.prog.mk to build the + + relink kits. + + OpenBSD-Commit-ID: df5c950444e208b320265fa8a1afd676e2edfa6e + +commit 3bee4a1a260809992a0877d7ef202c4ff3e0be24 +Author: tb@openbsd.org <tb@openbsd.org> +Date: Wed May 27 13:54:15 2026 +0000 + + upstream: ssh: use sentinel idiom for timegm(3) and mktime(3) + + There is nothing wrong with times before the epoch, even -1, so use the + idiom recently added to the CAVEATS section to figure out whether there + was an error in the timegm() or mktime() calls. + + We should sweep the tree for this. If anyone is bored, feel free to beat + me to it... + + ok deraadt djm + + OpenBSD-Commit-ID: e2b1721966dc782e776db5d6cfb18958534f9d4b + +commit 26a8c13e6154a905b4eaf48798b134372747e86f +Author: tb@openbsd.org <tb@openbsd.org> +Date: Wed May 27 03:28:07 2026 +0000 + + upstream: ssh-agent: add -V to usage() + + ok djm + + OpenBSD-Commit-ID: ea9bc250ce34c4c8317896673ca37f3ee17223c7 + +commit 3a05a07e78f7b88ba70fa7f96808bcb86a55cbe8 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed May 27 03:05:21 2026 +0000 + + upstream: use "ssh-agent -V" to test the binary is functional after + + relinking requested deraadt@ + + OpenBSD-Commit-ID: eb4169949bf61188fb7336b11b73833019d10d7b + +commit 7fbe3e440eae0cd2315545ce5abd89e936b3a92f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed May 27 03:04:30 2026 +0000 + + upstream: add a -V flag to print the version, but mostly as a way + + to check the binary is functional; ok deraadt@ + + OpenBSD-Commit-ID: 0cc5cb22cbfe09ac4c316dd5da0af7a4193a42af + +commit f44f124a234785b9d2cd59a6da28737fb3c4ad9a +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Wed May 27 23:04:36 2026 +0000 + + upstream: Test all mutually supported algorithms, + + using dropbear's new -Q option to query its algorithms where possible. + + OpenBSD-Regress-ID: 7e1fa733dec3bfa9f8931e535a9397209b5953f3 + +commit 0cadf7e0e88f4088595afbea21f2e43f3ae28abc +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue May 12 13:02:40 2026 +0000 + + upstream: Dropbear recently added a -Q option; + + use it to query KEX if available. + + OpenBSD-Regress-ID: beab781f357e27e75dfdd2ec600a7dff2c63cb5b + +commit 0e2db7bc017d968ef57b0b5b4fd86643ecdb05e4 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Mon May 4 10:57:24 2026 +0000 + + upstream: Fix skip message. + + OpenBSD-Regress-ID: d192bbc19cc5914e64a3bb35a347eca0318729af + +commit 0a561f90672b6dc6187763f3b90e47c4c4247875 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 26 10:48:19 2026 +1000 + + Run hardenedmalloc test on ubuntu-latest. + + Needed for newer clang that supports -std=c23. + +commit 3468ac72962970728a204e5052a3be9826090b13 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 26 09:33:51 2026 +1000 + + Hardenedmalloc needs -std=c23 so build with clang. + +commit 42b213c66ba143f543b824ea5951f1ceb3fdd15b +Author: Michael Forney <mforney@mforney.org> +Date: Fri May 22 03:02:00 2026 +1000 + + Fix IPTOS_DSCP_VA fallback + + 0x2c is the unshifted value, and was copied over from openbsd before + it was fixed to be 0xb0 in [0]. + + Source of discrepancy identified by Leah Neukirchen. + + [0] https://cvsweb.openbsd.org/log/src/sys/netinet/ip.h#rev1.22 + +commit 66847768ffd5a2a004891c8d3bd79eaba12625b7 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu May 21 18:39:54 2026 +1000 + + Add OpenBSD 7.9 test VM. + +commit d0d7981cf56363e6320f2aa6cf798e293420a7cf +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu May 21 18:38:47 2026 +1000 + + Another shell portability fix for Solaris. + +commit 498372545f48effd30a4d4c005eea25b1141fc74 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu May 21 18:25:50 2026 +1000 + + Use backticks for shell portability w/ Solaris. + +commit 18b9db789e278c4d6a5ff21093a45683950db3ae +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 19 18:37:26 2026 +1000 + + Add interop tests against Dropbear >= 2020.79 + +commit a5a1b7e75389231bf817433d93f15732ba13c0ad +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu May 21 04:04:57 2026 +0000 + + upstream: mention that compression could potentially leak + + information about session contents (cf. the CRIME attack on TLS) if a + connection allows attacker- controlled traffic over it alongside trused + traffic. This might occur in some forwarding scenarios. + + with deraadt@ + + OpenBSD-Commit-ID: 03d145cdbf3a8713e8309724b5c9a9b76c317749 + +commit e5c9cf9ac7543a5e59dabf11f993a9c032b9b71f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu May 21 02:50:59 2026 +0000 + + upstream: mention usefulness of request type allow/denylisting for + + servers accepting untrusted clients + + OpenBSD-Commit-ID: 8b991bd263b46374a8e73f02d05cdccca73ae520 + +commit 62fce76130485773c635da8adaeb7de78382a5f0 +Author: tb@openbsd.org <tb@openbsd.org> +Date: Mon May 18 04:14:57 2026 +0000 + + upstream: chacha: avoid -Wunterminated-string-initialization + + warning + + The sizes of sigma[] and tau[] aren't used, so include a trailing NUL and + thereby avoid upsetting modern compilers about use of dangerous, valid C. + + ok deraadt djm + + OpenBSD-Commit-ID: 030a71ff16bb1e6135170c6507bc558eabe7345c + +commit 33392024f46e7aabaeaf947cc3b110d60a9fd9e3 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed May 13 05:58:58 2026 +0000 + + upstream: avoid validating bad cipher or mac lists in config files + + / commandline arguments as valid. + + Identified by SUSE and reported by Camila Camargo de Matos + + ok deraadt@ tb@ + + OpenBSD-Commit-ID: 45d51154f2418549e08b80fa33df6c6532046054 + +commit cf6c0b3b94cdc223f1b8be1ef2d93e993af5d976 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed May 13 05:11:02 2026 +0000 + + upstream: fix hard-to-reach NULL deref during pubkey auth + + To hit this, the user must be using a PEM style private key with no + corresponding .pub key adjacent to it. + + OpenBSD-Commit-ID: b7150acc5322fa33f21491834d9471fbe3d30f20 + +commit 55df196e39cb23fd53e42b2f07292ffc01650bff +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 12 19:53:54 2026 +1000 + + Retire OmniOS r151046 & r151054 test configs. + + They require packages from an external mirror which has been unreliable + lately, so stop relying on it. + +commit 6d9116d4dfefe387e42250ec7c01aad56ce43bda +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 12 19:43:48 2026 +1000 + + Handle missing packages for FreeBSD 12.4. + + (Most) FreeBSD mirrors no longer have packages for 12.x, so install the + only thing we need (sudo) from source on. + +commit 99f1e0c2f91f00e0bb3c4a814ec448fda2b0e144 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 12 18:50:20 2026 +1000 + + OmniOS: check for gcc before installing. + +commit ded80eb0ff89f18ccf25cd3dc7997d92d755ef6a +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue May 12 18:05:24 2026 +1000 + + Add VM test versions for : OmniOS and FreeBSD. + + Add OmniOS r151056 and r151058 (with build-essentials, so hopefully + faster and lower dependency) and FreeBSD 12.4 for better coverage. + +commit 67f31cefd8ccf0f55f24e806c4dc86b028fa65ff +Author: Damien Miller <djm@mindrot.org> +Date: Tue May 12 14:36:27 2026 +1000 + + update getrrsetbyname.c from OpenBSD upstream + + revision 1.15 + date: 2026/05/09 01:54:51; author: tb; state: Exp; lines: +14 -13; commitid: zZPVUWycKAslGJtO; + Avoid recursive cleanup in getrrsetbyname() + + Instead of freeing struct dns_query and struct dns_rr by walking the + linked lists recursively, use a simple loop. This avoids a possible + stack exhaustion unlikely to be reachable with the limits modern + resolvers impose. + + From Dhiraj Mishra + +commit 56e73cd804cff08e38caaa03b75bec253f16fd62 +Author: Darafei Praliaskouski <me@komzpa.net> +Date: Sat May 9 19:50:31 2026 +0400 + + ci: avoid rsync dependency in NetBSD VM jobs + +commit ac4a41265a3beccba7dc6f45c657298311280f01 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue May 5 06:21:14 2026 +0000 + + upstream: unbreak; spotted by Darren's test army + + OpenBSD-Commit-ID: e95ceda842a2c7a08fc00ac3a529877d87fee7b2 + +commit 3754f2edd42039ace7d53873975870fbe9143b94 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue May 5 05:34:27 2026 +0000 + + upstream: classify dynamic-tcpip channels as bulk, not interactive; + + bz3958, ok markus@ + + OpenBSD-Commit-ID: b18f1c1eaff8423bf069ff6103e8865cec18d64b + +commit 4ea08a0353f85b5b0cc1ddd70da5fa23e7d588a4 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 23:33:57 2026 +1000 + + Improve NetBSD PAM tests. + + - Set random password and use for password auth test. + - When testing PAM builds, test with and without UsePAM. + +commit 504d01d81fe0d17725786b05737db9cd7f3b2b5c +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 23:15:05 2026 +1000 + + Improve FreeBSD PAM tests. + + - Set random password and use for password auth test. + - When testing PAM builds, test with and without UsePAM. + +commit a05de3f67f69582e061445d5d78e5fcd01067299 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 22:57:58 2026 +1000 + + Update to FreeBSD 14.4, add 15.0. + +commit 6296749fe19a14d11826dd04591ebb84c110e96b +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 21:40:52 2026 +1000 + + Improve Solaris PAM tests. + + - Set up and run tests with SUDO. + - Set random password to use for password & kbdint auth tests. + - Only run t-exec when re-testing with PAM, don't rerun unit tests. + - When testing PAM builds, test with and without UsePAM. + +commit f9d62eaa536cba92bcb42658ff5f72c287c47e49 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 21:39:01 2026 +1000 + + Only run t-exec when re-testing with PAM. + + There's no point rerunning unit tests. + +commit 05af6553e9026df935163a12d14ff4d205465717 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 18:47:03 2026 +1000 + + Add Solaris 11.4-clang-19 test. + +commit cb654c2ce7b0113a14aba979ffe9f7f5ad312013 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon May 4 17:41:37 2026 +1000 + + Add RUN_ONLY_PLATFORM to run a subset of tests. + +commit 328993c8991e5cde61f5abf1b87b26fa2537ae6c +Author: Damien Miller <djm@mindrot.org> +Date: Mon May 4 16:05:34 2026 +1000 + + skip ("#if 0") strvisx and stravis + + we don't use the in OpenSSH and some compilers throw warnings + compiling them that break -Werror + +commit 5fa60ae0d2ed3fc441f54c9349afbd63b6301929 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Fri May 1 09:19:56 2026 +1000 + + Remove 9.9 and 10.0 branches from build status page. + +commit 7ab5e4073a508a342be49e2c238087b2de4e099f +Author: Renaud Allard <renaud@allard.it> +Date: Sat Mar 21 19:23:04 2026 +0100 + + vm.yml: fix solaris PAM tests + + Add missing SSHD_CONFOPTS="UsePam yes" to the solaris PAM test + step so it actually tests PAM functionality instead of re-running + the default tests with a PAM-enabled binary. + +commit 1c553a16065a95284468cd79b1c4919929dfe3ac +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Apr 29 22:22:10 2026 +0000 + + upstream: fiddle with mask after umask call and not before; avoids + + fortify warnings on android. bz3954 + + OpenBSD-Commit-ID: 82224426b2ee989c68f305caa50aa3d3b4993a84 + +commit 1bfe4ce37c3c531150b33d1a9d4dae6234028076 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Apr 28 21:32:05 2026 +0000 + + upstream: unveil the actual listening socket path and its directory + + so it can be cleaned up at exit. + + Reported by / tested by David Krause, ok markus@ + + OpenBSD-Commit-ID: b45d740e9a63dec0fad436ed78f6912b39f0cd53 + +commit f24dc9e993de6f99d5dcb06ba3a401fe5792b2f4 +Author: job@openbsd.org <job@openbsd.org> +Date: Mon Apr 20 07:43:52 2026 +0000 + + upstream: Clarify comment on what setting extended types for + + channels does + + OK djm@ + + OpenBSD-Commit-ID: fa035fb19b74571992fa3adca4396a4c572a7a8a + +commit b9ccca0edfbd46b3114192956d9aaea3e7bc3c08 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Wed Apr 29 09:14:31 2026 +1000 + + Add tracking for 10.3 branch. + +commit 6185d1e6f74fb7749ff0227dfe44b2c3a9dd0885 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Apr 28 09:09:57 2026 +1000 + + Rename obsd arm64 snapshot VM for consistency. + +commit 2029eddf4d57c654d53cdac7a192511de3b386dd +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Mon Apr 27 05:49:41 2026 +0000 + + upstream: Use supported hostkeyalgorithms specifically in + + sshd_config instead of supported key types, which is almost but not + completely correct. + + OpenBSD-Regress-ID: 43c3b348576900f3e710bff5d6a87f0e803c5b3d + +commit ff254f67401fb27e6ae81a266f2d41d4c16bdbba +Author: claudio@openbsd.org <claudio@openbsd.org> +Date: Thu Apr 23 12:57:47 2026 +0000 + + upstream: Drop -Winline from CDIAGFLAGS it breaks on sparc64 + + On sparc64 ssh/unittests/kex fails to build with: + usr.bin/ssh/libcrux_mlkem768_sha3.h:8196: warning: inlining failed + in call to 'libcrux_ml_kem_polynomial_ZERO_89_ea': + --param max-inline-insns-single limit reached + + OK djm@ (long time ago) reminded by tb@ + + OpenBSD-Regress-ID: c32094e3436536474039a4aeefabdbf0bd826554 + +commit 2be9cec2fc062ffa087db55d26203db8f1567661 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 27 21:53:36 2026 +1000 + + Update OpenSSL tested versions. + +commit b41203e500e067095ef64a8de8ca4417a6f39552 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 27 21:16:56 2026 +1000 + + Comment out new PAM valgrind test until debugged. + +commit 4e0d1aea897d77d3b93e191eda58436e44a53818 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 20 18:47:23 2026 +1000 + + Simplify Cygwin permissions setting. + +commit 6c5235cb6692415e475fea4c0b69ee7ea0af8055 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 20 18:45:37 2026 +1000 + + Reorder steps to change perms before displaying. + +commit ba110a56a7180fef18e02dfaccad97cc510a558f +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 20 22:46:17 2026 +1000 + + Allow setting TEST_SSH_TRACE via Github. + +commit 8751cd9c5cac7b358b5648df0510b3f53b95fc22 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 20 22:55:48 2026 +1000 + + Add tests for libressl-4.3.1. + +commit 1afbd7bd1fb71e8b1d06f99978d439aec59dddca +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Apr 27 20:51:17 2026 +1000 + + Re-enable SHA1 sigs in OpenSSL on Cygwin for tests. + + Recently Cygwin imported changes from Fedora which disable SHA1 + signatures by default. This breaks the unit tests (and a couple of + regression tests), so set rh-allow-sha1-signatures=yes in the OpenSSL + config to re-enable them. + +commit 7235471fb40705130d7f5816ec31ab562efc8cf9 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Sat Apr 25 20:00:38 2026 +1000 + + Check for OPENSSL_NO_ENGINE for --with-ssl-engine. + + OpenSSL 4 removes support for ENGINE, but it provides no-op stubs + for the ENGINE functions in addition to setting OPENSSL_NO_ENGINE. + + The presence of the stubs fooled the old configure test, so if someone + tried --with-ssl-engine with OpenSSL 4.0.0 it'd try but fail at build + time. Explicitly check for OPENSSL_NO_ENGINE. before trying to enable + ENGINE support. bz#3952. + +commit 45b30e0a5439a02417a4fe982a4b16a9c126ba6b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Apr 19 23:37:22 2026 +0000 + + upstream: correctly set extended type for client-side channels. + + Fixes interactive vs bulk IPQoS for client->server traffic. ok job@ + + OpenBSD-Commit-ID: 34f5131face8d6dc4ae6955196e5fcafb3570cfe + +commit ca19b95ab6cd4efe5f2d8a08a377a2ac0b9caca1 +Author: job@openbsd.org <job@openbsd.org> +Date: Mon Apr 13 08:18:33 2026 +0000 + + upstream: Also show the duration of the current session through the + + ~I escape + + OK dtucker@ + + OpenBSD-Commit-ID: 695c1a09c4cc8b417a1bd3eb207b0cc7fa831c7a + +commit 00d955cf9e2e09eb3e98ebf6b375adccb7f25842 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Apr 7 07:40:40 2026 +0000 + + upstream: want stdint.h here now that we've switched from u_intXX_t + + -> uintXX_t + + OpenBSD-Commit-ID: 6d5e80bd6f29a9db18b18beeb1cbe5423b59de44 + +commit eb34f95206c3556e10046f091ea95431c4be84f8 +Author: Bob Beck <beck@openssl.org> +Date: Thu Apr 16 10:09:02 2026 -0600 + + Make ci work for OpenSSL 4 variants + +commit 713ec5c5ae9b8ca91c3b752bec12e728612d13f4 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Apr 16 20:55:23 2026 +1000 + + Test against OpenSSL 3.6.2, 4.0.0 and 4.0-stable. + +commit b6d46558dbd482d0d9c46ab53805d1803967b59c +Author: Dmitry Misharov <dmitry@openssl.org> +Date: Mon Mar 16 09:08:57 2026 +0100 + + account newer openssl versions in .github/setup_ci.sh + +commit f2da6737e237324b43afc002ce4836e65659fb2e +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Apr 16 19:32:34 2026 +1000 + + Match case with other messages. + +commit b433d015a6547598e568808d9cae16325bc8928f +Author: Damien Miller <djm@mindrot.org> +Date: Wed Apr 15 08:14:58 2026 +1000 + + regen signature on allowed_signers file + + This was missed after the file was updated, but nobody noticed it + until now. + commit 4168c905943f7f715182180b9f7c8cda54af2514 Author: Damien Miller <djm@mindrot.org> Date: Thu Apr 2 18:56:48 2026 +1100 @@ -9276,1352 +11145,3 @@ Date: Sun Jul 7 18:46:19 2024 +1000 Cast to sockaddr * in systemd interface. Fixes build with musl libx. bz#3707. - -commit 30c8c81da2169e78357d08dbb0ddd823b60e93bc -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Jul 4 20:12:26 2024 +1000 - - Add 9.8 branch to ci-status page. - -commit ee6b9e661633fcefd29dba0c811cecbc4d027f6f -Author: Samuel Thibault <samuel.thibault@ens-lyon.org> -Date: Tue Mar 26 22:15:08 2024 +0100 - - Fix detection of setres*id on GNU/Hurd - - Like Linux, proper _SOURCE macros need to be set to get declarations of - various standard functions, notably setres*id. Now that Debian is using - -Werror=implicit-function-declaration this is really required. While at - it, define other _SOURCE macros like on GNU/Linux, since GNU/Hurd uses - the same glibc. - -commit fa41f6592ff1b6ead4a652ac75af31eabb05b912 -Author: Damien Miller <djm@mindrot.org> -Date: Mon Jul 1 14:33:26 2024 +1000 - - version numbers - -commit bfebb8a5130a792c5356bd06e1ddef72a0a0449f -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Jul 1 04:31:59 2024 +0000 - - upstream: openssh-9.8 - - OpenBSD-Commit-ID: 5f8b89e38a4c5f7c6d52ffa19f796d49f36fab19 - -commit 146c420d29d055cc75c8606327a1cf8439fe3a08 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Jul 1 04:31:17 2024 +0000 - - upstream: when sending ObscureKeystrokeTiming chaff packets, we - - can't rely on channel_did_enqueue to tell that there is data to send. This - flag indicates that the channels code enqueued a packet on _this_ ppoll() - iteration, not that data was enqueued in _any_ ppoll() iteration in the - timeslice. ok markus@ - - OpenBSD-Commit-ID: 009b74fd2769b36b5284a0188ade182f00564136 - -commit 637e4dfea4ed81264e264b6200172ce319c64ead -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Jul 1 03:10:19 2024 +0000 - - upstream: use "lcd" to change directory before "lls" rather then "cd", - - since the directory we're trying to list is local. Spotted by Corinna - Vinschen - - OpenBSD-Regress-ID: 821feca4a4bebe491944e624c8f7f2990b891415 - -commit c8cfe258cee0b8466ea84597bf15e1fcff3bc328 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 27 23:01:15 2024 +0000 - - upstream: delete obsolete comment - - OpenBSD-Commit-ID: 5fb04f298ed155053f3fbfdf0c6fe7cdf84bbfa2 - -commit 94b9d37100f6fa536aaa1d1a0e4926fe44fbf04d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 27 22:36:44 2024 +0000 - - upstream: retire unused API - - OpenBSD-Commit-ID: 3e30d7b0615e2707f6bbe70f61b1c2f72f78161b - -commit 268c3a7f5783e731ed60f4e28da66ee3743581d3 -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Thu Jun 27 21:02:16 2024 +0000 - - upstream: ssl(8) no longer contains a HISTORY section; - - OpenBSD-Commit-ID: 83b7ff34433d79595e9c2a5d2a561a6660251245 - -commit 12b6cc09ce6c430681f03af2a8069e37a664690b -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jun 26 23:47:46 2024 +0000 - - upstream: move child process waitpid() loop out of SIGCHLD handler; - - ok deraadt - - OpenBSD-Commit-ID: 65815a39564e431414aed7c5ace8076f4e9ca741 - -commit d6bcd13297c2ab8b528df5a6898f994734849031 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Wed Jun 26 23:16:52 2024 +0000 - - upstream: Instead of using possibly complex ssh_signal(), write all - - the parts of the grace_alarm_handler() using the exact things allowed by the - signal-safe rules. This is a good rule of thumb: Handlers should be written - to either set a global volatile sig_atomic_t inspected from outside, and/or - directly perform only safe operations listed in our sigaction(2) manual page. - ok djm markus - - OpenBSD-Commit-ID: 14168ae8368aab76e4ed79e17a667cb46f404ecd - -commit b8793e2b0851f7d71b97554fa5260b23796d6277 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Wed Jun 26 23:14:14 2024 +0000 - - upstream: save_errno wrappers inside two small signal handlers that - - perform system calls, for systems with libc that do perform libc sigtramps. - ok djm markus - - OpenBSD-Commit-ID: 7749b56419a7c9dcfe4c6c04811e429813346c62 - -commit f23e9332c4c8df37465c4a4f38275ea98980ed7e -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Mon Jun 24 06:59:39 2024 +0000 - - upstream: - uppercase start of sentence - correct sentence grammar - - ok djm - - OpenBSD-Commit-ID: 1ec4b0fdb633a43667f2c8fff1d600bd647dde25 - -commit 1839e3eb71a759aa795602c1e4196300f4ac2615 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Jun 24 04:05:11 2024 +0000 - - upstream: mention SshdSessionPath option - - OpenBSD-Commit-ID: c29734d36c21003973b15c1c9965c35f36cef30c - -commit 603193e32aef5db7d60c58066d5de89806e79312 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Jun 20 18:45:14 2024 +1000 - - Rerun upstream tests on .sh file changes too. - -commit dbbf9337c19381786a8e5a8a49152fe6b80c780d -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Thu Jun 20 08:23:18 2024 +0000 - - upstream: Work around dbclient cipher/mac query bug. - - Unlike earlier versions, recent Dropbear (at least v2024.85) requires - a host arg when querying supported ciphers and macs via "-c/-m - help". Earlier versions accept but do not require it, so always - provide it. If these queries fail, skip the test with a warning. - - OpenBSD-Regress-ID: 98eb863a3f0363416922efb273885e6b3c7f68d4 - -commit 8de2c8cebc46bbdb94b7a2c120fcadfb66a3cccc -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Thu Jun 20 08:18:34 2024 +0000 - - upstream: Remove dropbear key types not supported - - by current OpenSSH. Allows subsequent test runs to work if OpenSSH is - rebuilt w/out OpenSSL. - - OpenBSD-Regress-ID: e0129eb2b1d31771105903a8055216fbba20a770 - -commit e9b6471c59b21e5d9ef1b3832d4bf727338add85 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 20 00:18:05 2024 +0000 - - upstream: stricter check for overfull tables in penalty record path - - OpenBSD-Commit-ID: 7df01e648a0723418c554e64a9f2b6d38db060a6 - -commit d9336d344eb2a1e898c5e66147b3f108c7214694 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jun 19 23:24:47 2024 +0000 - - upstream: put back reaping of preauth child process when writes - - from the monitor fail. Not sure how this got lost in the avalanche of - patches. - - OpenBSD-Commit-ID: eb7eb36371e1ac01050b32b70fb2b3e5d98e72f5 - -commit 579d9adb70ec0206a788eb5c63804c31a67e9310 -Author: naddy@openbsd.org <naddy@openbsd.org> -Date: Mon Jun 17 13:50:18 2024 +0000 - - upstream: remove one more mention of DSA - - OpenBSD-Commit-ID: 8515f55a15f02836ba657df341415f63c60526ca - -commit 7089b5f8436ef0b8d3d3ad9ce01045fb9e7aab15 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jun 19 23:09:05 2024 +1000 - - Move -f to the place needed to restart sshd. - -commit d5f83cfd852b14a25f347f082ab539a9454702ad -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jun 19 21:04:01 2024 +1000 - - Need to supply "-f" to restart sshd. - -commit fad34b4ca25c0ef31e5aa841d461b6f21da5b8c1 -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Wed Jun 19 10:15:51 2024 +0000 - - upstream: Provide defaults for ciphers and macs - - if querying for them fails since on some versions of Dropbear (at least - v2024.85) "-m help" doesn't seem to work. Enable all supported pubkey - algorithms in the server. - - OpenBSD-Regress-ID: 4f95556a49ee9f621789f25217c367a33d2745ca - -commit 5521060e35ada9f957cecdddc06d0524e75409ef -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Wed Jun 19 10:10:46 2024 +0000 - - upstream: Use ed25519 keys for kex tests - - since that's supported by OpenSSH even when built without OpenSSL. - Only test diffie-hellman kex if OpenSSH is compiled with support for it. - - OpenBSD-Regress-ID: a5d09ef9bbd171f9e4ec73ed0d9eeb49a8878e97 - -commit dbd3b833f6e3815e58f2dc6e14f61a51bcd4d6bd -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Wed Jun 19 10:08:34 2024 +0000 - - upstream: Rework dropbear key setup - - to always generate ed25519 keys, other types only if OpenSSH has support - for the corresponding key type. - - OpenBSD-Regress-ID: 8f91f12604cddb9f8d93aa34f3f93a3f6074395d - -commit d6218504e11ae9148adf410fc69b0710a052be36 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jun 19 20:20:24 2024 +1000 - - Restart sshd after installing it for testing. - - When installing an sshd built without OpenSSL the mismatch between - the running sshd and newly installed sshd-session will cause the - remainder of the test to fail. - -commit 786a4465b6bb702daf4fb17b7c3bcb42b52f0b46 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jun 18 19:59:59 2024 +1000 - - Remove macos-11 runner. - - Github is retiring them soon. - -commit df1c72a55edbebac14363b57de66ac6a147ecc67 -Author: Damien Miller <djm@mindrot.org> -Date: Wed Jun 19 09:34:34 2024 +1000 - - PAMServiceName may appear in a Match block - -commit de1c2e70e5a5dc3c8d2fe04b24cc93d8ef6930e7 -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Tue Jun 18 08:11:48 2024 +0000 - - upstream: Re-enable ssh-dss tests - - ... if ssh is compiled with DSA support - - OpenBSD-Regress-ID: bbfaf8c17f2b50a2d46ac35cb97af99b990c990d - -commit dabc2c7cf3c141e8e5d5a1a60d6c1d2d2422cf43 -Author: anton@openbsd.org <anton@openbsd.org> -Date: Tue Jun 18 06:14:27 2024 +0000 - - upstream: Stop using DSA in dropbear interop tests. - - OpenBSD-Regress-ID: abfd4457d99d8cc1417fd22ca2c570270f74c1cf - -commit 761438012710169445acc179e3870c53c862bda0 -Author: Damien Miller <djm@mindrot.org> -Date: Tue Jun 18 12:29:45 2024 +1000 - - missed a bit of DSA in the fuzzer - -commit 3f9cc47da588e8de520720e59f98438043fdaf93 -Author: Damien Miller <djm@mindrot.org> -Date: Tue Jun 18 09:35:53 2024 +1000 - - DSA support is disabled, so remove from fuzzers - -commit 00eb95957dea5484b2c7c043f7d2bbc87301bef2 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Jun 17 08:30:29 2024 +0000 - - upstream: disable the DSA signature algorithm by default; ok - - markus@ - - (yes, I know this expands to "the Digitial Signature Algorithm - signature algorithm) - - OpenBSD-Commit-ID: 961ef594e46dd2dcade8dd5721fa565cee79ffed - -commit 5603befe11c9464ea26fe77cbacc95a7cc0b1ea7 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Jun 17 08:28:31 2024 +0000 - - upstream: promote connection-closed messages from verbose to info - - log level; they could be the only record of the connection terminating if the - client doesn't send a SSH2_MSG_DISCONNECT message. ok dtucker@ - - OpenBSD-Commit-ID: 0c8bfaf5e9fdff945cee09ac21e641f6c5d65d3c - -commit b00331402fe5c60d577f3ffcc35e49286cdc6b47 -Author: Damien Miller <djm@mindrot.org> -Date: Mon Jun 17 17:02:18 2024 +1000 - - propagate PAM crashes to PerSourcePenalties - - If the PAM subprocess crashes, exit with a crash status that will be - picked up by the sshd(8) listener process where it can be used by - PerSourcePenalties to block the client. This is similar handling to - the privsep preauth process. - -commit 1c207f456ace38987deda047758d13fbf857f948 -Author: Damien Miller <djm@mindrot.org> -Date: Mon Jun 17 15:06:01 2024 +1000 - - minix doesn't have loopback, so skip penalty tests - - pointed out by dtucker@ - -commit 48443d202eaec52d4d39defdd709a4499a7140c6 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sun Jun 16 11:54:49 2024 +0000 - - upstream: same treatment for this test - - OpenBSD-Regress-ID: d0cc9efca7833e673ea7b0cb3a679a3acee8d4c7 - -commit 45562a95ea11d328c22d97bf39401cd29684fb1f -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sun Jun 16 08:18:06 2024 +0000 - - upstream: penalty test is still a bit racy - - OpenBSD-Regress-ID: 90c9ac224db454637baf1ebee5857e007321e824 - -commit 8d0f7eb147ef72d18acb16c0b18672d44941a8ca -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sat Jun 15 03:59:10 2024 +0000 - - upstream: crank up penalty timeouts so this should work on even the - - slowest of test builders - - OpenBSD-Regress-ID: 70bda39c83e3fc9d0f3c1fad4542ed33e173d468 - -commit 93c75471a1202ab3e29db6938648d4e2602c0475 -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Fri Jun 14 05:20:34 2024 +0000 - - upstream: sort -q in the options list; - - OpenBSD-Commit-ID: 6839b38378f38f754de638a5e988c13b4164cc7c - -commit dd7807bbe80a93ffb4616f2bd5cf83ad5a5595fb -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jun 14 05:01:22 2024 +0000 - - upstream: clarify KEXAlgorithms supported vs available. Inspired by - - bz3701 from Colin Watson. - - OpenBSD-Commit-ID: e698e69bea19bd52971d253f2b1094490c4701f7 - -commit d172ad56df85b68316dbadbedad16761a1265874 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jun 14 05:00:42 2024 +0000 - - upstream: ssh-keyscan -q man bits - - OpenBSD-Commit-ID: ba28d0e1ac609a4c99c453e57e86560c79079db1 - -commit 092e4ff9ccaacbe035f286feb1b56ed499604743 -Author: Damien Miller <djm@mindrot.org> -Date: Fri Jun 14 14:46:35 2024 +1000 - - skip penalty-expire test in valgrind test env - -commit 2866ad08a9c50d7b67ce9424ca990532b806a21a -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jun 14 04:43:11 2024 +0000 - - upstream: split the PerSourcePenalties test in two: one tests penalty - - enforcement but not penalty expiry, the other tests penalty expiry. - - This lets us disable the expiry testing in certain CI test environments. - - OpenBSD-Regress-ID: f56811064f3e3cb52ee73a206b8c2a06af1c8791 - -commit b2c64bc170d75823622a37cab3ca1804ca87ad16 -Author: Damien Miller <djm@mindrot.org> -Date: Fri Jun 14 14:19:23 2024 +1000 - - add a sshd_config PamServiceName option - - Allows selecting which PAM service name to use when UsePAM is - enabled. Defaults to "sshd" unless overridden at compile time - by defining SSHD_PAM_SERVICE. - - bz2102, ok dtucker@ - -commit 9f032a4dd17bf0ae6066223d82aa5e784285d987 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jun 14 00:26:12 2024 +0000 - - upstream: don't redirect stderr for ssh-keyscan we expect to succeed - - OpenBSD-Regress-ID: 8878b8eb4e070ed2e343166d3eb86db4a08a216c - -commit 1e84d0cf40e94ae3a77d6a7ca8c036d8e3d55a40 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jun 14 00:25:25 2024 +0000 - - upstream: make host/banner comments go to stderr instead of stdout, - - so they are useful as comments without extra shell redirection and so they - don't clutter actual errors on stderr. - - Add a -q flag to shut them up. - - ok dtucker@ - - OpenBSD-Commit-ID: bec813de56a71adb5c1a76adcf49621130d24264 - -commit 3e806d011855d6bd648ec95b9df630ebbd11c3bf -Author: naddy@openbsd.org <naddy@openbsd.org> -Date: Thu Jun 13 15:06:33 2024 +0000 - - upstream: separate keywords with comma - - OpenBSD-Commit-ID: d65a99666202a8188c4991c18d14374a229f7be5 - -commit abfd1f7a3cbd0a92581a0febba254b2f6649c0d9 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jun 14 00:23:55 2024 +0000 - - upstream: specify an algorithm for ssh-keyscan, otherwise it will make - - multiple attempts simultaneously and confuse the test - - OpenBSD-Regress-ID: 6e910f3315c4345053db1bf5cbf61826b194d0b9 - -commit a8fbe2f7d0d96d299ee8e69769e3b51067978748 -Author: Damien Miller <djm@mindrot.org> -Date: Thu Jun 13 16:41:29 2024 +1000 - - sshd: don't use argv[0] as PAM service name - - sshd would implicitly use argv[0] as the PAM service name to - allow people to select different PAM service names by making - differently-named copies/links to the sshd binary. - - Splitting sshd into sshd/sshd-session broke this, as the process - that starts PAM is always sshd-session and the user has no control - over this. - - Hardcode "sshd" as the default PAM service name unless/until we - figure out a better way. Should unbreak OSX integration tests. - -commit bf204bd05c3ae650f87e2b96527688579f59774c -Author: Damien Miller <djm@mindrot.org> -Date: Thu Jun 13 15:00:28 2024 +1000 - - prepare for checking in autogenerated files - - We plan to check in automatically generated files (config.h.in, etc) on - release branches. These files are normally ignored by .gitignore, but - this shuffles the contents of this file to make it easy to un-ignore - them. - -commit 425f79a837489904c343b349ef00e09aeaa4e752 -Author: Damien Miller <djm@mindrot.org> -Date: Thu Jun 13 14:41:33 2024 +1000 - - typo in comment - -commit afe10313c1fa8d478af399ee7d54c8f85503013b -Author: Damien Miller <djm@mindrot.org> -Date: Thu Jun 13 14:35:25 2024 +1000 - - fix PTY allocation on Cygwin, broken by sshd split - - Cygwin doesn't support FD passing and so used to disable post-auth - privilege separation entirely because privsep requires PTY allocation - to happen in the privileged monitor process with the PTY file - descriptors being passed back to the unprivileged process. - - This brings back a minimal version of the previous special treatment - for Cygwin (and any other platform that sets DISABLE_FD_PASSING): - privilege separation remains enabled, but PTY allocation happens in - the post-auth user process rather than the monitor. - - This either requires PTY allocation to not need privilege to begin - with (this appears to be the case on Cygwin), or the post-auth - privsep process retain privilege (other platforms that set the - DISABLE_FD_PASSING option). - - Keeping privileges here is bad, but the non-Cygwin systems that set - DISABLE_FD_PASSING are so deeply legacy that this is likely to be the - least of their problems. - -commit f66d4df5749551380a8c4ae642347675a0b6a2e9 -Author: Damien Miller <djm@mindrot.org> -Date: Thu Jun 13 11:33:09 2024 +1000 - - delay lookup of privsep user until config loaded - - sshd-session attempting to use options.kerberos_authentication to - decide whether it needed to lookup the privsep user before the - configuration was loaded. This caused it to get a placeholder value - that caused it always to try to lookup the privsep user, breaking at - least one test environment. - -commit f1c42858b94f5d9b58867b34dce3afb39c6b56a8 -Author: Damien Miller <djm@mindrot.org> -Date: Thu Jun 13 11:16:57 2024 +1000 - - missing file for PerSourcePenalties regress test - -commit 4de80ff4e6fab5a6bb0028e7d57c6c23d1485adb -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jun 12 22:36:00 2024 +0000 - - upstream: split PerSourcePenalties address tracking. Previously it - - used one shared table and overflow policy for IPv4 and IPv6 addresses, now it - will use separate tables and optionally different overflow policies. - - This prevents misbehaviour from IPv6 addresses (which are vastly easier - to obtain many of) from affecting IPv4 connections and may allow for - stricter overflow policies. - - ok deraadt@ - - OpenBSD-Commit-ID: 12637ed0aa4d5f1f3e702da42ea967cbd8bfdfd9 - -commit 06ab4c6931b0aaa4334db2faaa7e1069e76d0df6 -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Tue Jun 11 05:24:39 2024 +0000 - - upstream: do not mark up "(default: 20ms)"; - - OpenBSD-Commit-ID: 54151ecdecfa1b67dcdda4fd24826ef6e2148ad4 - -commit cfe243cd9fde148ed060637876e27bb55ac78be9 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 02:54:51 2024 +0000 - - upstream: reap preauth net child if it hangs up during privsep message - - send, not just message receive - - OpenBSD-Commit-ID: 02a093f4ab4f8f83f0cd1ea2bb35b9ca420448f0 - -commit b0a711c00b9c64afd1c9d6fb538275c6604a2676 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 01:58:27 2024 +0000 - - upstream: fix PIDFILE handling, broken for SUDO=doas in last commit - - here - - OpenBSD-Regress-ID: 96fec579af228f87a036e94801eb294af9074625 - -commit 90fb801e2d9241be50a2a7ff79428386442a041f -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 02:00:30 2024 +0000 - - upstream: reap the pre-auth [net] child if it hangs up during privsep - - message sending, not just receiving - - OpenBSD-Commit-ID: f7341605bf08c4c15830910446e6775323f2f8cb - -commit ef878d58798f6688c7f4d4e417dc0c29023ea831 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 01:23:25 2024 +0000 - - upstream: a little more RB_TREE paranoia - - OpenBSD-Commit-ID: 8dc2fd21eebd8830c4a4d25461ac4fe228e11156 - -commit fc4e96b2174d6a894d2033421699d091679baced -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 01:22:25 2024 +0000 - - upstream: fix off-by-one comparison for PerSourcePenalty - - OpenBSD-Commit-ID: af4f5d01c41ef870b23e55655bfbf73474a6c02b - -commit 82c836df4ff41145553cd7adb11c5b985aeaa06f -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 01:21:41 2024 +0000 - - upstream: move tree init before possible early return - - OpenBSD-Commit-ID: 72e2c5b69f151c08a7c5bf5ad929b97a92c273df - -commit a2300f015cc4939c4d9c564b58b74e71202dc978 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 01:07:35 2024 +0000 - - upstream: update to mention that PerSourcePenalties default to - - being enabled and document the default values for each parameter. - - OpenBSD-Commit-ID: b981288bddfb097aad269f62df4081c688ce0034 - -commit 41987efd356d3fc30139aeab4b09374acf8f91a0 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 00:44:52 2024 +0000 - - upstream: reap the [net] child if it hangs up while writing privsep - - message payloads, not just the message header - - OpenBSD-Commit-ID: 24dbd400aa381ac96be7ed2dd49018487dfef6ce - -commit 6211aa085fa91155a24922e5329576ac9a8f3175 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 00:40:21 2024 +0000 - - upstream: log waitpid() status for abnormal exits - - OpenBSD-Commit-ID: b317930e06b51819c1a2bc6a4359764fecfb1c2d - -commit a59634c7adb9ae988748d99963dfafb3070d8d41 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Jun 11 00:36:20 2024 +0000 - - upstream: correct error message - - OpenBSD-Commit-ID: 581f60f73099083392887206860229ab104620ed - -commit fa7d7a667f2ee031e72873e36de2d2a36bca973b -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Fri Jun 7 13:23:30 2024 +0000 - - upstream: avoid shadowing issues which some compilers won't accept - - ok djm - - OpenBSD-Commit-ID: 1e89572397dda83433d58c4fa6333a08f51170d4 - -commit 3ad4cd9eeca5c9bc6706db44b6de88e2e4513fd6 -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Thu Jun 6 21:14:49 2024 +0000 - - upstream: escape the final dot at eol in "e.g." to avoid double - - spacing; - - OpenBSD-Commit-ID: 0a9fb10bc9f7d577afe2da3f498a08bc431115b9 - -commit 0e0c69761a4c33ccd4a256560f522784a753d1a8 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 20:25:48 2024 +0000 - - upstream: enable PerSourcePenalties by default. - - ok markus - - NB. if you run a sshd that accepts connections from behind large NAT - blocks, proxies or anything else that aggregates many possible users - behind few IP addresses, then this change may cause legitimate traffic - to be denied. - - Please read the PerSourcePenalties, PerSourcePenaltyExemptList and - PerSourceNetBlockSize options in sshd_config(5) for how to tune your - sshd(8) for your specific circumstances. - - OpenBSD-Commit-ID: 24a0e5c23d37e5a63e16d2c6da3920a51078f6ce - -commit bd1f74741daabeaf20939a85cd8cec08c76d0bec -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 20:20:42 2024 +0000 - - upstream: mention that PerSourcePenalties don't affect concurrent - - in-progress connections. - - OpenBSD-Commit-ID: 20389da6264f2c97ac3463edfaa1182c212d420c - -commit 9774b938578327d88a651f4c63c504809717590a -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 19:49:25 2024 +0000 - - upstream: regress test for PerSourcePenalties - - OpenBSD-Regress-ID: a1af13d411b25a727742644459d26480b9a1b0f1 - -commit b8ebd86cefe9812204a10c028dc90de29918667d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 19:48:40 2024 +0000 - - upstream: make sure logs are saved from sshd run via start_sshd - - OpenBSD-Regress-ID: de4ef0e32e3ab85ff3a6c36eb08d1909c0dd1b4a - -commit d7b2070bdaa4ebbfafb9975c1d5a62b73289d31f -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 19:47:48 2024 +0000 - - upstream: simplify - - OpenBSD-Regress-ID: 50316e0d1ae0c0a057a45af042253e54ce23d11c - -commit e6ea3d224513b6bfb93818809d4c7397f5995ba2 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 18:48:13 2024 +0000 - - upstream: prepare for PerSourcePenalties being enabled by default - - in future - - OpenBSD-Regress-ID: 5236c6d1c823997aac5a35e2915da30f1903bec7 - -commit c0cb3b8c837761816a60a3cdb54062668df09652 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 19:50:01 2024 +0000 - - upstream: disable stderr redirection before closing fds - - OpenBSD-Commit-ID: d42cb895ee4542098050367fc35321c9303f003a - -commit 81c1099d22b81ebfd20a334ce986c4f753b0db29 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Jun 6 17:15:25 2024 +0000 - - upstream: Add a facility to sshd(8) to penalise particular - - problematic client behaviours, controlled by two new sshd_config(5) options: - PerSourcePenalties and PerSourcePenaltyExemptList. - - When PerSourcePenalties are enabled, sshd(8) will monitor the exit - status of its child pre-auth session processes. Through the exit - status, it can observe situations where the session did not - authenticate as expected. These conditions include when the client - repeatedly attempted authentication unsucessfully (possibly indicating - an attack against one or more accounts, e.g. password guessing), or - when client behaviour caused sshd to crash (possibly indicating - attempts to exploit sshd). - - When such a condition is observed, sshd will record a penalty of some - duration (e.g. 30 seconds) against the client's address. If this time - is above a minimum threshold specified by the PerSourcePenalties, then - connections from the client address will be refused (along with any - others in the same PerSourceNetBlockSize CIDR range). - - Repeated offenses by the same client address will accrue greater - penalties, up to a configurable maximum. A PerSourcePenaltyExemptList - option allows certain address ranges to be exempt from all penalties. - - We hope these options will make it significantly more difficult for - attackers to find accounts with weak/guessable passwords or exploit - bugs in sshd(8) itself. - - PerSourcePenalties is off by default, but we expect to enable it - automatically in the near future. - - much feedback markus@ and others, ok markus@ - - OpenBSD-Commit-ID: 89ded70eccb2b4926ef0366a4d58a693de366cca - -commit 916b0b6174e203cf2c5ec9bcf409472eb7ffbf43 -Author: Damien Miller <djm@mindrot.org> -Date: Fri Jun 7 03:31:02 2024 +1000 - - whitespace - -commit 49b55e44182b8294419aa580cbf043d5b9e3d953 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Jun 4 15:14:45 2024 +0000 - - upstream: enable -fret-clean on amd64, for libc libcrypto ld.so - - kernel, and all the ssh tools. The dynamic objects are entirely ret-clean, - static binaries will contain a blend of cleaning and non-cleaning callers. - - OpenBSD-Commit-ID: 112aacedd3b61cc5c34b1fa6d9fb759214179172 - -commit cc80d51d034bcb24fd0f2564a4bdf1612000a2a2 -Author: Damien Miller <djm@mindrot.org> -Date: Wed Jun 5 02:21:30 2024 +1000 - - remove PRIVSEP macros for osx - -commit 8785491123d4d722b310c20f383570be758f8263 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sat Jun 1 07:03:37 2024 +0000 - - upstream: be really strict with fds reserved for communication with the - - separate sshd-session process - reserve them early and fatal if we can't - dup2(2) them later. The pre-split fallback to re-reading the configuration - files is not possible, so sshd-session absolutely requires the fd the - configuration is passed over to be in order. - - ok deraadt@ - - OpenBSD-Commit-ID: 308a98ef3c8a6665ebf92c7c9a0fc9600ccd7065 - -commit f1c8918cb98459910fb159373baea053ba4108c0 -Author: Damien Miller <djm@mindrot.org> -Date: Fri May 31 19:12:26 2024 +1000 - - depend - -commit 94b4866cb1f4b0ed29a9f367047b30f81002316f -Author: Damien Miller <djm@mindrot.org> -Date: Fri May 31 19:11:14 2024 +1000 - - rename need_privsep to need_chroot - - privsep is mandatory, chroot is optional (disabled when running - sshd as non-root) - -commit e68a95142e5024b144f8eeccd5ffdee42c34f44c -Author: Damien Miller <djm@mindrot.org> -Date: Fri May 31 19:05:34 2024 +1000 - - remove remaining use_privsep mention - -commit b21d271f651d2536dca819cc6d74032fe98634db -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 31 09:01:08 2024 +0000 - - upstream: warn when -r (deprecated option to disable re-exec) is - - passed - - OpenBSD-Commit-ID: 73145ef5150edbe3ce7889f0844ed8fa6155f551 - -commit a4b5bc246cbca476deeeb4462aa31746a56e3021 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 31 08:49:35 2024 +0000 - - upstream: typos - - OpenBSD-Commit-ID: edfa72eb06bfa65da30fabf7d2fe76d2d33f77bf - -commit 8054b906983ceaed01fabd8188d3dac24c05ba39 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon May 27 01:52:26 2024 +0000 - - upstream: don't need sys/queue.h here - - OpenBSD-Commit-ID: dd137396828171eb19e4911581812ca58de6c578 - -commit 210d4239733da6180ce853538aeb9413d5c62ad5 -Author: naddy@openbsd.org <naddy@openbsd.org> -Date: Sun May 26 20:35:12 2024 +0000 - - upstream: remove references to SSH1 and DSA server keys - - OpenBSD-Commit-ID: 57cc1c98d4f998981473734f144b904af7d178a2 - -commit f0b9261d7fdd0ef86806b49fe76344bd16770cd0 -Author: jsg@openbsd.org <jsg@openbsd.org> -Date: Thu May 23 23:47:16 2024 +0000 - - upstream: remove unused struct fwd_perm_list, no decl with complete - - type ok djm@ - - OpenBSD-Commit-ID: 416fb3970b7e73c76d2963c4f00cf96f2b2ee2fb - -commit 2477a98c3ef78e63b11a1393656e00288f52ae97 -Author: naddy@openbsd.org <naddy@openbsd.org> -Date: Wed May 22 15:24:55 2024 +0000 - - upstream: Do not pass -Werror twice when building with clang. - - OpenBSD-Commit-ID: 5f378c38ad8976d507786dc4db9283a879ec8cd0 - -commit 435844f5675245b4271f8581f15e6d1f34fde3bc -Author: miod@openbsd.org <miod@openbsd.org> -Date: Wed May 22 11:49:36 2024 +0000 - - upstream: Do not pass -Werror if building with gcc 3, for asn1.h - - and bio.h cause (admittedly bogus) warnings with gcc 3. - - OpenBSD-Commit-ID: fb39324748824cb0387e9d67c41d1bef945c54ea - -commit fc5dc092830de23767c6ef67baa18310a64ee533 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed May 22 04:20:00 2024 +0000 - - upstream: this test has been broken since 2014, and has been - - testing the same key exchange algorithm repeatedly instead of testing all of - them. Spotted by nreilly AT blackberry.com in bz3692 - - Who broke the test? me. - - OpenBSD-Regress-ID: 48f4f5946276f975667141957d25441b3c9a50e2 - -commit fd4816791beaed2fdae7eea3e1494d1972b2a39d -Author: anton@openbsd.org <anton@openbsd.org> -Date: Sun May 19 19:10:01 2024 +0000 - - upstream: Add missing kex-names.c source file required since the - - ssh split. - - OpenBSD-Regress-ID: ca666223f828fc4b069cb9016bff1eb50faf9fbb - -commit beccb7319c5449f6454889013403c336446d622e -Author: naddy@openbsd.org <naddy@openbsd.org> -Date: Fri May 17 14:42:00 2024 +0000 - - upstream: remove duplicate copy of relink kit for sshd-session - - OpenBSD-Commit-ID: 6d2ded4cd91d4d727c2b26e099b91ea935bed504 - -commit dcd79fa141311c287e0595ede684b7116122fae0 -Author: jsg@openbsd.org <jsg@openbsd.org> -Date: Fri May 17 06:42:04 2024 +0000 - - upstream: remove prototypes with no matching function; ok djm@ - - OpenBSD-Commit-ID: 6d9065dadea5f14a01bece0dbfe2fba1be31c693 - -commit 6454a05e7c6574d70adf17efe505a8581a86ca4f -Author: jsg@openbsd.org <jsg@openbsd.org> -Date: Fri May 17 06:38:00 2024 +0000 - - upstream: remove externs for removed vars; ok djm@ - - OpenBSD-Commit-ID: f51ea791d45c15d4927eb4ae7d877ccc1e5a2aab - -commit f3e4db4601ef7d2feb1d6f7447e432aaf353a616 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Fri May 17 06:11:17 2024 +0000 - - upstream: -Werror was turned on (probably just for development), - - and this is a simple way to satisfy older gcc. - - OpenBSD-Commit-ID: 7f698df54384b437ce33ab7405f0b86c87019e86 - -commit 24a1f3e5ad6f4a49377d4c74c36637e9a239efd0 -Author: Damien Miller <djm@mindrot.org> -Date: Fri May 17 14:50:43 2024 +1000 - - attempt at updating RPM specs for sshd-session - -commit 17b566eeb7a0c6acc9c48b35c08885901186f861 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 17 04:42:13 2024 +0000 - - upstream: g/c unused variable - - OpenBSD-Commit-ID: aa6ef0778a1f1bde0d73efba72a777c48d2bd010 - -commit 01fb82eb2aa0a4eaf5c394ea8bb37ea4c26f8a3f -Author: jsg@openbsd.org <jsg@openbsd.org> -Date: Fri May 17 02:39:11 2024 +0000 - - upstream: spelling; ok djm@ - - OpenBSD-Commit-ID: bdea29bb3ed2a5a7782999c4c663b219d2270483 - -commit b88b690e99145a021fc1a1a116a11e0bce0594e7 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 17 01:45:22 2024 +0000 - - upstream: allow overriding the sshd-session binary path - - OpenBSD-Regress-ID: 5058cd1c4b6ca1a15474e33546142931d9f964da - -commit a68f80f2511f0e0c5cef737a8284cc2dfabad818 -Author: anton@openbsd.org <anton@openbsd.org> -Date: Wed Apr 3 06:01:11 2024 +0000 - - upstream: Since ssh-agent(1) is only readable by root by now, use - - ssh(1) while generating data in tests. - - OpenBSD-Regress-ID: 24eb40de2e6b0ace185caaba35e2d470331ffe68 - -commit 92e55890314ce2b0be21a43ebcbc043b4abc232f -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 17 01:17:40 2024 +0000 - - upstream: fix incorrect debug option name introduce in previous - - commit - - OpenBSD-Commit-ID: 66d69e22b1c072c694a7267c847f212284614ed3 - -commit 4ad72878af7b6ec28da6e230e36a91650ebe84c1 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Fri May 17 00:33:25 2024 +0000 - - upstream: construct and install a relink-kit for sshd-session ok - - djm - - OpenBSD-Commit-ID: 8b3820adb4da4e139c4b3cffbcc0bde9f08bf0c6 - -commit 02e679a2cb3f6df8e9dbb1519ed578226485157f -Author: Damien Miller <djm@mindrot.org> -Date: Fri May 17 12:21:27 2024 +1000 - - Makefile support for sshd-session - -commit c0416035c5eaf70a8450d11c8833c5f7068ee7ad -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 17 00:32:32 2024 +0000 - - upstream: missing files from previous - - OpenBSD-Commit-ID: 4b7be4434d8799f02365552b641a7a70a7ebeb2f - -commit 03e3de416ed7c34faeb692967737be4a7bbe2eb5 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri May 17 00:30:23 2024 +0000 - - upstream: Start the process of splitting sshd into separate - - binaries. This step splits sshd into a listener and a session binary. More - splits are planned. - - After this changes, the listener binary will validate the configuration, - load the hostkeys, listen on port 22 and manage MaxStartups only. All - session handling will be performed by a new sshd-session binary that the - listener fork+execs. - - This reduces the listener process to the minimum necessary and sets us - up for future work on the sshd-session binary. - - feedback/ok markus@ deraadt@ - - NB. if you're updating via source, please restart sshd after installing, - otherwise you run the risk of locking yourself out. - - OpenBSD-Commit-ID: 43c04a1ab96cdbdeb53d2df0125a6d42c5f19934 - -commit 1c0d81357921f8d3bab06841df649edac515ae5b -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu May 9 09:46:47 2024 +0000 - - upstream: simplify exit message handling, which was more complicated - - than it needed to be because of unexpunged ssh1 remnants. ok markus@ - - OpenBSD-Commit-ID: 8b0cd2c0dee75fb053718f442aa89510b684610b - -commit cbbbf76aa6cd54fce32eacce1300e7abcf9461d4 -Author: tobias@openbsd.org <tobias@openbsd.org> -Date: Mon May 6 19:26:17 2024 +0000 - - upstream: remove SSH1 leftovers - - Authored with Space Meyer <git at the-space dot agency> - - ok djm - - OpenBSD-Commit-ID: 81db602e4cb407baae472689db1c222ed7b2afa3 - -commit bc5dcb8ab9a4e8af54a724883732af378f42ea78 -Author: tobias@openbsd.org <tobias@openbsd.org> -Date: Tue Apr 30 15:40:43 2024 +0000 - - upstream: never close stdin - - The sanitise_stdfd call makes sure that standard file descriptors are - open (if they were closed, they are connected with /dev/null). - - Do not close stdin in any case to prevent error messages when stdin is - read multiple times and to prevent later usage of fd 0 for connections, - e.g. - - echo localhost | ssh-keyscan -f - -f - - - While at it, make stdin-related error messages nicer. - - Authored with Max Kunzelmann <maxdev at posteo dot de> - - ok djm - - OpenBSD-Commit-ID: 48e9b7938e2fa2f9bd47e6de6df66a31e0b375d3 - -commit 6a42b70e56bef1aacdcdf06352396e837883e84f -Author: Damien Miller <djm@mindrot.org> -Date: Wed May 8 09:43:59 2024 +1000 - - sync getrrsetbyname.c with recent upstream changes - -commit 385ecb31e147dfea59c1c488a1d2011d3867e60e -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Apr 30 06:23:51 2024 +0000 - - upstream: fix home-directory extension implementation, it always - - returned the current user's home directory contrary to the spec. - - Patch from Jakub Jelen via GHPR477 - - OpenBSD-Commit-ID: 5afd775eab7f9cbe222d7fbae4c793de6c3b3d28 - -commit 14e2b16bc67ffcc188906f65008667e22f73d103 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Apr 30 06:16:55 2024 +0000 - - upstream: flush stdout after writing "sftp>" prompt when not using - - editline. - - From Alpine Linux via GHPR480 - - OpenBSD-Commit-ID: 80bdc7ffe0358dc090eb9b93e6dedb2b087b24cd - -commit 2e69a724051488e3fb3cd11531c4b5bc1764945b -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Apr 30 05:53:03 2024 +0000 - - upstream: stricter validation of messaging socket fd number; disallow - - usage of stderr. Based on GHPR492 by RealHurrison - - OpenBSD-Commit-ID: 73dbbe82ea16f73ce1d044d3232bc869ae2f2ce8 - -commit da757b022bf18c6f7d04e685a10cd96ed00f83da -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Apr 30 05:45:56 2024 +0000 - - upstream: add missing reserved fields to key constraint protocol - - documentation. - - from Wiktor Kwapisiewicz via GHPR487 - - OpenBSD-Commit-ID: 0dfb69998cfdb3fa00cbb0e7809e7d2f6126e3df - -commit 16d0b82fa08038f35f1b3630c70116979f49784f -Author: Damien Miller <djm@mindrot.org> -Date: Tue Apr 30 12:39:34 2024 +1000 - - depend - -commit 66aaa678dbe59aa21d0d9d89a3596ecedde0254b -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Apr 30 02:14:10 2024 +0000 - - upstream: correctly restore sigprocmask around ppoll() reported - - by Tõivo Leedjärv; ok deraadt@ - - OpenBSD-Commit-ID: c0c0f89de5294a166578f071eade2501929c4686 - -commit 80fb0eb21551aed3aebb009ab20aeffeb01e44e0 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Tue Apr 30 02:10:49 2024 +0000 - - upstream: add explict check for server hostkey type against - - HostkeyAlgorithms. Allows HostkeyAlgorithms to disable implicit fallback from - certificate keys to plain keys. ok markus@ - - OpenBSD-Commit-ID: 364087e4a395ff9b2f42bf3aefdb2090bb23643a - -commit 5b28096d31ff7d80748fc845553a4aef5bb05d86 -Author: jsg@openbsd.org <jsg@openbsd.org> -Date: Tue Apr 23 13:34:50 2024 +0000 - - upstream: correct indentation; no functional change ok tb@ - - OpenBSD-Commit-ID: dd9702fd43de546bc6a3f4f025c74d6f3692a0d4 - -commit fd3cb8a82784e05f621dea5b56ac6f89bc53c067 -Author: semarie@openbsd.org <semarie@openbsd.org> -Date: Thu Apr 4 16:00:51 2024 +0000 - - upstream: set right mode on ssh-agent at boot-time - - which sthen@ - ok deraadt@ - - OpenBSD-Commit-ID: 662b5056a2c6171563e1626f9c69f27862b5e7af - -commit 54343a260e3aa4bceca1852dde31cd08e2abd82b -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Apr 2 12:22:38 2024 +0000 - - upstream: Oops, incorrect hex conversion spotted by claudio. - - While here try to improve how it reads a bit better. Surprising the - regression tests didn't spot this error, maybe it fails to roundtrip the - values. - - OpenBSD-Commit-ID: 866cfcc1955aef8f3fc32da0b70c353a1b859f2e - -commit ec78c31409590ad74efc194f886273ed080a545a -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Apr 2 10:02:08 2024 +0000 - - upstream: for parse_ipqos(), use strtonum() instead of mostly - - idiomatic strtoul(), but wow it's so gross. ok djm - - OpenBSD-Commit-ID: cec14a76af2eb7b225300c80fc0e21052be67b05 - -commit 8176e1a6c2e6da9361a7abb6fbf6c23c299f495b -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Apr 2 09:56:58 2024 +0000 - - upstream: can shortcut by returning strtonum() value directly; ok - - djm - - OpenBSD-Commit-ID: 7bb2dd3d6d1f288dac14247d1de446e3d7ba8b8e - -commit 9f543d7022a781f80bb696f9d73f1d1c6f9e31d6 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Apr 2 09:52:14 2024 +0000 - - upstream: rewrite convtime() to use a isdigit-scanner and - - strtonum() instead of strange strtoul can might be fooled by garage - characters. passes regress/usr.bin/ssh/unittests/misc ok djm - - OpenBSD-Commit-ID: 4b1ef826bb16047aea3f3bdcb385b72ffd450abc - -commit 8673137f780d8d9e4cda3c4605cb5d88d5cea271 -Author: claudio@openbsd.org <claudio@openbsd.org> -Date: Tue Apr 2 09:48:24 2024 +0000 - - upstream: Remove unused ptr[3] char array in pkcs11_decode_hex. - - OK deraadt@ - - OpenBSD-Commit-ID: 3d14433e39fd558f662d3b0431c4c555ef920481 - -commit c7fec708f331f108343d69e4d74c9a5d86d6cfe7 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Apr 2 09:32:28 2024 +0000 - - upstream: Replace non-idiomatic strtoul(, 16) to parse a region - - of 2-character hex sequences with a low-level replacement designed just for - the task. ok djm - - OpenBSD-Commit-ID: 67bab8b8a4329a19a0add5085eacd6f4cc215e85 - -commit 019a5f483b0f588da6270ec401d0b4bb35032f3f -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Tue Apr 2 09:29:31 2024 +0000 - - upstream: Use strtonum() instead of severely non-idomatic - - strtoul() In particular this will now reject trailing garbage, ie. - '12garbage'. ok djm - - OpenBSD-Commit-ID: c82d95e3ccbfedfc91a8041c2f8bf0cf987d1501 - -commit 8231ca046fa39ea4eb99b79e0a6e09dec50ac952 -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Mon Apr 1 15:50:17 2024 +0000 - - upstream: also create a relink kit for ssh-agent, since it is a - - long-running setgid program carrying keys with some (not very powerful) - communication channels. solution for testing the binary from dtucker. - agreement from djm. Will add it into /etc/rc in a few days. - - OpenBSD-Commit-ID: 2fe8d707ae35ba23c7916adcb818bb5b66837ba0 - -commit bf7bf50bd6a14e49c9c243cb8f4de31e555a5a2e -Author: deraadt@openbsd.org <deraadt@openbsd.org> -Date: Mon Apr 1 15:48:16 2024 +0000 - - upstream: new-style relink kit for sshd. The old scheme created - - a Makefile by concatenating two Makefiles and was incredibly fragile. In the - new way a narrow-purposed install.sh script is created and shipped with the - objects. A recently commited /etc/rc script understands these files. - - OpenBSD-Commit-ID: ef9341d5a50f0d33e3a6fbe995e92964bc7ef2d3 - -commit 00e63688920905e326d8667cb47f17a156b6dc8f -Author: renmingshuai <renmingshuai@huawei.com> -Date: Fri Apr 12 10:20:49 2024 +0800 - - Shell syntax fix (leftover from a sync). - - Signed-off-by: renmingshuai <renmingshuai@huawei.com> - -commit 2eded551ba96e66bc3afbbcc883812c2eac02bd7 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Apr 25 13:20:19 2024 +1000 - - Merge flags for OpenSSL 3.x versions. - - OpenSSL has moved to 3.4 which we don't currently accept. Based on - the OpenSSL versioning policy[0] it looks like all of the 3.x versions - should work with OpenSSH, so remove the distinction in configure and - accept all of them. - - [0] https://openssl.org/policies/general/versioning-policy.html - -commit 8673245918081c6d1dc7fb3733c8eb2c5a902c5e -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Apr 25 13:19:03 2024 +1000 - - Remove 9.6 branch from status page. - -commit 70d43049747fa3c66cf876d52271859407cec2fa -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Apr 25 13:16:58 2024 +1000 - - Update LibreSSL and OpenSSL versions tested. - - Update LibreSSL versions to current releases (3.8.4 & 3.9.1). - Add newly-released OpenSSL 3.3.0, and add tests against the 3.1 and - 3.3 branches. - -commit 88351eca17dcc55189991ba60e50819b6d4193c1 -Author: 90 <hi@90.gripe> -Date: Fri Apr 5 19:36:06 2024 +0100 - - Fix missing header for systemd notification - -commit 08f579231cd38a1c657aaa6ddeb8ab57a1fd4f5c -Author: Damien Miller <djm@mindrot.org> -Date: Wed Apr 3 14:40:32 2024 +1100 - - notify systemd on listen and reload - - Standalone implementation that does not depend on libsystemd. - With assistance from Luca Boccassi, and feedback/testing from Colin - Watson. bz2641 diff --git a/Makefile.in b/Makefile.in index 2aac879c1eaf..da59bcc100c7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -102,6 +102,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ smult_curve25519_ref.o \ poly1305.o chacha.o cipher-chachapoly.o cipher-chachapoly-libcrypto.o \ ssh-ed25519.o digest-openssl.o digest-libc.o \ + libcrux-mlkem-mldsa.o ssh-mldsa-eddsa.o \ hmac.o ed25519.o ed25519-openssl.o \ kex.o kex-names.o kexdh.o kexgex.o kexecdh.o kexc25519.o \ kexgexc.o kexgexs.o \ @@ -315,8 +316,12 @@ clean: regressclean rm -f regress/unittests/kex/test_kex$(EXEEXT) rm -f regress/unittests/match/*.o rm -f regress/unittests/match/test_match$(EXEEXT) + rm -f regress/unittests/crypto/*.o + rm -f regress/unittests/crypto/test_crypto$(EXEEXT) rm -f regress/unittests/misc/*.o rm -f regress/unittests/misc/test_misc$(EXEEXT) + rm -f regress/unittests/servconf/*.o + rm -f regress/unittests/servconf/test_servconf$(EXEEXT) rm -f regress/unittests/sshbuf/*.o rm -f regress/unittests/sshbuf/test_sshbuf$(EXEEXT) rm -f regress/unittests/sshkey/*.o @@ -354,8 +359,12 @@ distclean: regressclean rm -f regress/unittests/kex/test_kex rm -f regress/unittests/match/*.o rm -f regress/unittests/match/test_match + rm -f regress/unittests/crypto/*.o + rm -f regress/unittests/crypto/test_crypto rm -f regress/unittests/misc/*.o rm -f regress/unittests/misc/test_misc + rm -f regress/unittests/servconf/*.o + rm -f regress/unittests/servconf/test_servconf rm -f regress/unittests/sshbuf/*.o rm -f regress/unittests/sshbuf/test_sshbuf rm -f regress/unittests/sshkey/*.o @@ -538,7 +547,9 @@ regress-prep: $(MKDIR_P) `pwd`/regress/unittests/hostkeys $(MKDIR_P) `pwd`/regress/unittests/kex $(MKDIR_P) `pwd`/regress/unittests/match + $(MKDIR_P) `pwd`/regress/unittests/crypto $(MKDIR_P) `pwd`/regress/unittests/misc + $(MKDIR_P) `pwd`/regress/unittests/servconf $(MKDIR_P) `pwd`/regress/unittests/sshbuf $(MKDIR_P) `pwd`/regress/unittests/sshkey $(MKDIR_P) `pwd`/regress/unittests/sshsig @@ -689,6 +700,21 @@ regress/unittests/match/test_match$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a \ -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) +UNITTESTS_TEST_CRYPTO_OBJS=\ + regress/unittests/crypto/test_ed25519.o \ + regress/unittests/crypto/test_mldsa.o \ + regress/unittests/crypto/test_mldsa_eddsa.o \ + regress/unittests/crypto/test_mlkem.o \ + regress/unittests/crypto/tests.o \ + $(P11OBJS) $(SKOBJS) + +regress/unittests/crypto/test_crypto$(EXEEXT): \ + ${UNITTESTS_TEST_CRYPTO_OBJS} \ + regress/unittests/test_helper/libtest_helper.a libssh.a + $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_CRYPTO_OBJS) \ + regress/unittests/test_helper/libtest_helper.a \ + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) + UNITTESTS_TEST_MISC_OBJS=\ regress/unittests/misc/tests.o \ regress/unittests/misc/test_parse.o \ @@ -708,6 +734,19 @@ regress/unittests/misc/test_misc$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a \ -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) +UNITTESTS_TEST_SERVCONF_OBJS=\ + regress/unittests/servconf/tests.o \ + servconf.o \ + groupaccess.o \ + $(P11OBJS) $(SKOBJS) + +regress/unittests/servconf/test_servconf$(EXEEXT): \ + ${UNITTESTS_TEST_SERVCONF_OBJS} \ + regress/unittests/test_helper/libtest_helper.a libssh.a + $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_SERVCONF_OBJS) \ + regress/unittests/test_helper/libtest_helper.a \ + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) + UNITTESTS_TEST_UTF8_OBJS=\ regress/unittests/utf8/tests.o @@ -759,7 +798,9 @@ regress-unit-binaries: regress-prep $(REGRESSLIBS) \ regress/unittests/hostkeys/test_hostkeys$(EXEEXT) \ regress/unittests/kex/test_kex$(EXEEXT) \ regress/unittests/match/test_match$(EXEEXT) \ + regress/unittests/crypto/test_crypto$(EXEEXT) \ regress/unittests/misc/test_misc$(EXEEXT) \ + regress/unittests/servconf/test_servconf$(EXEEXT) \ regress/unittests/sshbuf/test_sshbuf$(EXEEXT) \ regress/unittests/sshkey/test_sshkey$(EXEEXT) \ regress/unittests/sshsig/test_sshsig$(EXEEXT) \ @@ -787,6 +828,7 @@ TEST_SSH_SSHD="$(BUILDDIR)/sshd" interop-tests t-exec file-tests extra-tests: regress-prep regress-binaries $(TARGETS) cd $(srcdir)/regress || exit $$?; \ + AWK='@AWK@' \ EGREP='@EGREP@' \ OPENSSL_BIN='@OPENSSL_BIN@' \ $(MAKE) \ diff --git a/PROTOCOL.agent b/PROTOCOL.agent index 2af749b30b7b..6dc75c05e47b 100644 --- a/PROTOCOL.agent +++ b/PROTOCOL.agent @@ -1,5 +1,5 @@ The SSH agent protocol is described in -https://datatracker.ietf.org/doc/draft-ietf-sshm-ssh-agent/ +https://datatracker.ietf.org/doc/html/rfc9987 This file documents OpenSSH's extensions to the agent protocol. @@ -104,4 +104,4 @@ A SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED will return SSH_AGENT_SUCCESS if any key (plain private or certificate) was successfully loaded, or SSH_AGENT_FAILURE if no key was loaded. -$OpenBSD: PROTOCOL.agent,v 1.25 2025/08/29 03:50:38 djm Exp $ +$OpenBSD: PROTOCOL.agent,v 1.26 2026/06/02 06:18:27 djm Exp $ @@ -1,4 +1,4 @@ -See https://www.openssh.com/releasenotes.html#10.3p1 for the release +See https://www.openssh.com/releasenotes.html for the release notes. Please read https://www.openssh.com/report.html for bug reporting diff --git a/README.privsep b/README.privsep index d658c46db11e..27995d9a1875 100644 --- a/README.privsep +++ b/README.privsep @@ -1,15 +1,138 @@ -Privilege separation, or privsep, is method in OpenSSH by which +Privilege separation, or privsep, is a method in OpenSSH by which operations that require root privilege are performed by a separate -privileged monitor process. Its purpose is to prevent privilege -escalation by containing corruption to an unprivileged process. -More information is available at: - http://www.citi.umich.edu/u/provos/ssh/privsep.html +privileged monitor process. Its purpose is to prevent privilege +escalation and mitigate attacks by: -Privilege separation is now mandatory. During the pre-authentication -phase sshd will chroot(2) to "/var/empty" and change its privileges to the -"sshd" user and its primary group. sshd is a pseudo-account that should -not be used by other daemons, and must be locked and should contain a -"nologin" or invalid shell. + - reducing the privileged attack surface by performing most + operations involving untrusted data in unprivileged code, + - facilitating OS-level sandboxing of the components that are most + exposed to attack, + - reducing information-sharing between privileged and + unprivileged code, and + - containing attacks as much as possible to the unprivileged + process, should they occur. + +To achieve privilege separation in OpenSSH's sshd, the functions +it performs are split across three discrete binaries: + +sshd is the main entry-point binary for the server. This binary +retains privilege but performs a very limited set of tasks: loading +and checking the configuration, listening for incoming connections +and monitoring the status of connections through the +pre-authentication phase of their lifecycle to implement the +MaxStartups and PerSourcePenalties features. + +Apart from listening for and accepting connections, the sshd binary +does not handle untrusted, network-derived data; instead it forks and +executes the sshd-session binary for each new connection. + ++---------------------------------------------------------------+ +| | +| listening socket +-------------------+ | +| \--------------+ sshd (listener) | | +| +--------++---------+ | +| || | +| || fork+exec | +| || | +| +--------------++------------------+ | +| | sshd-session (preauth monitor) | | +| +--------------++------------------+ | +| || | +| || fork+exec | +| || | +| network socket +------------++--------------+ | +| \-----------+ sshd-auth (unprivileged) | | +| +------------++--------------+ | +| | ++---------------------------------------------------------------+ + pre-authentication process structure + +sshd-session initially acts as the privileged monitor process for +a connection before it completes authentication. During this phase, +it does not deal directly with network-derived data, but forks and +executes a third binary (sshd-auth, described next) to handle the +SSH protocol communication over the network socket. sshd-session +receives RPC messages from the sshd-auth subprocess when it needs +to perform privileged operations, such as verifying an account's +existence, signing with a host key, or checking a user's password. +The monitor process implements a loose state machine that enforces +the required structure and order of operations that sshd-auth may +request. + +sshd-auth is the network-facing process that implements the initial +key agreement and authentication phase of the SSH protocol. It is +started with privilege, but will sandbox and/or chroot(2) itself +and drop privilege to an unprivileged account before processing +any network traffic. All operations that require privilege, such as +looking up user information, private key signatures, checking +passwords, etc are performed by RPC to the parent sshd-session +process. After authentication completes, sshd-auth serialises its +SSH protocol and connection state, exports this to the parent +sshd-session process and exits. + +Communication between parent and child processes occurs over shared +file descriptors. Parent processes also monitor their children for +abnormal exit conditions, such as crashes or signalling via exit(3) +status. These conditions are used in sshd to implement the +PerSourcePenalties controls. + ++---------------------------------------------------------------+ +| | +| +---------------++------------------+ | +| | sshd-session (postauth monitor) | | +| +---------------++------------------+ | +| || | +| || fork | +| || | +| network socket +--------------++---------------+ | +| \-----------+ sshd-session (unprivileged) | | +| +--------------++---------------+ | +| | ++---------------------------------------------------------------+ + post-authentication process structure + +After authentication, sshd-session disconnects from its parent +listener sshd (which doesn't track connections after authentication +has succeeded) and forks again. The forked sshd-session child process +will drop privilege to that of the authenticated user, import the +previously-serialised connection state from sshd-auth and continue to +perform network and SSH protocol operations for the remainder of the +session. + +The parent sshd-session process continues to act as a privileged +monitor process, performing actions that require privilege when +requested via RPC. These operations include allocating PTYs and +signing key re-exchange messages. + +In portable OpenSSH several compile-time options affect privilege +separation: + + --with-sandbox=style + +Controls the sandboxing implementation used by sshd-auth. OS level +sandboxing is supported on a number of platforms. A fallback +rlimit(2)-based sandbox provides some basic control on a wider set +of platforms. Most supported sandboxes are detected and enabled +automatically, so this option is mostly used to disable the sandbox +(this is handy when debugging or running under tools like +AddressSanitizer). + + --with-privsep-user=user + +Specifies the unprivileged user that sshd-auth will switch to +before it starts handling untrusted data. This user must not be +shared with any other system service, should own no files, should +have a locked password, a shell that denies access (such as +/bin/nologin or /bin/false) and the home directory set to the +privilege separation path. For most platforms the default user is +"sshd". + + --with-privsep-path=/path + +Controls the directory that sshd-auth will chroot(2) to before +dropping privileges. This directory should be empty, not shared +with other system accounts and not readable or writable by the +sandbox user. The default privsep path is "/var/empty". You should do something like the following to prepare the privsep preauth environment: @@ -20,32 +143,31 @@ preauth environment: # groupadd sshd # useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd -/var/empty should not contain any files. +On some platforms, only the pre-authentication part of privsep is +supported, and the post-authentication part is disabled due to lack +of support from the operating system. -configure supports the following options to change the default -privsep user and chroot directory: +This is an example process list for a connection in the +pre-authentication phase: - --with-privsep-path=xxx Path for privilege separation chroot - --with-privsep-user=user Specify non-privileged user for privilege separation + PID PPID UID CMD -PAM-enabled OpenSSH is known to function with privsep on AIX, FreeBSD, -HP-UX (including Trusted Mode), Linux, NetBSD and Solaris. + 1436 1 0 sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups + 47077 1436 0 sshd-session: djm [priv] + 47078 47077 107 sshd-auth: djm [net] -On Cygwin, Tru64 Unix and OpenServer only the pre-authentication part -of privsep is supported. Post-authentication privsep is disabled -automatically (so you won't see the additional process mentioned below). +Where process 1436 is the listener, 47077 is the privileged +sshd-session monitor process and 47078 is the unprivileged, +network-facing sshd-auth process. -Note that for a normal interactive login with a shell, enabling privsep -will require 1 additional process per login session. +And in the post-authentication phase: -Given the following process listing (from HP-UX): + PID PPID UID CMD + 47077 1436 0 sshd-session: djm [priv] + 47091 47077 1000 sshd-session: djm@pts/1 + 47092 47091 1000 -bash - UID PID PPID C STIME TTY TIME COMMAND - root 1005 1 0 10:45:17 ? 0:08 /opt/openssh/sbin/sshd -u0 - root 6917 1005 0 15:19:16 ? 0:00 sshd: stevesk [priv] - stevesk 6919 6917 0 15:19:17 ? 0:03 sshd: stevesk@2 - stevesk 6921 6919 0 15:19:17 pts/2 0:00 -bash +Where process 47077 continues its role as a privileged monitor, +47091 is the user-privileged network-facing post-authentication +process and 47092 is the user shell started for the session. -process 1005 is the sshd process listening for new connections. -process 6917 is the privileged monitor process, 6919 is the user owned -sshd process and 6921 is the shell process. @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.h,v 1.109 2026/02/06 01:24:36 djm Exp $ */ +/* $OpenBSD: auth.h,v 1.110 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -175,6 +175,7 @@ void auth_log(struct ssh *, int, int, const char *, const char *); void auth_maxtries_exceeded(struct ssh *) __attribute__((noreturn)); void userauth_finish(struct ssh *, int, const char *, const char *); int auth_root_allowed(struct ssh *, const char *); +void auth_failure_delay(Authctxt *, double); char *auth2_read_banner(void); int auth2_methods_valid(const char *, int); diff --git a/auth2-chall.c b/auth2-chall.c index f3889079b64f..8a23ca2dca2a 100644 --- a/auth2-chall.c +++ b/auth2-chall.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-chall.c,v 1.60 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: auth2-chall.c,v 1.61 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * Copyright (c) 2001 Per Allansson. All rights reserved. @@ -300,6 +300,7 @@ input_userauth_info_response(int type, uint32_t seq, struct ssh *ssh) u_int i, nresp; const char *devicename = NULL; char **response = NULL; + double tstart = monotime_double(); if (authctxt == NULL) fatal_f("no authctxt"); @@ -358,6 +359,9 @@ input_userauth_info_response(int type, uint32_t seq, struct ssh *ssh) auth2_challenge_start(ssh); } } + + if (!authenticated) + auth_failure_delay(authctxt, tstart); userauth_finish(ssh, authenticated, "keyboard-interactive", devicename); return 0; diff --git a/auth2-gss.c b/auth2-gss.c index 0535485277a6..85251b7d0b57 100644 --- a/auth2-gss.c +++ b/auth2-gss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-gss.c,v 1.39 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: auth2-gss.c,v 1.41 2026/07/06 07:53:30 djm Exp $ */ /* * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved. @@ -111,12 +111,6 @@ userauth_gssapi(struct ssh *ssh, const char *method) return (0); } - if (!authctxt->valid || authctxt->user == NULL) { - debug2_f("disabled because of invalid user"); - free(doid); - return (0); - } - if (GSS_ERROR(mm_ssh_gssapi_server_ctx(&ctxt, &goid))) { if (ctxt != NULL) ssh_gssapi_delete_ctx(&ctxt); @@ -178,8 +172,14 @@ input_gssapi_token(int type, uint32_t plen, struct ssh *ssh) (r = sshpkt_send(ssh)) != 0) fatal_fr(r, "send ERRTOK packet"); } + logit("Failed gssapi-with-mic for %s%.100s " + "from %.200s port %d ssh2", + authctxt->valid ? "" : "invalid user ", + authctxt->user, + ssh_remote_ipaddr(ssh), ssh_remote_port(ssh)); authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); + ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL); userauth_finish(ssh, 0, "gssapi-with-mic", NULL); } else { if (send_tok.length != 0) { @@ -191,14 +191,18 @@ input_gssapi_token(int type, uint32_t plen, struct ssh *ssh) fatal_fr(r, "send TOKEN packet"); } if (maj_status == GSS_S_COMPLETE) { - ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); - if (flags & GSS_C_INTEG_FLAG) - ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC, + ssh_dispatch_set(ssh, + SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); + /* note: keep ERRTOK handler as per RFC 4462 s3.4 */ + if (flags & GSS_C_INTEG_FLAG) { + ssh_dispatch_set(ssh, + SSH2_MSG_USERAUTH_GSSAPI_MIC, &input_gssapi_mic); - else + } else { ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, &input_gssapi_exchange_complete); + } } } @@ -210,10 +214,6 @@ static int input_gssapi_errtok(int type, uint32_t plen, struct ssh *ssh) { Authctxt *authctxt = ssh->authctxt; - Gssctxt *gssctxt; - gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER; - gss_buffer_desc recv_tok; - OM_uint32 maj_status; int r; u_char *p; size_t len; @@ -221,26 +221,21 @@ input_gssapi_errtok(int type, uint32_t plen, struct ssh *ssh) if (authctxt == NULL) fatal("No authentication or GSSAPI context"); - gssctxt = authctxt->methoddata; - if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 || + /* Minimal error handling - just cancel auth and return FAILURE */ + if ((r = sshpkt_get_string_direct(ssh, NULL, NULL)) != 0 || (r = sshpkt_get_end(ssh)) != 0) fatal_fr(r, "parse packet"); - recv_tok.value = p; - recv_tok.length = len; - - /* Push the error token into GSSAPI to see what it says */ - maj_status = mm_ssh_gssapi_accept_ctx(gssctxt, &recv_tok, - &send_tok, NULL); - free(recv_tok.value); - - /* We can't return anything to the client, even if we wanted to */ + logit("Failed gssapi-with-mic for %s%.100s from %.200s port %d ssh2", + authctxt->valid ? "" : "invalid user ", + authctxt->user, + ssh_remote_ipaddr(ssh), ssh_remote_port(ssh)); + authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL); - - /* The client will have already moved on to the next auth */ - - gss_release_buffer(&maj_status, &send_tok); + ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL); + ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL); + userauth_finish(ssh, 0, "gssapi-with-mic", NULL); return 0; } @@ -255,6 +250,7 @@ input_gssapi_exchange_complete(int type, uint32_t plen, struct ssh *ssh) { Authctxt *authctxt = ssh->authctxt; int r, authenticated; + double tstart = monotime_double(); if (authctxt == NULL) fatal("No authentication or GSSAPI context"); @@ -268,6 +264,8 @@ input_gssapi_exchange_complete(int type, uint32_t plen, struct ssh *ssh) fatal_fr(r, "parse packet"); authenticated = mm_ssh_gssapi_userok(authctxt->user); + if (!authenticated) + auth_failure_delay(authctxt, tstart); authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); @@ -288,6 +286,7 @@ input_gssapi_mic(int type, uint32_t plen, struct ssh *ssh) gss_buffer_desc mic, gssbuf; u_char *p; size_t len; + double tstart = monotime_double(); if (authctxt == NULL) fatal("No authentication or GSSAPI context"); @@ -315,6 +314,9 @@ input_gssapi_mic(int type, uint32_t plen, struct ssh *ssh) sshbuf_free(b); free(mic.value); + if (!authenticated) + auth_failure_delay(authctxt, tstart); + authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL); @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2.c,v 1.173 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: auth2.c,v 1.174 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -265,6 +265,12 @@ ensure_minimum_time_since(double start, double seconds) nanosleep(&ts, NULL); } +void +auth_failure_delay(Authctxt *authctxt, double tstart) +{ + ensure_minimum_time_since(tstart, user_specific_delay(authctxt->user)); +} + static int input_userauth_request(int type, uint32_t seq, struct ssh *ssh) { @@ -346,8 +352,8 @@ input_userauth_request(int type, uint32_t seq, struct ssh *ssh) authenticated = m->userauth(ssh, method); } if (!authctxt->authenticated && strcmp(method, "none") != 0) - ensure_minimum_time_since(tstart, - user_specific_delay(authctxt->user)); + auth_failure_delay(authctxt, tstart); + userauth_finish(ssh, authenticated, method, NULL); r = 0; out: @@ -1,4 +1,4 @@ -/* $OpenBSD: authfd.c,v 1.141 2026/03/05 05:44:15 djm Exp $ */ +/* $OpenBSD: authfd.c,v 1.144 2026/06/29 08:57:06 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -205,7 +205,7 @@ ssh_request_reply_decode(int sock, struct sshbuf *request) void ssh_close_authentication_socket(int sock) { - if (getenv(SSH_AUTHSOCKET_ENV_NAME)) + if (sock != -1 && getenv(SSH_AUTHSOCKET_ENV_NAME) != NULL) close(sock); } @@ -608,6 +608,8 @@ ssh_add_identity_constrained(int sock, struct sshkey *key, #endif case KEY_ED25519: case KEY_ED25519_CERT: + case KEY_MLDSA44_ED25519: + case KEY_MLDSA44_ED25519_CERT: case KEY_ED25519_SK: case KEY_ED25519_SK_CERT: type = constrained ? @@ -803,7 +805,7 @@ ssh_agent_query_extensions(int sock, char ***exts) r = SSH_ERR_INVALID_FORMAT; goto out; } - ret = calloc(1, sizeof(*ret)); + ret = xcalloc(1, sizeof(*ret)); while (sshbuf_len(msg)) { ret = xrecallocarray(ret, i + 1, i + 2, sizeof(*ret)); if ((r = sshbuf_get_cstring(msg, ret + i, NULL)) != 0) { diff --git a/authfile.c b/authfile.c index 5fc2ec470057..954f78c001b7 100644 --- a/authfile.c +++ b/authfile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfile.c,v 1.149 2026/02/14 00:18:34 jsg Exp $ */ +/* $OpenBSD: authfile.c,v 1.151 2026/06/29 09:14:25 djm Exp $ */ /* * Copyright (c) 2000, 2013 Markus Friedl. All rights reserved. * @@ -197,6 +197,7 @@ sshkey_try_load_public(struct sshkey **kp, const char *filename, char *line = NULL, *cp; size_t linesize = 0; int r; + struct stat st; struct sshkey *k = NULL; if (kp == NULL) @@ -206,6 +207,11 @@ sshkey_try_load_public(struct sshkey **kp, const char *filename, *commentp = NULL; if ((f = fopen(filename, "r")) == NULL) return SSH_ERR_SYSTEM_ERROR; + if (stat(filename, &st) == 0 && S_ISREG(st.st_mode) && + st.st_size > SSHBUF_SIZE_MAX) { + fclose(f); + return SSH_ERR_INVALID_FORMAT; + } if ((k = sshkey_new(KEY_UNSPEC)) == NULL) { fclose(f); return SSH_ERR_ALLOC_FAIL; @@ -321,6 +327,7 @@ sshkey_load_private_cert(int type, const char *filename, const char *passphrase, case KEY_ECDSA: #endif /* WITH_OPENSSL */ case KEY_ED25519: + case KEY_MLDSA44_ED25519: case KEY_UNSPEC: break; default: @@ -1,4 +1,4 @@ -/* $OpenBSD: chacha.c,v 1.2 2023/07/17 05:26:38 djm Exp $ */ +/* $OpenBSD: chacha.c,v 1.3 2026/05/18 04:14:57 tb Exp $ */ /* chacha-merged.c version 20080118 D. J. Bernstein @@ -48,8 +48,8 @@ typedef struct chacha_ctx chacha_ctx; a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \ c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); -static const char __attribute__ ((__nonstring__)) sigma[16] = "expand 32-byte k"; -static const char __attribute__ ((__nonstring__)) tau[16] = "expand 16-byte k"; +static const char sigma[] = "expand 32-byte k"; +static const char tau[] = "expand 16-byte k"; void chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits) diff --git a/channels.c b/channels.c index d7c55fc899d4..fcd80288f89b 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.458 2026/03/28 05:16:18 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.463 2026/06/24 11:59:09 dtucker Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -359,16 +359,20 @@ channel_classify(struct ssh *ssh, Channel *c) { struct ssh_channels *sc = ssh->chanctxt; const char *type = c->xctype == NULL ? c->ctype : c->xctype; - const char *classifier = (c->isatty || c->remote_has_tty) ? + const int has_tty = c->isatty || c->remote_has_tty; + const char *classifier = has_tty ? sc->bulk_classifier_tty : sc->bulk_classifier_notty; c->bulk = type != NULL && match_pattern_list(type, classifier, 0) == 1; + debug3("channel %d: classify type \"%s\" (%s) as %s", c->self, + type ? type : "(null)", has_tty ? "with TTY" : "no TTY", + c->bulk ? "bulk" : "interactive"); } /* * Sets "extended type" of a channel; used by session layer to add additional * information about channel types (e.g. shell, login, subsystem) that can then - * be used to select timeouts. + * be used to select timeouts and DSCP values. * Will reset c->inactive_deadline as a side-effect. */ void @@ -1376,6 +1380,11 @@ x11_open_helper(struct ssh *ssh, struct sshbuf *b) u_char *ucp; u_int proto_len, data_len; + if (sc->x11_saved_proto == NULL) { + error("X11 forwarding opened before X11 forwarding requested"); + return -1; + } + /* Is this being called after the refusal deadline? */ if (sc->x11_refuse_time != 0 && monotime() >= sc->x11_refuse_time) { @@ -2858,7 +2867,7 @@ channel_prepare_pollfd(Channel *c, u_int *next_pollfd, if (ev != 0) { c->pfds[3] = p; pfd[p].fd = c->sock; - pfd[p].events = 0; + pfd[p].events = ev; dump_channel_poll(__func__, "sock", c, p, &pfd[p]); p++; } diff --git a/channels.h b/channels.h index 2fcf9f8cb72b..f690964985c8 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.164 2026/03/05 05:40:35 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.167 2026/06/24 06:53:11 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -84,7 +84,8 @@ /* default pattern-lists used to classify channel types as bulk */ #define CHANNEL_BULK_TTY "" -#define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,tun-*,x11-*,session*" +#define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,dynamic-*," \ + "tun-*,x11-*,session*,stdio-forward" struct ssh; struct Channel; @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.c,v 1.126 2026/02/14 00:18:34 jsg Exp $ */ +/* $OpenBSD: cipher.c,v 1.129 2026/06/19 05:26:04 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -184,6 +184,12 @@ cipher_is_cbc(const struct sshcipher *c) } u_int +cipher_is_internal(const struct sshcipher *c) +{ + return (c->flags & CFLAG_INTERNAL) != 0; +} + +u_int cipher_ctx_is_plaintext(struct sshcipher_ctx *cc) { return cc->plaintext; @@ -206,6 +212,7 @@ ciphers_valid(const char *names) const struct sshcipher *c; char *cipher_list, *cp; char *p; + int found = 0; if (names == NULL || strcmp(names, "") == 0) return 0; @@ -217,10 +224,11 @@ ciphers_valid(const char *names) if (c == NULL || (c->flags & CFLAG_INTERNAL) != 0) { free(cipher_list); return 0; - } + } else + found = 1; } free(cipher_list); - return 1; + return found; } const char * @@ -463,33 +471,3 @@ cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, size_t len) #endif return 0; } - -int -cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv, size_t len) -{ -#ifdef WITH_OPENSSL - const struct sshcipher *c = cc->cipher; - int evplen = 0; -#endif - - if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0) - return 0; - if ((cc->cipher->flags & CFLAG_NONE) != 0) - return 0; - -#ifdef WITH_OPENSSL - evplen = EVP_CIPHER_CTX_iv_length(cc->evp); - if (evplen <= 0) - return SSH_ERR_LIBCRYPTO_ERROR; - if ((size_t)evplen != len) - return SSH_ERR_INVALID_ARGUMENT; - if (cipher_authlen(c)) { - /* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */ - if (EVP_CIPHER_CTX_ctrl(cc->evp, - EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv) <= 0) - return SSH_ERR_LIBCRYPTO_ERROR; - } else if (!EVP_CIPHER_CTX_set_iv(cc->evp, iv, evplen)) - return SSH_ERR_LIBCRYPTO_ERROR; -#endif - return 0; -} @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.h,v 1.56 2023/10/10 06:49:54 tb Exp $ */ +/* $OpenBSD: cipher.h,v 1.58 2026/06/19 05:26:04 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -68,10 +68,10 @@ u_int cipher_seclen(const struct sshcipher *); u_int cipher_authlen(const struct sshcipher *); u_int cipher_ivlen(const struct sshcipher *); u_int cipher_is_cbc(const struct sshcipher *); +u_int cipher_is_internal(const struct sshcipher *); u_int cipher_ctx_is_plaintext(struct sshcipher_ctx *); int cipher_get_keyiv(struct sshcipher_ctx *, u_char *, size_t); -int cipher_set_keyiv(struct sshcipher_ctx *, const u_char *, size_t); #endif /* CIPHER_H */ diff --git a/clientloop.c b/clientloop.c index 6a0e7b6b8234..49950ceccfe0 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.422 2026/03/05 05:40:35 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.425 2026/07/01 01:08:51 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -107,6 +107,8 @@ /* Uncertainty (in percent) of keystroke timing intervals */ #define SSH_KEYSTROKE_TIMING_FUZZ 10 +extern char *__progname; + /* import options */ extern Options options; @@ -1594,8 +1596,12 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg, if (sigprocmask(SIG_BLOCK, &bsigset, &osigset) == -1) error_f("bsigset sigprocmask: %s", strerror(errno)); if (siginfo_received) { + char ident[256]; + + sshpkt_fmt_connection_id(ssh, ident, sizeof(ident)); + logit("%s: connection to %s, up %.1f seconds", + __progname, ident, monotime_double() - start_time); siginfo_received = 0; - channel_report_open(ssh, SYSLOG_LEVEL_INFO); } if (quit_pending) break; @@ -2711,7 +2717,7 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, { size_t i, j, len; int matched, r; - char *name, *val; + char *type = NULL, *cmdstring = NULL, *name, *val; Channel *c = NULL; debug2_f("id %d", id); @@ -2786,19 +2792,21 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, len = sshbuf_len(cmd); if (len > 0) { + if ((cmdstring = sshbuf_dup_string(cmd)) == NULL) + fatal_f("sshbuf_dup_string failed"); if (len > 900) len = 900; if (want_subsystem) { - debug("Sending subsystem: %.*s", - (int)len, (const u_char*)sshbuf_ptr(cmd)); + debug("Sending subsystem: %.*s", (int)len, cmdstring); channel_request_start(ssh, id, "subsystem", 1); client_expect_confirm(ssh, id, "subsystem", CONFIRM_CLOSE); + xasprintf(&type, "session:subsystem:%s", cmdstring); } else { - debug("Sending command: %.*s", - (int)len, (const u_char*)sshbuf_ptr(cmd)); + debug("Sending command: %.*s", (int)len, cmdstring); channel_request_start(ssh, id, "exec", 1); client_expect_confirm(ssh, id, "exec", CONFIRM_CLOSE); + xasprintf(&type, "session:command"); } if ((r = sshpkt_put_stringb(ssh, cmd)) != 0 || (r = sshpkt_send(ssh)) != 0) @@ -2808,7 +2816,11 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, client_expect_confirm(ssh, id, "shell", CONFIRM_CLOSE); if ((r = sshpkt_send(ssh)) != 0) fatal_fr(r, "send shell"); + xasprintf(&type, "session:shell"); } + channel_set_xtype(ssh, id, type); + free(cmdstring); + free(type); session_setup_complete = 1; client_repledge(); diff --git a/config.h.in b/config.h.in index 4c12a6c0dc59..009b53c649cf 100644 --- a/config.h.in +++ b/config.h.in @@ -366,6 +366,10 @@ don't. */ #undef HAVE_DECL_HOWMANY +/* Define to 1 if you have the declaration of `htobe32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE32 + /* Define to 1 if you have the declaration of `htole64', and to 0 if you don't. */ #undef HAVE_DECL_HTOLE64 @@ -1055,6 +1059,12 @@ /* Define to 1 if you have the `openpty' function. */ #undef HAVE_OPENPTY +/* Define to 1 if you have the <openssl/configuration.h> header file. */ +#undef HAVE_OPENSSL_CONFIGURATION_H + +/* Define to 1 if you have the <openssl/opensslconf.h> header file. */ +#undef HAVE_OPENSSL_OPENSSLCONF_H + /* Define to 1 if you have the `OpenSSL_version' function. */ #undef HAVE_OPENSSL_VERSION @@ -1822,9 +1832,6 @@ /* libcrypto has NID_secp521r1 */ #undef OPENSSL_HAS_NISTP521 -/* libcrypto is missing AES 192 and 256 bit functions */ -#undef OPENSSL_LOBOTOMISED_AES - /* Define if you want the OpenSSL internally seeded PRNG only */ #undef OPENSSL_PRNG_ONLY diff --git a/configure b/configure index e2174fc0ff1f..9d19f474c9f0 100755 --- a/configure +++ b/configure @@ -5225,8 +5225,10 @@ printf "%s\n" "no" >&6; } fi -# Extract the first word of "nroff awf", so it can be a program name with args. -set dummy nroff awf; ac_word=$2 +for ac_prog in nroff awf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_NROFF+y} @@ -5270,6 +5272,9 @@ printf "%s\n" "no" >&6; } fi + test -n "$NROFF" && break +done + # Extract the first word of "mandoc", so it can be a program name with args. set dummy mandoc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -11570,6 +11575,25 @@ else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_HTOLE64 $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "htobe32" "ac_cv_have_decl_htobe32" " +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_ENDIAN_H +# include <endian.h> +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_htobe32" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_HTOBE32 $ac_have_decl" >>confdefs.h # On some platforms (eg SunOS4) sys/audit.h requires sys/[time|types|label.h] @@ -19568,7 +19592,7 @@ printf %s "checking if programs using OpenSSL functions will link... " >&6; } int main (void) { - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); ; return 0; } @@ -19592,7 +19616,7 @@ printf %s "checking if programs using OpenSSL need -ldl... " >&6; } int main (void) { - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); ; return 0; } @@ -19751,19 +19775,42 @@ fi if test "x$openssl_engine" = "xyes" ; then + ac_fn_c_check_header_compile "$LINENO" "openssl/opensslconf.h" "ac_cv_header_openssl_opensslconf_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_opensslconf_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_OPENSSLCONF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "openssl/configuration.h" "ac_cv_header_openssl_configuration_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_configuration_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_CONFIGURATION_H 1" >>confdefs.h + +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL ENGINE support" >&5 printf %s "checking for OpenSSL ENGINE support... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #ifdef HAVE_OPENSSL_OPENSSLCONF_H + # include <openssl/opensslconf.h> + #endif + #ifdef HAVE_OPENSSL_CONFIGURATION_H + # include <openssl/configuration.h> + #endif #include <openssl/engine.h> int main (void) { + #ifndef OPENSSL_NO_ENGINE ENGINE_load_builtin_engines(); ENGINE_register_all_complete(); + #else + #error "OPENSSL_NO_ENGINE" + #endif ; return 0; @@ -19784,45 +19831,6 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - # Check for OpenSSL without EVP_aes_{192,256}_cbc - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL lacks support for AES 192/256" >&5 -printf %s "checking whether OpenSSL lacks support for AES 192/256... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include <stdlib.h> - #include <string.h> - #include <openssl/evp.h> - -int -main (void) -{ - - exit(EVP_aes_192_cbc() == NULL || EVP_aes_256_cbc() == NULL); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - -else $as_nop - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - -printf "%s\n" "#define OPENSSL_LOBOTOMISED_AES 1" >>confdefs.h - - - -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if EVP_DigestUpdate returns an int" >&5 printf %s "checking if EVP_DigestUpdate returns an int... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext diff --git a/configure.ac b/configure.ac index a8e9df66bddc..a4d544cc58a4 100644 --- a/configure.ac +++ b/configure.ac @@ -60,7 +60,7 @@ AC_PATH_PROG([SH], [bash]) AC_PATH_PROG([SH], [ksh]) AC_PATH_PROG([SH], [sh]) AC_PATH_PROG([GROFF], [groff]) -AC_PATH_PROG([NROFF], [nroff awf]) +AC_PATH_PROGS([NROFF], [nroff awf]) AC_PATH_PROG([MANDOC], [mandoc]) AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no]) AC_SUBST([TEST_SHELL], [sh]) @@ -588,7 +588,7 @@ for include in sys/queue.h sys/tree.h; do esac >"$header" done -AC_CHECK_DECLS([le32toh, le64toh, htole64], [], [], [ +AC_CHECK_DECLS([le32toh, le64toh, htole64, htobe32], [], [], [ #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif @@ -3189,7 +3189,7 @@ if test "x$openssl" = "xyes" ; then AC_MSG_CHECKING([if programs using OpenSSL functions will link]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include <openssl/err.h> ]], - [[ ERR_load_crypto_strings(); ]])], + [[ OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); ]])], [ AC_MSG_RESULT([yes]) ], @@ -3199,7 +3199,7 @@ if test "x$openssl" = "xyes" ; then AC_MSG_CHECKING([if programs using OpenSSL need -ldl]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include <openssl/err.h> ]], - [[ ERR_load_crypto_strings(); ]])], + [[ OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); ]])], [ AC_MSG_RESULT([yes]) CHANNELLIBS="$CHANNELLIBS -ldl" @@ -3240,12 +3240,23 @@ if test "x$openssl" = "xyes" ; then ]) if test "x$openssl_engine" = "xyes" ; then + AC_CHECK_HEADERS([openssl/opensslconf.h openssl/configuration.h]) AC_MSG_CHECKING([for OpenSSL ENGINE support]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #ifdef HAVE_OPENSSL_OPENSSLCONF_H + # include <openssl/opensslconf.h> + #endif + #ifdef HAVE_OPENSSL_CONFIGURATION_H + # include <openssl/configuration.h> + #endif #include <openssl/engine.h> ]], [[ + #ifndef OPENSSL_NO_ENGINE ENGINE_load_builtin_engines(); ENGINE_register_all_complete(); + #else + #error "OPENSSL_NO_ENGINE" + #endif ]])], [ AC_MSG_RESULT([yes]) AC_DEFINE([USE_OPENSSL_ENGINE], [1], @@ -3254,26 +3265,6 @@ if test "x$openssl" = "xyes" ; then ]) fi - # Check for OpenSSL without EVP_aes_{192,256}_cbc - AC_MSG_CHECKING([whether OpenSSL lacks support for AES 192/256]) - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([[ - #include <stdlib.h> - #include <string.h> - #include <openssl/evp.h> - ]], [[ - exit(EVP_aes_192_cbc() == NULL || EVP_aes_256_cbc() == NULL); - ]])], - [ - AC_MSG_RESULT([no]) - ], - [ - AC_MSG_RESULT([yes]) - AC_DEFINE([OPENSSL_LOBOTOMISED_AES], [1], - [libcrypto is missing AES 192 and 256 bit functions]) - ] - ) - AC_MSG_CHECKING([if EVP_DigestUpdate returns an int]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec index 735d532d04aa..e81f623c2d7a 100644 --- a/contrib/redhat/openssh.spec +++ b/contrib/redhat/openssh.spec @@ -1,4 +1,4 @@ -%global ver 10.3p1 +%global ver 10.4p1 %global rel 1%{?dist} # OpenSSH privilege separation requires a user & group ID diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec index 1ca2db16a14d..a7700860f3f6 100644 --- a/contrib/suse/openssh.spec +++ b/contrib/suse/openssh.spec @@ -13,7 +13,7 @@ Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation Name: openssh -Version: 10.3p1 +Version: 10.4p1 URL: https://www.openssh.com/ Release: 1 Source0: openssh-%{version}.tar.gz diff --git a/crypto_api.h b/crypto_api.h index f5e38b547ff3..9095d8292d2c 100644 --- a/crypto_api.h +++ b/crypto_api.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_api.h,v 1.10 2025/10/30 23:19:33 djm Exp $ */ +/* $OpenBSD: crypto_api.h,v 1.11 2026/06/14 03:59:34 djm Exp $ */ /* * Assembled from generated headers and source files by Markus Friedl. @@ -58,6 +58,7 @@ crypto_hash_sha512(unsigned char *out, const unsigned char *in, #define crypto_sign_ed25519_SECRETKEYBYTES 64U #define crypto_sign_ed25519_PUBLICKEYBYTES 32U +#define crypto_sign_ed25519_SEEDBYTES 32U #define crypto_sign_ed25519_BYTES 64U int crypto_sign_ed25519(unsigned char *, unsigned long long *, @@ -65,11 +66,15 @@ int crypto_sign_ed25519(unsigned char *, unsigned long long *, int crypto_sign_ed25519_open(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); int crypto_sign_ed25519_keypair(unsigned char *, unsigned char *); +int crypto_sign_ed25519_keypair_from_seed(unsigned char *, unsigned char *, + const unsigned char *); #define crypto_kem_sntrup761_PUBLICKEYBYTES 1158 #define crypto_kem_sntrup761_SECRETKEYBYTES 1763 #define crypto_kem_sntrup761_CIPHERTEXTBYTES 1039 #define crypto_kem_sntrup761_BYTES 32 +#define crypto_kem_mlkem768_ENCSEEDBYTES 32 +#define crypto_kem_mlkem768_KEYPAIRSEEDBYTES 64 int crypto_kem_sntrup761_enc(unsigned char *cstr, unsigned char *k, const unsigned char *pk); @@ -77,9 +82,129 @@ int crypto_kem_sntrup761_dec(unsigned char *k, const unsigned char *cstr, const unsigned char *sk); int crypto_kem_sntrup761_keypair(unsigned char *pk, unsigned char *sk); +/* ML-KEM-768 */ #define crypto_kem_mlkem768_PUBLICKEYBYTES 1184 #define crypto_kem_mlkem768_SECRETKEYBYTES 2400 #define crypto_kem_mlkem768_CIPHERTEXTBYTES 1088 #define crypto_kem_mlkem768_BYTES 32 +/* Aliases for MLKEM768 */ +#define MLKEM768_PUBLICKEYBYTES crypto_kem_mlkem768_PUBLICKEYBYTES +#define MLKEM768_SECRETKEYBYTES crypto_kem_mlkem768_SECRETKEYBYTES +#define MLKEM768_CIPHERTEXTBYTES crypto_kem_mlkem768_CIPHERTEXTBYTES +#define MLKEM768_BYTES crypto_kem_mlkem768_BYTES + +int crypto_kem_mlkem768_keypair(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]); +int crypto_kem_mlkem768_enc(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES]); +int crypto_kem_mlkem768_dec(uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + const uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]); +int crypto_kem_mlkem768_keypair_seeded(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES], const uint8_t seed[64]); +int crypto_kem_mlkem768_enc_seeded(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + const uint8_t seed[32]); + +/* ML-DSA-44 */ +#define MLDSA44_PUBLICKEYBYTES 1312 +#define MLDSA44_SECRETKEYBYTES 2560 +#define MLDSA44_SIGBYTES 2420 +#define MLDSA44_SEEDBYTES 32 + +int crypto_sign_mldsa44_keypair(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES]); +int crypto_sign_mldsa44(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES]); +int crypto_sign_mldsa44_verify(const uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_PUBLICKEYBYTES]); +int crypto_sign_mldsa44_keypair_seeded(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES], const uint8_t seed[MLDSA44_SEEDBYTES]); +int crypto_sign_mldsa44_seeded(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES], + const uint8_t seed[MLDSA44_SEEDBYTES]); + +/* ML-DSA-65 */ +#define MLDSA65_PUBLICKEYBYTES 1952 +#define MLDSA65_SECRETKEYBYTES 4032 +#define MLDSA65_SIGBYTES 3309 +#define MLDSA65_SEEDBYTES 32 + +#if 0 +int crypto_sign_mldsa65_keypair(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES]); +int crypto_sign_mldsa65(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES]); +int crypto_sign_mldsa65_verify(const uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA65_PUBLICKEYBYTES]); +int crypto_sign_mldsa65_keypair_seeded(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES], const uint8_t seed[MLDSA65_SEEDBYTES]); +int crypto_sign_mldsa65_seeded(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES], + const uint8_t seed[MLDSA65_SEEDBYTES]); +#endif + +/* ML-DSA-87 */ +#define MLDSA87_PUBLICKEYBYTES 2592 +#define MLDSA87_SECRETKEYBYTES 4896 +#define MLDSA87_SIGBYTES 4627 +#define MLDSA87_SEEDBYTES 32 + +int crypto_sign_mldsa87_keypair(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES]); +int crypto_sign_mldsa87(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES]); +int crypto_sign_mldsa87_verify(const uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA87_PUBLICKEYBYTES]); +int crypto_sign_mldsa87_keypair_seeded(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES], const uint8_t seed[MLDSA87_SEEDBYTES]); +int crypto_sign_mldsa87_seeded(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES], + const uint8_t seed[MLDSA87_SEEDBYTES]); + +/* MLDSA44-Ed25519-SHA512 */ +#define MLDSA44_ED25519_PK_SZ (MLDSA44_PUBLICKEYBYTES + crypto_sign_ed25519_PUBLICKEYBYTES) +#define MLDSA44_ED25519_SK_SZ (MLDSA44_SEEDBYTES + crypto_sign_ed25519_SEEDBYTES) +#define MLDSA44_ED25519_SIG_SZ (MLDSA44_SIGBYTES + crypto_sign_ed25519_BYTES) + +int crypto_sign_mldsa44_ed25519_keygen(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ]); +int crypto_sign_mldsa44_ed25519_keygen_seeded(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ], + const uint8_t mldsa_seed[MLDSA44_SEEDBYTES], + const uint8_t ed25519_seed[crypto_sign_ed25519_SEEDBYTES]); +int crypto_sign_mldsa44_ed25519_sign(uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_ED25519_SK_SZ]); +int crypto_sign_mldsa44_ed25519_verify(const uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_ED25519_PK_SZ]); + +/* Utility */ +void sha3_256(uint8_t digest[32], const uint8_t *data, size_t len); +void sha3_512(uint8_t digest[64], const uint8_t *data, size_t len); + #endif /* crypto_api_h */ diff --git a/defines.h b/defines.h index 1d5bc049863e..634db453e579 100644 --- a/defines.h +++ b/defines.h @@ -95,7 +95,7 @@ enum # define IPTOS_DSCP_CS7 0xe0 #endif /* IPTOS_DSCP_CS0 */ #ifndef IPTOS_DSCP_VA -# define IPTOS_DSCP_VA 0x2c +# define IPTOS_DSCP_VA 0xb0 #endif /* IPTOS_DSCP_VA */ #ifndef IPTOS_DSCP_EF # define IPTOS_DSCP_EF 0xb8 @@ -663,7 +663,8 @@ struct winsize { #if (defined(HAVE_DECL_LE32TOH) && HAVE_DECL_LE32TOH == 0) || \ (defined(HAVE_DECL_LE64TOH) && HAVE_DECL_LE64TOH == 0) || \ - (defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0) + (defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0) || \ + (defined(HAVE_DECL_HTOBE32) && HAVE_DECL_HTOBE32 == 0) # define openssh_swap32(v) \ (uint32_t)(((uint32_t)(v) & 0xff) << 24 | \ ((uint32_t)(v) & 0xff00) << 8 | \ @@ -687,7 +688,10 @@ struct winsize { # endif # if defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0 # define htole64(v) (openssh_swap64(v)) -# endif +# endif +# if defined(HAVE_DECL_HTOBE32) && HAVE_DECL_HTOBE32 == 0 +# define htobe32(v) ((uint32_t)v) +# endif # else # if defined(HAVE_DECL_LE32TOH) && HAVE_DECL_LE32TOH == 0 # define le32toh(v) ((uint32_t)v) @@ -698,6 +702,9 @@ struct winsize { # if defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0 # define htole64(v) ((uint64_t)v) # endif +# if defined(HAVE_DECL_HTOBE32) && HAVE_DECL_HTOBE32 == 0 +# define htobe32(v) (openssh_swap32(v)) +# endif # endif #endif @@ -989,8 +996,9 @@ struct winsize { */ #if defined(VARIABLE_LENGTH_ARRAYS) && defined(VARIABLE_DECLARATION_AFTER_CODE) # define USE_SNTRUP761X25519 1 -/* The ML-KEM768 implementation also uses C89 features */ +/* The ML-KEM768 and ML-DSA implementations also uses C89 features */ # define USE_MLKEM768X25519 1 +# define USE_MLDSA 1 #endif #if defined(HAVE_DECL_INFINITY) && HAVE_DECL_INFINITY == 0 diff --git a/ed25519-openssl.c b/ed25519-openssl.c index 5d1e343d2e69..bea1572dfd7c 100644 --- a/ed25519-openssl.c +++ b/ed25519-openssl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519-openssl.c,v 1.1 2025/10/30 20:49:10 djm Exp $ */ +/* $OpenBSD: ed25519-openssl.c,v 1.3 2026/06/29 02:08:55 djm Exp $ */ /* * Copyright (c) 2025 OpenSSH * @@ -96,6 +96,38 @@ out: } int +crypto_sign_ed25519_keypair_from_seed(unsigned char *pk, unsigned char *sk, + const unsigned char *seed) +{ + EVP_PKEY *pkey = NULL; + size_t pklen; + int ret = -1; + + if ((pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, + seed, SSH_ED25519_RAW_SECRET_KEY_LEN)) == NULL) { + debug3_f("EVP_PKEY_new_raw_private_key failed"); + goto out; + } + + /* Extract public key */ + pklen = crypto_sign_ed25519_PUBLICKEYBYTES; + if (!EVP_PKEY_get_raw_public_key(pkey, pk, &pklen)) { + debug3_f("EVP_PKEY_get_raw_public_key failed"); + goto out; + } + + /* Build sk = seed || pk */ + memcpy(sk, seed, SSH_ED25519_RAW_SECRET_KEY_LEN); + memcpy(sk + SSH_ED25519_RAW_SECRET_KEY_LEN, pk, + crypto_sign_ed25519_PUBLICKEYBYTES); + + ret = 0; +out: + EVP_PKEY_free(pkey); + return ret; +} + +int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk) @@ -162,6 +194,10 @@ crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen, debug3_f("signed message bad length: %llu", smlen); return -1; } + if (smlen - crypto_sign_ed25519_BYTES > SIZE_MAX) { + debug3_f("signed message too long: %llu", smlen); + return -1; + } /* Signature is first crypto_sign_ed25519_BYTES, message follows */ msg = sm + crypto_sign_ed25519_BYTES; msglen = smlen - crypto_sign_ed25519_BYTES; diff --git a/ed25519.c b/ed25519.c index 2452dff0f62d..346fd3644229 100644 --- a/ed25519.c +++ b/ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519.c,v 1.4 2023/01/15 23:05:32 djm Exp $ */ +/* $OpenBSD: ed25519.c,v 1.8 2026/06/14 04:16:19 djm Exp $ */ /* * Public Domain, Authors: @@ -1912,13 +1912,13 @@ static void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) } /* from supercop-20221122/crypto_sign/ed25519/ref/keypair.c */ -int crypto_sign_ed25519_keypair(unsigned char *pk,unsigned char *sk) +int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed) { unsigned char az[64]; sc25519 scsk; ge25519 gepk; - randombytes(sk,32); + memcpy(sk, seed, 32); crypto_hash_sha512(az,sk,32); az[0] &= 248; az[31] &= 127; @@ -1931,6 +1931,18 @@ int crypto_sign_ed25519_keypair(unsigned char *pk,unsigned char *sk) memmove(sk + 32,pk,32); return 0; } + +int +crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) +{ + unsigned char seed[32]; + int r; + + randombytes(seed, 32); + r = crypto_sign_ed25519_keypair_from_seed(pk, sk, seed); + explicit_bzero(seed, sizeof(seed)); + return r; +} /* from supercop-20221122/crypto_sign/ed25519/ref/sign.c */ int crypto_sign_ed25519( @@ -1987,6 +1999,22 @@ int crypto_sign_ed25519( } /* from supercop-20221122/crypto_sign/ed25519/ref/open.c */ +/* + * Local OpenSSH addition: check that S < group order L + * Where L = 2^{252} + 27742317777372353535851937790883648493 + * This can be variable time as the signature is public. + */ +static inline int sc25519_inrange(const unsigned char *s) +{ + int i; + + for (i = 0; i < 32; i++) { + if (s[31 - i] > sc25519_m[31 - i]) return -1; + if (s[31 - i] < sc25519_m[31 - i]) return 0; + } + return -1; +} + int crypto_sign_ed25519_open( unsigned char *m,unsigned long long *mlen, const unsigned char *sm,unsigned long long smlen, @@ -2002,7 +2030,9 @@ int crypto_sign_ed25519_open( if (smlen < 64) goto badsig; if (sm[63] & 224) goto badsig; + if (sc25519_inrange(sm+32)) goto badsig; if (ge25519_unpackneg_vartime(&get1,pk)) goto badsig; + if (ge25519_isneutral_vartime(&get1)) goto badsig; memmove(pkcopy,pk,32); memmove(rcopy,sm,32); diff --git a/ed25519.sh b/ed25519.sh index 9e6cbc9c312d..987f61d80c99 100644 --- a/ed25519.sh +++ b/ed25519.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: ed25519.sh,v 1.2 2024/05/17 02:39:11 jsg Exp $ +# $OpenBSD: ed25519.sh,v 1.6 2026/06/14 04:16:19 djm Exp $ # Placed in the Public Domain. # AUTHOR="supercop-20221122/crypto_sign/ed25519/ref/implementors" @@ -16,11 +16,12 @@ FILES=" supercop-20221122/crypto_sign/ed25519/ref/open.c " ### +PORTABLE=${PORTABLE:-0} DATA="supercop-20221122/crypto_sign/ed25519/ref/ge25519_base.data" set -e -cd $1 +test -z "$1" || cd $1 echo -n '/* $' echo 'OpenBSD: $ */' echo @@ -29,6 +30,12 @@ echo ' * Public Domain, Authors:' sed -e '/Alphabetical order:/d' -e 's/^/ * - /' < $AUTHOR echo ' */' echo +if [ "$PORTABLE" -ne 0 ]; then + echo '#include "includes.h"' + echo + echo '#ifndef OPENSSL_HAS_ED25519' + echo +fi echo '#include <string.h>' echo echo '#include "crypto_api.h"' @@ -42,6 +49,32 @@ done echo for i in $FILES; do echo "/* from $i */" + + case "$i" in + */crypto_sign/ed25519/ref/open.c) + # Include our malleability fix at the start if open.c + cat << _EOF + +/* + * Local OpenSSH addition: check that S < group order L + * Where L = 2^{252} + 27742317777372353535851937790883648493 + * This can be variable time as the signature is public. + */ +static inline int sc25519_inrange(const unsigned char *s) +{ + int i; + + for (i = 0; i < 32; i++) { + if (s[31 - i] > sc25519_m[31 - i]) return -1; + if (s[31 - i] < sc25519_m[31 - i]) return 0; + } + return -1; +} +_EOF + ;; + esac + + nl=`echo` # Changes to all files: # - inline ge25519_base.data where it is included # - expand CRYPTO_NAMESPACE() namespacing define @@ -66,12 +99,17 @@ for i in $FILES; do sed -e "s/crypto_sign/crypto_sign_ed25519/g" ;; */crypto_sign/ed25519/ref/keypair.c) - # rename key generation function to the name OpenSSH expects - sed -e "s/crypto_sign_keypair/crypto_sign_ed25519_keypair/g" + # provide an explicit-seed key generation function and rename + # it to the name OpenSSH expects + sed -e "s/int crypto_sign_keypair(unsigned char \*pk,unsigned char \*sk)/int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed)/g" \ + -e "s/randombytes(sk,32);/memcpy(sk, seed, 32);/g" ;; */crypto_sign/ed25519/ref/open.c) # rename verification function to the name OpenSSH expects - sed -e "s/crypto_sign_open/crypto_sign_ed25519_open/g" + # Insert malleability checks + sed -e "s/crypto_sign_open/crypto_sign_ed25519_open/g" | \ + perl -0777 -pe 's/(.*if.*ge25519_unpackneg_vartime.*get1,pk.*)/ if (sc25519_inrange(sm+32)) goto badsig;\n\1\n if (ge25519_isneutral_vartime(&get1)) goto badsig;/' + #perl -0777 -pe 's/^(.*ge25519_unpackneg_vartime.*,pk.*)$/ if (sc25519_inrange(sm+32)) goto badsig;\n$1\n if (ge25519_isneutral_vartime(&get1)) goto badsig;/' ;; */crypto_sign/ed25519/ref/fe25519.*) # avoid a couple of name collisions with other files @@ -116,4 +154,30 @@ for i in $FILES; do ;; esac | \ sed -e 's/[ ]*$//' + + # Include implicit-seed keygen function used for ssh-ed25519 + case "$i" in + */crypto_sign/ed25519/ref/keypair.c) + cat << _EOF + +int +crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) +{ + unsigned char seed[32]; + int r; + + randombytes(seed, 32); + r = crypto_sign_ed25519_keypair_from_seed(pk, sk, seed); + explicit_bzero(seed, sizeof(seed)); + return r; +} +_EOF + ;; + esac + done + +if [ "$PORTABLE" -ne 0 ]; then + echo + echo '#endif /* OPENSSL_HAS_ED25519 */' +fi @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.c,v 1.193 2026/03/05 05:40:35 djm Exp $ */ +/* $OpenBSD: kex.c,v 1.194 2026/05/31 04:44:38 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * @@ -566,7 +566,7 @@ kex_input_newkeys(int type, uint32_t seq, struct ssh *ssh) kex->done = 1; kex->flags &= ~KEX_INITIAL; sshbuf_reset(kex->peer); - kex->flags &= ~KEX_INIT_SENT; + kex->flags &= ~(KEX_INIT_SENT|KEX_INIT_RECVD); return 0; } @@ -624,6 +624,11 @@ kex_input_kexinit(int type, uint32_t seq, struct ssh *ssh) } free(kex->name); kex->name = NULL; + if ((kex->flags & KEX_INIT_RECVD) != 0) { + ssh_packet_disconnect(ssh, + "multiple KEXINIT received from peer"); + } + kex->flags |= KEX_INIT_RECVD; ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_protocol_error); ptr = sshpkt_ptr(ssh, &dlen); if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0) @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.h,v 1.129 2026/03/05 05:40:36 djm Exp $ */ +/* $OpenBSD: kex.h,v 1.130 2026/05/31 04:44:38 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -115,6 +115,7 @@ enum kex_exchange { #define KEX_HAS_PING 0x0020 #define KEX_HAS_EXT_INFO_IN_AUTH 0x0040 #define KEX_HAS_NEWAGENT 0x0080 /* only set in client */ +#define KEX_INIT_RECVD 0x0100 /* kex->pq */ #define KEX_NOT_PQ 0 diff --git a/kexmlkem768x25519.c b/kexmlkem768x25519.c index 2585d1db3935..e2c2c0a86e43 100644 --- a/kexmlkem768x25519.c +++ b/kexmlkem768x25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kexmlkem768x25519.c,v 1.2 2024/10/27 02:06:59 djm Exp $ */ +/* $OpenBSD: kexmlkem768x25519.c,v 1.3 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2023 Markus Friedl. All rights reserved. * @@ -41,34 +41,32 @@ #include "ssherr.h" #include "log.h" -#ifdef USE_MLKEM768X25519 +#include "crypto_api.h" -#include "libcrux_mlkem768_sha3.h" +#ifdef USE_MLKEM768X25519 int kex_kem_mlkem768x25519_keypair(struct kex *kex) { struct sshbuf *buf = NULL; - u_char rnd[LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN], *cp = NULL; + u_char *cp = NULL; size_t need; int r = SSH_ERR_INTERNAL_ERROR; - struct libcrux_mlkem768_keypair keypair; if ((buf = sshbuf_new()) == NULL) return SSH_ERR_ALLOC_FAIL; - need = crypto_kem_mlkem768_PUBLICKEYBYTES + CURVE25519_SIZE; + need = MLKEM768_PUBLICKEYBYTES + CURVE25519_SIZE; if ((r = sshbuf_reserve(buf, need, &cp)) != 0) goto out; - arc4random_buf(rnd, sizeof(rnd)); - keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(rnd); - memcpy(cp, keypair.pk.value, crypto_kem_mlkem768_PUBLICKEYBYTES); - memcpy(kex->mlkem768_client_key, keypair.sk.value, - sizeof(kex->mlkem768_client_key)); + if (crypto_kem_mlkem768_keypair(cp, kex->mlkem768_client_key) != 0) { + r = SSH_ERR_INTERNAL_ERROR; + goto out; + } #ifdef DEBUG_KEXECDH dump_digest("client public key mlkem768:", cp, - crypto_kem_mlkem768_PUBLICKEYBYTES); + MLKEM768_PUBLICKEYBYTES); #endif - cp += crypto_kem_mlkem768_PUBLICKEYBYTES; + cp += MLKEM768_PUBLICKEYBYTES; kexc25519_keygen(kex->c25519_client_key, cp); #ifdef DEBUG_KEXECDH dump_digest("client public key c25519:", cp, CURVE25519_SIZE); @@ -78,8 +76,6 @@ kex_kem_mlkem768x25519_keypair(struct kex *kex) kex->client_pub = buf; buf = NULL; out: - explicit_bzero(&keypair, sizeof(keypair)); - explicit_bzero(rnd, sizeof(rnd)); sshbuf_free(buf); return r; } @@ -92,20 +88,18 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, struct sshbuf *server_blob = NULL; struct sshbuf *buf = NULL; const u_char *client_pub; - u_char rnd[LIBCRUX_ML_KEM_ENC_PRNG_LEN]; u_char server_pub[CURVE25519_SIZE], server_key[CURVE25519_SIZE]; u_char hash[SSH_DIGEST_MAX_LENGTH]; + u_char ct[MLKEM768_CIPHERTEXTBYTES]; + u_char shared_secret[MLKEM768_BYTES]; size_t need; int r = SSH_ERR_INTERNAL_ERROR; - struct libcrux_mlkem768_enc_result enc; - struct libcrux_mlkem768_pk mlkem_pub; *server_blobp = NULL; *shared_secretp = NULL; - memset(&mlkem_pub, 0, sizeof(mlkem_pub)); /* client_blob contains both KEM and ECDH client pubkeys */ - need = crypto_kem_mlkem768_PUBLICKEYBYTES + CURVE25519_SIZE; + need = MLKEM768_PUBLICKEYBYTES + CURVE25519_SIZE; if (sshbuf_len(client_blob) != need) { r = SSH_ERR_SIGNATURE_INVALID; goto out; @@ -113,17 +107,11 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, client_pub = sshbuf_ptr(client_blob); #ifdef DEBUG_KEXECDH dump_digest("client public key mlkem768:", client_pub, - crypto_kem_mlkem768_PUBLICKEYBYTES); + MLKEM768_PUBLICKEYBYTES); dump_digest("client public key 25519:", - client_pub + crypto_kem_mlkem768_PUBLICKEYBYTES, + client_pub + MLKEM768_PUBLICKEYBYTES, CURVE25519_SIZE); #endif - /* check public key validity */ - memcpy(mlkem_pub.value, client_pub, crypto_kem_mlkem768_PUBLICKEYBYTES); - if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&mlkem_pub)) { - r = SSH_ERR_SIGNATURE_INVALID; - goto out; - } /* allocate buffer for concatenation of KEM key and ECDH shared key */ /* the buffer will be hashed and the result is the shared secret */ @@ -137,25 +125,27 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, goto out; } /* generate and encrypt KEM key with client key */ - arc4random_buf(rnd, sizeof(rnd)); - enc = libcrux_ml_kem_mlkem768_portable_encapsulate(&mlkem_pub, rnd); + if (crypto_kem_mlkem768_enc(ct, shared_secret, client_pub) != 0) { + r = SSH_ERR_INTERNAL_ERROR; + goto out; + } /* generate ECDH key pair, store server pubkey after ciphertext */ kexc25519_keygen(server_key, server_pub); - if ((r = sshbuf_put(buf, enc.snd, sizeof(enc.snd))) != 0 || - (r = sshbuf_put(server_blob, enc.fst.value, sizeof(enc.fst.value))) != 0 || + if ((r = sshbuf_put(buf, shared_secret, sizeof(shared_secret))) != 0 || + (r = sshbuf_put(server_blob, ct, sizeof(ct))) != 0 || (r = sshbuf_put(server_blob, server_pub, sizeof(server_pub))) != 0) goto out; /* append ECDH shared key */ - client_pub += crypto_kem_mlkem768_PUBLICKEYBYTES; + client_pub += MLKEM768_PUBLICKEYBYTES; if ((r = kexc25519_shared_key_ext(server_key, client_pub, buf, 1)) < 0) goto out; - if ((r = ssh_digest_buffer(kex->hash_alg, buf, hash, sizeof(hash))) != 0) + if ((r = ssh_digest_buffer(kex->hash_alg, buf, + hash, sizeof(hash))) != 0) goto out; #ifdef DEBUG_KEXECDH dump_digest("server public key 25519:", server_pub, CURVE25519_SIZE); - dump_digest("server cipher text:", - enc.fst.value, sizeof(enc.fst.value)); - dump_digest("server kem key:", enc.snd, sizeof(enc.snd)); + dump_digest("server cipher text:", ct, sizeof(ct)); + dump_digest("server kem key:", shared_secret, sizeof(shared_secret)); dump_digest("concatenation of KEM key and ECDH shared key:", sshbuf_ptr(buf), sshbuf_len(buf)); #endif @@ -176,8 +166,7 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, out: explicit_bzero(hash, sizeof(hash)); explicit_bzero(server_key, sizeof(server_key)); - explicit_bzero(rnd, sizeof(rnd)); - explicit_bzero(&enc, sizeof(enc)); + explicit_bzero(shared_secret, sizeof(shared_secret)); sshbuf_free(server_blob); sshbuf_free(buf); return r; @@ -188,42 +177,37 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, const struct sshbuf *server_blob, struct sshbuf **shared_secretp) { struct sshbuf *buf = NULL; - u_char mlkem_key[crypto_kem_mlkem768_BYTES]; + u_char shared_secret[MLKEM768_BYTES]; const u_char *ciphertext, *server_pub; u_char hash[SSH_DIGEST_MAX_LENGTH]; size_t need; int r; - struct libcrux_mlkem768_sk mlkem_priv; - struct libcrux_mlkem768_ciphertext mlkem_ciphertext; *shared_secretp = NULL; - memset(&mlkem_priv, 0, sizeof(mlkem_priv)); - memset(&mlkem_ciphertext, 0, sizeof(mlkem_ciphertext)); - need = crypto_kem_mlkem768_CIPHERTEXTBYTES + CURVE25519_SIZE; + need = MLKEM768_CIPHERTEXTBYTES + CURVE25519_SIZE; if (sshbuf_len(server_blob) != need) { r = SSH_ERR_SIGNATURE_INVALID; goto out; } ciphertext = sshbuf_ptr(server_blob); - server_pub = ciphertext + crypto_kem_mlkem768_CIPHERTEXTBYTES; + server_pub = ciphertext + MLKEM768_CIPHERTEXTBYTES; /* hash concatenation of KEM key and ECDH shared key */ if ((buf = sshbuf_new()) == NULL) { r = SSH_ERR_ALLOC_FAIL; goto out; } - memcpy(mlkem_priv.value, kex->mlkem768_client_key, - sizeof(kex->mlkem768_client_key)); - memcpy(mlkem_ciphertext.value, ciphertext, - sizeof(mlkem_ciphertext.value)); #ifdef DEBUG_KEXECDH - dump_digest("server cipher text:", mlkem_ciphertext.value, - sizeof(mlkem_ciphertext.value)); + dump_digest("server cipher text:", ciphertext, + MLKEM768_CIPHERTEXTBYTES); dump_digest("server public key c25519:", server_pub, CURVE25519_SIZE); #endif - libcrux_ml_kem_mlkem768_portable_decapsulate(&mlkem_priv, - &mlkem_ciphertext, mlkem_key); - if ((r = sshbuf_put(buf, mlkem_key, sizeof(mlkem_key))) != 0) + if (crypto_kem_mlkem768_dec(shared_secret, ciphertext, + kex->mlkem768_client_key) != 0) { + r = SSH_ERR_INTERNAL_ERROR; + goto out; + } + if ((r = sshbuf_put(buf, shared_secret, sizeof(shared_secret))) != 0) goto out; if ((r = kexc25519_shared_key_ext(kex->c25519_client_key, server_pub, buf, 1)) < 0) @@ -232,7 +216,7 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, hash, sizeof(hash))) != 0) goto out; #ifdef DEBUG_KEXECDH - dump_digest("client kem key:", mlkem_key, sizeof(mlkem_key)); + dump_digest("client kem key:", shared_secret, sizeof(shared_secret)); dump_digest("concatenation of KEM key and ECDH shared key:", sshbuf_ptr(buf), sshbuf_len(buf)); #endif @@ -249,9 +233,7 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, buf = NULL; out: explicit_bzero(hash, sizeof(hash)); - explicit_bzero(&mlkem_priv, sizeof(mlkem_priv)); - explicit_bzero(&mlkem_ciphertext, sizeof(mlkem_ciphertext)); - explicit_bzero(mlkem_key, sizeof(mlkem_key)); + explicit_bzero(shared_secret, sizeof(shared_secret)); sshbuf_free(buf); return r; } diff --git a/libcrux-mlkem-mldsa.c b/libcrux-mlkem-mldsa.c new file mode 100644 index 000000000000..1ce21b9c7a8d --- /dev/null +++ b/libcrux-mlkem-mldsa.c @@ -0,0 +1,430 @@ +/* $OpenBSD: libcrux-mlkem-mldsa.c,v 1.1 2026/06/14 03:59:34 djm Exp $ */ +/* + * Copyright (c) 2026 Damien Miller <djm@mindrot.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "includes.h" + +#if defined(USE_MLDSA) || defined(USE_MLKEM768X25519) + +#include <sys/types.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> + +#include "log.h" +#include "crypto_api.h" +#include "libcrux_internal.h" + +/* ML-KEM 768 */ + +int +crypto_kem_mlkem768_keypair(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]) +{ + uint8_t rnd[crypto_kem_mlkem768_KEYPAIRSEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_kem_mlkem768_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_kem_mlkem768_keypair_seeded(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES], + const uint8_t seed[crypto_kem_mlkem768_KEYPAIRSEEDBYTES]) +{ + libcrux_mlkem768_keypair keypair; + libcrux_mlkem768_keypair_rnd rnd; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(rnd); + memcpy(pk, keypair.pk.data, crypto_kem_mlkem768_PUBLICKEYBYTES); + memcpy(sk, keypair.sk.data, crypto_kem_mlkem768_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_kem_mlkem768_enc(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES]) +{ + uint8_t rnd[crypto_kem_mlkem768_ENCSEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_kem_mlkem768_enc_seeded(ct, shared_secret, pk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_kem_mlkem768_enc_seeded(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + const uint8_t seed[crypto_kem_mlkem768_ENCSEEDBYTES]) +{ + libcrux_mlkem768_enc_result enc; + libcrux_mlkem768_pk pk_internal; + libcrux_mlkem768_enc_rnd rnd; + + memcpy(pk_internal.data, pk, crypto_kem_mlkem768_PUBLICKEYBYTES); + if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&pk_internal)) + return -1; + memcpy(rnd.data, seed, sizeof(rnd.data)); + enc = libcrux_ml_kem_mlkem768_portable_encapsulate(&pk_internal, rnd); + memcpy(ct, enc.fst.data, crypto_kem_mlkem768_CIPHERTEXTBYTES); + memcpy(shared_secret, enc.snd.data, crypto_kem_mlkem768_BYTES); + + explicit_bzero(&enc, sizeof(enc)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_kem_mlkem768_dec(uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + const uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]) +{ + libcrux_mlkem768_sk sk_internal; + libcrux_mlkem768_ciphertext ct_internal; + libcrux_mlkem768_dec_result shared_secret_internal; + + memcpy(sk_internal.data, sk, crypto_kem_mlkem768_SECRETKEYBYTES); + memcpy(ct_internal.data, ct, crypto_kem_mlkem768_CIPHERTEXTBYTES); + shared_secret_internal = libcrux_ml_kem_mlkem768_portable_decapsulate( + &sk_internal, &ct_internal); + memcpy(shared_secret, shared_secret_internal.data, + crypto_kem_mlkem768_BYTES); + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&shared_secret_internal, sizeof(shared_secret_internal)); + return 0; +} + +/* ML-DSA 44 */ + +int +crypto_sign_mldsa44_keypair(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA44_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa44_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa44_keypair_seeded(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES], const uint8_t seed[MLDSA44_SEEDBYTES]) +{ + libcrux_mldsa44_keypair_rnd rnd; + libcrux_mldsa44_keypair keypair; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_dsa_ml_dsa_44_portable_generate_key_pair(rnd); + memcpy(pk, keypair.verification_key.data, MLDSA44_PUBLICKEYBYTES); + memcpy(sk, keypair.signing_key.data, MLDSA44_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_sign_mldsa44(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA44_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa44_seeded(sig, msg, msglen, ctx, ctxlen, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa44_seeded(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES], + const uint8_t seed[MLDSA44_SEEDBYTES]) +{ + libcrux_mldsa44_sign_rnd rnd; + libcrux_mldsa44_sk sk_internal; + libcrux_mldsa44_message message = { msg, msglen }; + libcrux_mldsa44_message context = { ctx, ctxlen }; + libcrux_mldsa44_sign_result res; + int r = -1; + + memcpy(sk_internal.data, sk, MLDSA44_SECRETKEYBYTES); + memcpy(rnd.data, seed, sizeof(rnd.data)); + res = libcrux_ml_dsa_ml_dsa_44_portable_sign(&sk_internal, + message, context, rnd); + if (res.tag == LIBCRUX_RESULT_OK) { + memcpy(sig, res.val.case_Ok.data, MLDSA44_SIGBYTES); + r = 0; + } + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&res, sizeof(res)); + explicit_bzero(&rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa44_verify(const uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_PUBLICKEYBYTES]) +{ + libcrux_mldsa44_pk pk_internal; + libcrux_mldsa44_signature sig_internal; + libcrux_mldsa44_message message = { msg, msglen }; + libcrux_mldsa44_message context = { ctx, ctxlen }; + libcrux_mldsa44_verify_result res; + + memcpy(pk_internal.data, pk, MLDSA44_PUBLICKEYBYTES); + memcpy(sig_internal.data, sig, MLDSA44_SIGBYTES); + res = libcrux_ml_dsa_ml_dsa_44_portable_verify(&pk_internal, + message, context, &sig_internal); + + return (res.tag == LIBCRUX_RESULT_OK) ? 0 : -1; +} + +/* ML-DSA 65 */ + +#if 0 +int +crypto_sign_mldsa65_keypair(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA65_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa65_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa65_keypair_seeded(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES], const uint8_t seed[MLDSA65_SEEDBYTES]) +{ + libcrux_mldsa65_keypair_rnd rnd; + libcrux_mldsa65_keypair keypair; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_dsa_ml_dsa_65_portable_generate_key_pair(rnd); + memcpy(pk, keypair.verification_key.data, MLDSA65_PUBLICKEYBYTES); + memcpy(sk, keypair.signing_key.data, MLDSA65_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_sign_mldsa65(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA65_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa65_seeded(sig, msg, msglen, ctx, ctxlen, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa65_seeded(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES], + const uint8_t seed[MLDSA65_SEEDBYTES]) +{ + libcrux_mldsa65_sign_rnd rnd; + libcrux_mldsa65_sk sk_internal; + libcrux_mldsa65_message message = { msg, msglen }; + libcrux_mldsa65_message context = { ctx, ctxlen }; + libcrux_mldsa65_sign_result res; + int r = -1; + + memcpy(sk_internal.data, sk, MLDSA65_SECRETKEYBYTES); + memcpy(rnd.data, seed, sizeof(rnd.data)); + res = libcrux_ml_dsa_ml_dsa_65_portable_sign(&sk_internal, + message, context, rnd); + if (res.tag == LIBCRUX_RESULT_OK) { + memcpy(sig, res.val.case_Ok.data, MLDSA65_SIGBYTES); + r = 0; + } + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&res, sizeof(res)); + explicit_bzero(&rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa65_verify(const uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA65_PUBLICKEYBYTES]) +{ + libcrux_mldsa65_pk pk_internal; + libcrux_mldsa65_signature sig_internal; + libcrux_mldsa65_message message = { msg, msglen }; + libcrux_mldsa65_message context = { ctx, ctxlen }; + libcrux_mldsa65_verify_result res; + + memcpy(pk_internal.data, pk, MLDSA65_PUBLICKEYBYTES); + memcpy(sig_internal.data, sig, MLDSA65_SIGBYTES); + res = libcrux_ml_dsa_ml_dsa_65_portable_verify(&pk_internal, + message, context, &sig_internal); + + return (res.tag == LIBCRUX_RESULT_OK) ? 0 : -1; +} +#endif + +/* ML-DSA 87 */ + +#if 0 +int +crypto_sign_mldsa87_keypair(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA87_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa87_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa87_keypair_seeded(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES], const uint8_t seed[MLDSA87_SEEDBYTES]) +{ + libcrux_mldsa87_keypair_rnd rnd; + libcrux_mldsa87_keypair keypair; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_dsa_ml_dsa_87_portable_generate_key_pair(rnd); + memcpy(pk, keypair.verification_key.data, MLDSA87_PUBLICKEYBYTES); + memcpy(sk, keypair.signing_key.data, MLDSA87_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_sign_mldsa87(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA87_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa87_seeded(sig, msg, msglen, ctx, ctxlen, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa87_seeded(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES], + const uint8_t seed[MLDSA87_SEEDBYTES]) +{ + libcrux_mldsa87_sign_rnd rnd; + libcrux_mldsa87_sk sk_internal; + libcrux_mldsa87_message message = { msg, msglen }; + libcrux_mldsa87_message context = { ctx, ctxlen }; + libcrux_mldsa87_sign_result res; + int r = -1; + + memcpy(sk_internal.data, sk, MLDSA87_SECRETKEYBYTES); + memcpy(rnd.data, seed, sizeof(rnd.data)); + res = libcrux_ml_dsa_ml_dsa_87_portable_sign(&sk_internal, + message, context, rnd); + if (res.tag == LIBCRUX_RESULT_OK) { + memcpy(sig, res.val.case_Ok.data, MLDSA87_SIGBYTES); + r = 0; + } + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&res, sizeof(res)); + explicit_bzero(&rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa87_verify(const uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA87_PUBLICKEYBYTES]) +{ + libcrux_mldsa87_pk pk_internal; + libcrux_mldsa87_signature sig_internal; + libcrux_mldsa87_message message = { msg, msglen }; + libcrux_mldsa87_message context = { ctx, ctxlen }; + libcrux_mldsa87_verify_result res; + + memcpy(pk_internal.data, pk, MLDSA87_PUBLICKEYBYTES); + memcpy(sig_internal.data, sig, MLDSA87_SIGBYTES); + res = libcrux_ml_dsa_ml_dsa_87_portable_verify(&pk_internal, + message, context, &sig_internal); + + return (res.tag == LIBCRUX_RESULT_OK) ? 0 : -1; +} +#endif + +void +sha3_256(uint8_t digest[32], const uint8_t *data, size_t len) +{ + Eurydice_borrow_slice_u8 input = { data, len }; + Eurydice_mut_borrow_slice_u8 output = { digest, 32 }; + libcrux_sha3_portable_sha256(output, input); +} + +void +sha3_512(uint8_t digest[64], const uint8_t *data, size_t len) +{ + Eurydice_borrow_slice_u8 input = { data, len }; + Eurydice_mut_borrow_slice_u8 output = { digest, 64 }; + libcrux_sha3_portable_sha512(output, input); +} +#endif /* defined(USE_MLDSA) || defined(USE_MLKEM768X25519) */ diff --git a/libcrux_internal.h b/libcrux_internal.h new file mode 100644 index 000000000000..29719795429f --- /dev/null +++ b/libcrux_internal.h @@ -0,0 +1,27332 @@ +/* $OpenBSD: libcrux_internal.h,v 1.1 2026/06/14 03:59:34 djm Exp $ */ + +/* Extracted from libcrux revision c46481ce3cd1cc8315e90db114581d8c992c3d7d */ + +/* + * MIT License + * + * Copyright (c) 2024 Cryspen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#if !defined(__GNUC__) || (__GNUC__ < 2) +# define __attribute__(x) +#endif +#define KRML_MUSTINLINE inline +#define KRML_NOINLINE __attribute__((noinline, unused)) +#define KRML_HOST_EPRINTF(...) +#define KRML_HOST_EXIT(x) fatal_f("internal error") +#define KRML_UNION_CONSTRUCTOR(T) + +static inline void +store64_le(uint8_t dst[8], uint64_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; + dst[4] = (src >> 32) & 0xff; + dst[5] = (src >> 40) & 0xff; + dst[6] = (src >> 48) & 0xff; + dst[7] = (src >> 56) & 0xff; +} + +static inline void +store32_le(uint8_t dst[4], uint32_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; +} + +static inline void +store16_le(uint8_t dst[2], uint16_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; +} + +static inline void +store32_be(uint8_t dst[4], uint32_t src) +{ + dst[0] = (src >> 24) & 0xff; + dst[1] = (src >> 16) & 0xff; + dst[2] = (src >> 8) & 0xff; + dst[3] = src & 0xff; +} + +static inline uint64_t +load64_le(uint8_t src[8]) +{ + return (uint64_t)(src[0]) | + ((uint64_t)(src[1]) << 8) | + ((uint64_t)(src[2]) << 16) | + ((uint64_t)(src[3]) << 24) | + ((uint64_t)(src[4]) << 32) | + ((uint64_t)(src[5]) << 40) | + ((uint64_t)(src[6]) << 48) | + ((uint64_t)(src[7]) << 56); +} + +static inline uint32_t +load32_le(uint8_t src[4]) +{ + return (uint32_t)(src[0]) | + ((uint32_t)(src[1]) << 8) | + ((uint32_t)(src[2]) << 16) | + ((uint32_t)(src[3]) << 24); +} + +static inline uint16_t +load16_le(uint8_t src[4]) +{ + return (uint16_t)(src[0]) | + ((uint16_t)(src[1]) << 8); +} + +#ifdef MISSING_BUILTIN_POPCOUNT +static inline unsigned int +__builtin_popcount(unsigned int num) +{ + const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; + return v[num & 0xf] + v[(num >> 4) & 0xf]; +} +#endif + +/* from libcrux/combined_extraction/generated/eurydice_glue.h */ +#pragma once + + +#ifdef _MSC_VER +// For __popcnt +#endif + + +// C++ HELPERS + +#if defined(__cplusplus) + +#ifndef KRML_HOST_EPRINTF +#define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__) +#endif + + +#ifndef __cpp_lib_type_identity +template <class T> +struct type_identity { + using type = T; +}; + +template <class T> +using type_identity_t = typename type_identity<T>::type; +#else +using std::type_identity_t; +#endif + +#define KRML_UNION_CONSTRUCTOR(T) \ + template <typename V> \ + constexpr T(int t, V U::*m, type_identity_t<V> v) : tag(t) { \ + val.*m = std::move(v); \ + } \ + T() = default; + +#endif + +// GENERAL-PURPOSE STUFF + +#define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e) + +#define EURYDICE_ASSERT(test, msg) \ + do { \ + if (!(test)) { \ + fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \ + __FILE__, __LINE__); \ + exit(255); \ + } \ + } while (0) + +// SIZEOF, ALIGNOF + +#define Eurydice_sizeof(t) sizeof(t) + +#define Eurydice_alignof(t) alignof(t) + +// SLICES, ARRAYS, ETC. + +// For convenience, we give these common slice types, below, a distinguished +// status and rather than emit them in the client code, we skip their +// code-generation in Cleanup3.ml and write them by hand here. This makes it +// easy to write interop code that brings those definitions in scope. + +// &[u8] +typedef struct Eurydice_borrow_slice_u8_s { + const uint8_t *ptr; + size_t meta; +} Eurydice_borrow_slice_u8; + +// &[u16] +typedef struct Eurydice_borrow_slice_i16_s { + const int16_t *ptr; + size_t meta; +} Eurydice_borrow_slice_i16; + +// &mut [u8] +typedef struct Eurydice_mut_borrow_slice_u8_s { + uint8_t *ptr; + size_t meta; +} Eurydice_mut_borrow_slice_u8; + +// &mut [u16] +typedef struct Eurydice_mut_borrow_slice_i16_s { + int16_t *ptr; + size_t meta; +} Eurydice_mut_borrow_slice_i16; + +#if defined(__cplusplus) +#define KRML_CLITERAL(type) type +#else +#define KRML_CLITERAL(type) (type) +#endif + +#if defined(__cplusplus) && defined(__cpp_designated_initializers) || \ + !(defined(__cplusplus)) +#define EURYDICE_CFIELD(X) X +#else +#define EURYDICE_CFIELD(X) +#endif + +#define Eurydice_array_repeat(dst, len, init, t) \ + ERROR "should've been desugared" + +// Copy a slice with memcopy +#define Eurydice_slice_copy(dst, src, t) \ + memcpy(dst.ptr, src.ptr, dst.meta * sizeof(t)) + +#define core_array___T__N___as_slice(len_, ptr_, t, ret_t) \ + (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.ptr =)(ptr_)->data, \ + EURYDICE_CFIELD(.meta =) len_}) + +#define core_array__core__clone__Clone_for__T__N___clone(len, src, elem_type, \ + _ret_t) \ + (*(src)) +#define TryFromSliceError uint8_t +#define core_array_TryFromSliceError uint8_t + +// Distinguished support for some PartialEq trait implementations +// +// core::cmp::PartialEq<@Array<U, N>> for @Array<T, N> +#define Eurydice_array_eq(sz, a1, a2, t) \ + (memcmp((a1)->data, (a2)->data, sz * sizeof(t)) == 0) +// core::cmp::PartialEq<&0 (@Slice<U>)> for @Array<T, N> +#define Eurydice_array_eq_slice_shared(sz, a1, s2, t, _) \ + (memcmp((a1)->data, (s2)->ptr, sz * sizeof(t)) == 0) +#define Eurydice_array_eq_slice_mut(sz, a1, s2, t, _) \ + Eurydice_array_eq_slice_shared(sz, a1, s2, t, _) + +// DEPRECATED -- should no longer be generated +#define core_array_equality__core__cmp__PartialEq__Array_U__N___for__Array_T__N___eq( \ + sz, a1, a2, t, _, _ret_t) \ + Eurydice_array_eq(sz, a1, a2, t) +#define core_array_equality__core__cmp__PartialEq__0___Slice_U____for__Array_T__N___eq( \ + sz, a1, a2, t, _, _ret_t) \ + Eurydice_array_eq(sz, a1, ((a2)->ptr), t) +#define core_cmp_impls__core__cmp__PartialEq__0_mut__B___for__1_mut__A___eq( \ + _m0, _m1, src1, src2, _0, _1, T) \ + Eurydice_slice_eq(src1, src2, _, _, T, _) + +#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \ + KRML_CLITERAL(ret_t) { \ + EURYDICE_CFIELD(.fst =){EURYDICE_CFIELD(.ptr =)((slice).ptr), \ + EURYDICE_CFIELD(.meta =) mid}, \ + EURYDICE_CFIELD(.snd =) { \ + EURYDICE_CFIELD(.ptr =) \ + ((slice).ptr + mid), EURYDICE_CFIELD(.meta =)((slice).meta - mid) \ + } \ + } + +#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \ + KRML_CLITERAL(ret_t) { \ + EURYDICE_CFIELD(.fst =){EURYDICE_CFIELD(.ptr =)((slice).ptr), \ + EURYDICE_CFIELD(.meta =) mid}, \ + EURYDICE_CFIELD(.snd =) { \ + EURYDICE_CFIELD(.ptr =) \ + ((slice).ptr + mid), EURYDICE_CFIELD(.meta =)((slice).meta - mid) \ + } \ + } + +// Conversion of slice to an array, rewritten (by Eurydice) to name the +// destination array, since arrays are not values in C. +// N.B.: see note in karamel/lib/Inlining.ml if you change this. + +#define Eurydice_slice_to_ref_array2(len_, src, arr_ptr, t_ptr, t_arr, t_err, \ + t_res) \ + (src.meta >= len_ \ + ? ((t_res){.tag = core_result_Ok, .val = {.case_Ok = arr_ptr}}) \ + : ((t_res){.tag = core_result_Err, .val = {.case_Err = 0}})) + +// CORE STUFF (conversions, endianness, ...) + +// We slap extern "C" on declarations that intend to implement a prototype +// generated by Eurydice, because Eurydice prototypes are always emitted within +// an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must +// pass -DKRML_CXX17_COMPAT="" to your C++ compiler. +#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) +extern "C" { +#endif + +#define core_hint_black_box(X, _0, _1) (X) + +// [ u8; 2 ] +typedef struct Eurydice_array_u8x2_s { + uint8_t data[2]; +} Eurydice_array_u8x2; + +// [ u8; 4 ] +typedef struct Eurydice_array_u8x4_s { + uint8_t data[4]; +} Eurydice_array_u8x4; + +// [ u8; 8 ] +typedef struct Eurydice_array_u8x8_s { + uint8_t data[8]; +} Eurydice_array_u8x8; + +static inline uint16_t core_num__u16__from_le_bytes(Eurydice_array_u8x2 buf) { + return load16_le(buf.data); +} + +static inline Eurydice_array_u8x4 core_num__u32__to_be_bytes(uint32_t src) { + // TODO: why not store32_be? + Eurydice_array_u8x4 a; + uint32_t x = htobe32(src); + memcpy(a.data, &x, 4); + return a; +} + +static inline Eurydice_array_u8x4 core_num__u32__to_le_bytes(uint32_t src) { + Eurydice_array_u8x4 a; + store32_le(a.data, src); + return a; +} + +static inline uint32_t core_num__u32__from_le_bytes(Eurydice_array_u8x4 buf) { + return load32_le(buf.data); +} + +static inline Eurydice_array_u8x8 core_num__u64__to_le_bytes(uint64_t v) { + Eurydice_array_u8x8 a; + store64_le(a.data, v); + return a; +} + +static inline uint64_t core_num__u64__from_le_bytes(Eurydice_array_u8x8 buf) { + return load64_le(buf.data); +} + +static inline int64_t core_convert_num__core__convert__From_i32__for_i64__from( + int32_t x) { + return x; +} + +static inline uint64_t core_convert_num__core__convert__From_u8__for_u64__from( + uint8_t x) { + return x; +} + +static inline uint64_t core_convert_num__core__convert__From_u16__for_u64__from( + uint16_t x) { + return x; +} + +static inline size_t core_convert_num__core__convert__From_u16__for_usize__from( + uint16_t x) { + return x; +} + +static inline uint32_t core_num__u8__count_ones(uint8_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +static inline uint32_t core_num__u32__count_ones(uint32_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +static inline uint32_t core_num__i32__count_ones(int32_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +static inline size_t core_cmp_impls__core__cmp__Ord_for_usize__min(size_t a, + size_t b) { + if (a <= b) + return a; + else + return b; +} + +// unsigned overflow wraparound semantics in C +static inline uint8_t core_num__u8__wrapping_sub(uint8_t x, uint8_t y) { + return x - y; +} +static inline uint8_t core_num__u8__wrapping_add(uint8_t x, uint8_t y) { + return x + y; +} +static inline uint8_t core_num__u8__wrapping_mul(uint8_t x, uint8_t y) { + return x * y; +} +static inline uint16_t core_num__u16__wrapping_sub(uint16_t x, uint16_t y) { + return x - y; +} +static inline uint16_t core_num__u16__wrapping_add(uint16_t x, uint16_t y) { + return x + y; +} +static inline uint16_t core_num__u16__wrapping_mul(uint16_t x, uint16_t y) { + return x * y; +} +static inline uint32_t core_num__u32__wrapping_sub(uint32_t x, uint32_t y) { + return x - y; +} +static inline uint32_t core_num__u32__wrapping_add(uint32_t x, uint32_t y) { + return x + y; +} +static inline uint32_t core_num__u32__wrapping_mul(uint32_t x, uint32_t y) { + return x * y; +} +static inline uint64_t core_num__u64__wrapping_sub(uint64_t x, uint64_t y) { + return x - y; +} +static inline uint64_t core_num__u64__wrapping_add(uint64_t x, uint64_t y) { + return x + y; +} +static inline uint64_t core_num__u64__wrapping_mul(uint64_t x, uint64_t y) { + return x * y; +} +static inline size_t core_num__usize__wrapping_sub(size_t x, size_t y) { + return x - y; +} +static inline size_t core_num__usize__wrapping_add(size_t x, size_t y) { + return x + y; +} +static inline size_t core_num__usize__wrapping_mul(size_t x, size_t y) { + return x * y; +} + +static inline int8_t core_num__i8__wrapping_add(int8_t x, int8_t y) { + return (int8_t)((uint8_t)x + (uint8_t)y); +} +static inline int8_t core_num__i8__wrapping_sub(int8_t x, int8_t y) { + return (int8_t)((uint8_t)x - (uint8_t)y); +} +static inline int8_t core_num__i8__wrapping_mul(int8_t x, int8_t y) { + return (int8_t)((uint8_t)x * (uint8_t)y); +} +static inline int16_t core_num__i16__wrapping_add(int16_t x, int16_t y) { + return (int16_t)((uint16_t)x + (uint16_t)y); +} +static inline int16_t core_num__i16__wrapping_sub(int16_t x, int16_t y) { + return (int16_t)((uint16_t)x - (uint16_t)y); +} +static inline int16_t core_num__i16__wrapping_mul(int16_t x, int16_t y) { + return (int16_t)((uint16_t)x * (uint16_t)y); +} +static inline int32_t core_num__i32__wrapping_add(int32_t x, int32_t y) { + return (int32_t)((uint32_t)x + (uint32_t)y); +} +static inline int32_t core_num__i32__wrapping_sub(int32_t x, int32_t y) { + return (int32_t)((uint32_t)x - (uint32_t)y); +} +static inline int32_t core_num__i32__wrapping_mul(int32_t x, int32_t y) { + return (int32_t)((uint32_t)x * (uint32_t)y); +} +static inline int64_t core_num__i64__wrapping_add(int64_t x, int64_t y) { + return (int64_t)((uint64_t)x + (uint64_t)y); +} +static inline int64_t core_num__i64__wrapping_sub(int64_t x, int64_t y) { + return (int64_t)((uint64_t)x - (uint64_t)y); +} +static inline int64_t core_num__i64__wrapping_mul(int64_t x, int64_t y) { + return (int64_t)((uint64_t)x * (uint64_t)y); +} +static inline int8_t core_num__i8__wrapping_neg(int8_t x) { + return (int8_t)(-(uint8_t)x); +} +static inline int16_t core_num__i16__wrapping_neg(int16_t x) { + return (int16_t)(-(uint16_t)x); +} +static inline int32_t core_num__i32__wrapping_neg(int32_t x) { + return (int32_t)(-(uint32_t)x); +} +static inline int64_t core_num__i64__wrapping_neg(int64_t x) { + return (int64_t)(-(uint64_t)x); +} + +static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1) { + return (x0 << x1) | (x0 >> ((-x1) & 63)); +} + +static inline void core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1) { + *x0 = *x0 + *x1; +} + +static inline uint8_t Eurydice_bitand_pv_u8(const uint8_t *p, uint8_t v) { + return (*p) & v; +} +static inline uint8_t Eurydice_shr_pv_u8(const uint8_t *p, int32_t v) { + return (*p) >> v; +} +static inline uint32_t Eurydice_min_u32(uint32_t x, uint32_t y) { + return x < y ? x : y; +} + +static inline uint8_t +core_ops_bit__core__ops__bit__BitAnd_u8__u8__for__0__u8___bitand( + const uint8_t *x0, uint8_t x1) { + return Eurydice_bitand_pv_u8(x0, x1); +} + +static inline uint8_t +core_ops_bit__core__ops__bit__Shr_i32__u8__for__0__u8___shr(const uint8_t *x0, + int32_t x1) { + return Eurydice_shr_pv_u8(x0, x1); +} + +#define core_num_nonzero_private_NonZeroUsizeInner size_t +static inline core_num_nonzero_private_NonZeroUsizeInner +core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner___clone( + core_num_nonzero_private_NonZeroUsizeInner *x0) { + return *x0; +} + +#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) +} +#endif + +// ITERATORS + +#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \ + (((iter_ptr)->start >= (iter_ptr)->end) \ + ? (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 0, \ + EURYDICE_CFIELD(.f0 =) 0}) \ + : (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 1, \ + EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++})) + +#define core_iter_range__core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___next \ + Eurydice_range_iter_next + +// See note in karamel/lib/Inlining.ml if you change this +#define Eurydice_into_iter(x, t, _ret_t, _) (x) +#define core_iter_traits_collect__core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__into_iter \ + Eurydice_into_iter + +// STRINGS + +typedef char Eurydice_c_char_t; +typedef const Eurydice_c_char_t *Prims_string; +typedef void Eurydice_c_void_t; + +// UNSAFE CODE + +#define core_slice___Slice_T___as_mut_ptr(x, t, _) (x.ptr) +#define core_mem_size_of(t, _) (sizeof(t)) +#define core_slice_raw_from_raw_parts_mut(ptr, len, _0, _1) \ + (KRML_CLITERAL(Eurydice_slice){(void *)(ptr), len}) +#define core_slice_raw_from_raw_parts(ptr, len, _0, _1) \ + (KRML_CLITERAL(Eurydice_slice){(void *)(ptr), len}) + +// FIXME: add dedicated extraction to extract NonNull<T> as T* +#define core_ptr_non_null_NonNull void * + +// PRINTING +// +// This is temporary. Ultimately we want to be able to extract all of this. + +typedef void *core_fmt_Formatter; +#define core_fmt_rt__core__fmt__rt__Argument__a___new_display(x1, x2, x3, x4) \ + NULL + +// BOXES + +#ifndef EURYDICE_MALLOC +#define EURYDICE_MALLOC malloc +#endif + +#ifndef EURYDICE_REALLOC +#define EURYDICE_REALLOC realloc +#endif + +static inline char *malloc_and_init(size_t sz, char *init) { + char *ptr = (char *)EURYDICE_MALLOC(sz); + if (ptr != NULL) memcpy(ptr, init, sz); + return ptr; +} + +#define Eurydice_box_new(init, t, t_dst) \ + ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init)))) + +// Initializer for array of size zero +#define Eurydice_empty_array(dummy, t, t_dst) ((t_dst){.data = {}}) + +#define Eurydice_box_new_array(len, ptr, t, t_dst) \ + ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr)))) + +// FIXME this needs to handle allocation failure errors, but this seems hard to +// do without evaluating malloc_and_init twice... +#define alloc_boxed__alloc__boxed__Box_T___try_new(init, t, t_ret) \ + ((t_ret){.tag = core_result_Ok, \ + .f0 = (t *)malloc_and_init(sizeof(t), (char *)(&init))}) + +// OPTIONS + +#define core_option__core__option__Option_T__TraitClause_0___is_some( \ + x, _of_type, _) \ + x->tag + +/* from libcrux/combined_extraction/generated/combined_core.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef combined_core_H +#define combined_core_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + +static inline uint32_t core_num__i32__count_ones(int32_t x0); + +static inline uint16_t core_num__u16__wrapping_add(uint16_t x0, uint16_t x1); + +static inline uint64_t core_num__u64__from_le_bytes(Eurydice_array_u8x8 x0); + +static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1); + +static inline Eurydice_array_u8x8 core_num__u64__to_le_bytes(uint64_t x0); + +static inline uint32_t core_num__u8__count_ones(uint8_t x0); + +static inline uint8_t core_num__u8__wrapping_sub(uint8_t x0, uint8_t x1); + +static inline uint8_t +core_ops_bit__core__ops__bit__BitAnd_u8__u8__for__0__u8___bitand(const uint8_t *x0, uint8_t x1); + +static inline uint8_t +core_ops_bit__core__ops__bit__Shr_i32__u8__for__0__u8___shr(const uint8_t *x0, int32_t x1); + +/** +A monomorphic instance of core.ops.range.Range +with types size_t + +*/ +typedef struct core_ops_range_Range_87_s +{ + size_t start; + size_t end; +} +core_ops_range_Range_87; + +/** +A monomorphic instance of Eurydice.slice_subslice_mut +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t + +*/ +static inline Eurydice_mut_borrow_slice_i16 +Eurydice_slice_subslice_mut_a6(Eurydice_mut_borrow_slice_i16 s, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_i16){ + .ptr = s.ptr + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_b2_s { uint8_t data[16U]; } Eurydice_arr_b2; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_b2 +with const generics +- $256size_t +*/ +typedef struct Eurydice_arr_87_s { Eurydice_arr_b2 data[256U]; } Eurydice_arr_87; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $24size_t +*/ +typedef struct Eurydice_arr_94_s { uint8_t data[24U]; } Eurydice_arr_94; + +#define core_result_Ok 0 +#define core_result_Err 1 + +typedef uint8_t core_result_Result_57_tags; + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_94, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_57_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_94 case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_57; + +/** +This function found in impl {core::result::Result<T, E>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$24size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_94 core_result_unwrap_26_78(core_result_Result_57 self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_d6_s { int16_t data[16U]; } Eurydice_arr_d6; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $20size_t +*/ +typedef struct Eurydice_arr_fc_s { uint8_t data[20U]; } Eurydice_arr_fc; + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_fc, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_83_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_fc case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_83; + +/** +This function found in impl {core::result::Result<T, E>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$20size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_fc core_result_unwrap_26_7d(core_result_Result_83 self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1184size_t +*/ +typedef struct Eurydice_arr_5f_s { uint8_t data[1184U]; } Eurydice_arr_5f; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f2(const Eurydice_arr_5f *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1184U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_to_shared +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_to_shared_210(const Eurydice_arr_5f *a, size_t r) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = r; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2400size_t +*/ +typedef struct Eurydice_arr_7d_s { uint8_t data[2400U]; } Eurydice_arr_7d; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 2400 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d48(const Eurydice_arr_7d *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1152size_t +*/ +typedef struct Eurydice_arr_0e_s { uint8_t data[1152U]; } Eurydice_arr_0e; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1152 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_f4(const Eurydice_arr_0e *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1152U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 2400 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d417(Eurydice_arr_7d *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1152 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_f4(Eurydice_arr_0e *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1152U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f4(Eurydice_arr_5f *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1184U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d416(Eurydice_arr_5f *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 24 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_ed(const Eurydice_arr_94 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)24U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $384size_t +*/ +typedef struct Eurydice_arr_b20_s { uint8_t data[384U]; } Eurydice_arr_b20; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 384 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d415(Eurydice_arr_b20 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 384 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_a9(const Eurydice_arr_b20 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)384U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $32size_t +*/ +typedef struct Eurydice_arr_ec_s { uint8_t data[32U]; } Eurydice_arr_ec; + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_ec, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_07_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_ec case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_07; + +/** +This function found in impl {core::result::Result<T, E>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$32size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_ec core_result_unwrap_26_39(core_result_Result_07 self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $64size_t +*/ +typedef struct Eurydice_arr_c7_s { uint8_t data[64U]; } Eurydice_arr_c7; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f1(const Eurydice_arr_c7 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)64U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d47(const Eurydice_arr_c7 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_ff(const Eurydice_arr_5f *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1184U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1088size_t +*/ +typedef struct Eurydice_arr_2b_s { uint8_t data[1088U]; } Eurydice_arr_2b; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f3(Eurydice_arr_2b *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1088U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d414(Eurydice_arr_2b *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 20 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_8f(const Eurydice_arr_fc *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)20U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $320size_t +*/ +typedef struct Eurydice_arr_b0_s { uint8_t data[320U]; } Eurydice_arr_b0; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 320 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d413(Eurydice_arr_b0 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 320 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_56(const Eurydice_arr_b0 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)320U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $256size_t +*/ +typedef struct Eurydice_arr_04_s { int16_t data[256U]; } Eurydice_arr_04; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int16_t +with const generics +- N= 256 +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_array_to_slice_shared_99(const Eurydice_arr_04 *a) +{ + Eurydice_borrow_slice_i16 lit; + lit.ptr = a->data; + lit.meta = (size_t)256U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $128size_t +*/ +typedef struct Eurydice_arr_89_s { uint8_t data[128U]; } Eurydice_arr_89; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_89 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_58_s { Eurydice_arr_89 data[3U]; } Eurydice_arr_58; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $33size_t +*/ +typedef struct Eurydice_arr_fa0_s { uint8_t data[33U]; } Eurydice_arr_fa0; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 33 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_b5(const Eurydice_arr_fa0 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)33U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_fa0 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_fd_s { Eurydice_arr_fa0 data[3U]; } Eurydice_arr_fd; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 33 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d412(Eurydice_arr_fa0 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $272size_t +*/ +typedef struct Eurydice_arr_5b_s { int16_t data[272U]; } Eurydice_arr_5b; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t +with const generics +- N= 272 +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_array_to_subslice_shared_e70(const Eurydice_arr_5b *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_i16){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $168size_t +*/ +typedef struct Eurydice_arr_c5_s { uint8_t data[168U]; } Eurydice_arr_c5; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d46(const Eurydice_arr_c5 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_c5 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_2c_s { Eurydice_arr_c5 data[3U]; } Eurydice_arr_2c; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_5b +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_b1_s { Eurydice_arr_5b data[3U]; } Eurydice_arr_b1; + +/** +A monomorphic instance of Eurydice.arr +with types size_t +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_eb_s { size_t data[3U]; } Eurydice_arr_eb; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t +with const generics +- N= 272 +*/ +static inline Eurydice_mut_borrow_slice_i16 +Eurydice_array_to_subslice_mut_e7(Eurydice_arr_5b *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_i16){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $504size_t +*/ +typedef struct Eurydice_arr_79_s { uint8_t data[504U]; } Eurydice_arr_79; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 504 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d45(const Eurydice_arr_79 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_79 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_7e_s { Eurydice_arr_79 data[3U]; } Eurydice_arr_7e; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 504 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_48(Eurydice_arr_79 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)504U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $34size_t +*/ +typedef struct Eurydice_arr_31_s { uint8_t data[34U]; } Eurydice_arr_31; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_31 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_810_s { Eurydice_arr_31 data[3U]; } Eurydice_arr_810; + +/** +A monomorphic instance of Eurydice.slice_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_slice_subslice_from_shared_6d(Eurydice_borrow_slice_u8 s, size_t r) +{ + return (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = s.ptr + r, .meta = s.meta - r }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1120size_t +*/ +typedef struct Eurydice_arr_af_s { uint8_t data[1120U]; } Eurydice_arr_af; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1120 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_81(const Eurydice_arr_af *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1120U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_06(const Eurydice_arr_2b *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1088U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1120 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f2(Eurydice_arr_af *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1120U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1120 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d411(Eurydice_arr_af *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f1(Eurydice_arr_c7 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)64U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d410(Eurydice_arr_c7 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f0(const Eurydice_arr_2b *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1088U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d44(const Eurydice_arr_2b *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2400 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_51(const Eurydice_arr_7d *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2400U; + return lit; +} + +typedef struct int16_t_x2_s +{ + int16_t fst; + int16_t snd; +} +int16_t_x2; + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$24size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_arr_94 +libcrux_secrets_int_public_integers_declassify_d8_40(Eurydice_arr_94 self) +{ + return self; +} + +typedef struct uint8_t_x3_s +{ + uint8_t fst; + uint8_t snd; + uint8_t thd; +} +uint8_t_x3; + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$20size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_arr_fc +libcrux_secrets_int_public_integers_declassify_d8_2b(Eurydice_arr_fc self) +{ + return self; +} + +typedef struct uint8_t_x5_s +{ + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; + uint8_t f4; +} +uint8_t_x5; + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$8size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_array_u8x8 +libcrux_secrets_int_public_integers_declassify_d8_52(Eurydice_array_u8x8 self) +{ + return self; +} + +typedef struct uint8_t_x4_s +{ + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; +} +uint8_t_x4; + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$2size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_array_u8x2 +libcrux_secrets_int_public_integers_declassify_d8_75(Eurydice_array_u8x2 self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types Eurydice_arr int16_t[[$16size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_secrets_int_public_integers_classify_27_4b(Eurydice_arr_d6 self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a ([T])> for &'a ([T])} +*/ +/** +A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_6d +with types uint8_t + +*/ +static KRML_MUSTINLINE Eurydice_borrow_slice_u8 +libcrux_secrets_int_classify_public_classify_ref_6d_90(Eurydice_borrow_slice_u8 self) +{ + return self; +} + +typedef struct int16_t_x8_s +{ + int16_t fst; + int16_t snd; + int16_t thd; + int16_t f3; + int16_t f4; + int16_t f5; + int16_t f6; + int16_t f7; +} +int16_t_x8; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t +with const generics +- N= 16 +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_array_to_subslice_shared_e7(const Eurydice_arr_d6 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_i16){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a ([T])> for &'a ([T])} +*/ +/** +A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_6d +with types int16_t + +*/ +static KRML_MUSTINLINE Eurydice_borrow_slice_i16 +libcrux_secrets_int_classify_public_classify_ref_6d_39(Eurydice_borrow_slice_i16 self) +{ + return self; +} + +/** +A monomorphic instance of Eurydice.slice_subslice_shared +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t + +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_slice_subslice_shared_a6(Eurydice_borrow_slice_i16 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_i16){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_d6, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_ec_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_d6 case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_ec; + +/** +This function found in impl {core::result::Result<T, E>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr int16_t[[$16size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_d6 core_result_unwrap_26_d3(core_result_Result_ec self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $128size_t +*/ +typedef struct Eurydice_arr_34_s { int16_t data[128U]; } Eurydice_arr_34; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 24 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d43(const Eurydice_arr_94 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 24 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d49(Eurydice_arr_94 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_29(Eurydice_arr_b2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d42(const Eurydice_arr_b2 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d48(Eurydice_arr_b2 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $19size_t +*/ +typedef struct Eurydice_arr_38_s { uint8_t data[19U]; } Eurydice_arr_38; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 19 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d41(const Eurydice_arr_38 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 19 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d47(Eurydice_arr_38 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types int32_t, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_83_s +{ + int32_t *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_83; + +/** +A monomorphic instance of Eurydice.slice_subslice_mut +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t + +*/ +static inline Eurydice_dst_ref_mut_83 +Eurydice_slice_subslice_mut_47(Eurydice_dst_ref_mut_83 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_mut_83){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_29(const Eurydice_arr_b2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_b2 +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_a30_s { Eurydice_arr_b2 data[16U]; } Eurydice_arr_a30; + +/** +A monomorphic instance of Eurydice.array_to_subslice_to_mut +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_to_mut_21(Eurydice_arr_ec *a, size_t r) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = r; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $4627size_t +*/ +typedef struct Eurydice_arr_93_s { uint8_t data[4627U]; } Eurydice_arr_93; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 4627 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_11(const Eurydice_arr_93 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4627U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2592size_t +*/ +typedef struct Eurydice_arr_43_s { uint8_t data[2592U]; } Eurydice_arr_43; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2592 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_fc(const Eurydice_arr_43 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2592U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $4896size_t +*/ +typedef struct Eurydice_arr_e2_s { uint8_t data[4896U]; } Eurydice_arr_e2; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 4896 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_f7(const Eurydice_arr_e2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4896U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types int32_t +with const generics +- $256size_t +*/ +typedef struct Eurydice_arr_6c_s { int32_t data[256U]; } Eurydice_arr_6c; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_6c +with const generics +- $8size_t +*/ +typedef struct Eurydice_arr_81_s { Eurydice_arr_6c data[8U]; } Eurydice_arr_81; + +#define core_option_None 0 +#define core_option_Some 1 + +typedef uint8_t core_option_Option_45_tags; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_81 + +*/ +typedef struct core_option_Option_45_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_81 f0; +} +core_option_Option_45; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_c7 + +*/ +typedef struct core_option_Option_b2_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_c7 f0; +} +core_option_Option_b2; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 4627 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_11(Eurydice_arr_93 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4627U; + return lit; +} + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types Eurydice_arr_6c, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_20_s +{ + const Eurydice_arr_6c *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_20; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_20 +Eurydice_array_to_slice_shared_861(const Eurydice_arr_81 *a) +{ + Eurydice_dst_ref_shared_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types Eurydice_arr_6c, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_20_s +{ + Eurydice_arr_6c *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_20; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_mut_20 Eurydice_array_to_slice_mut_861(Eurydice_arr_81 *a) +{ + Eurydice_dst_ref_mut_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr uint8_t[[$64size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_56(const Eurydice_arr_c7 *val) +{ + +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1024size_t +*/ +typedef struct Eurydice_arr_1b_s { uint8_t data[1024U]; } Eurydice_arr_1b; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1024 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_68(const Eurydice_arr_1b *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1024U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1024 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_68(Eurydice_arr_1b *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1024U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 2592 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_fc(Eurydice_arr_43 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2592U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 4896 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_f7(Eurydice_arr_e2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4896U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $3309size_t +*/ +typedef struct Eurydice_arr_0c_s { uint8_t data[3309U]; } Eurydice_arr_0c; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 3309 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_6b(const Eurydice_arr_0c *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)3309U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1952size_t +*/ +typedef struct Eurydice_arr_29_s { uint8_t data[1952U]; } Eurydice_arr_29; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1952 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_37(const Eurydice_arr_29 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1952U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $4032size_t +*/ +typedef struct Eurydice_arr_24_s { uint8_t data[4032U]; } Eurydice_arr_24; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 4032 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_98(const Eurydice_arr_24 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4032U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_6c +with const generics +- $6size_t +*/ +typedef struct Eurydice_arr_5d0_s { Eurydice_arr_6c data[6U]; } Eurydice_arr_5d0; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_5d0 + +*/ +typedef struct core_option_Option_05_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_5d0 f0; +} +core_option_Option_05; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $48size_t +*/ +typedef struct Eurydice_arr_65_s { uint8_t data[48U]; } Eurydice_arr_65; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_65 + +*/ +typedef struct core_option_Option_81_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_65 f0; +} +core_option_Option_81; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 3309 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_6b(Eurydice_arr_0c *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)3309U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_shared_20 +Eurydice_array_to_slice_shared_860(const Eurydice_arr_5d0 *a) +{ + Eurydice_dst_ref_shared_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_mut_20 Eurydice_array_to_slice_mut_860(Eurydice_arr_5d0 *a) +{ + Eurydice_dst_ref_mut_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 48 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_9f0(const Eurydice_arr_65 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)48U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr uint8_t[[$48size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_69(const Eurydice_arr_65 *val) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1952 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_37(Eurydice_arr_29 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1952U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 4032 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_98(Eurydice_arr_24 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4032U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2420size_t +*/ +typedef struct Eurydice_arr_85_s { uint8_t data[2420U]; } Eurydice_arr_85; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2420 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_0d(const Eurydice_arr_85 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2420U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1312size_t +*/ +typedef struct Eurydice_arr_02_s { uint8_t data[1312U]; } Eurydice_arr_02; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1312 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_9f(const Eurydice_arr_02 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1312U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2560size_t +*/ +typedef struct Eurydice_arr_10_s { uint8_t data[2560U]; } Eurydice_arr_10; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2560 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_34(const Eurydice_arr_10 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2560U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_6c +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_b7_s { Eurydice_arr_6c data[4U]; } Eurydice_arr_b7; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_b7 + +*/ +typedef struct core_option_Option_51_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_b7 f0; +} +core_option_Option_51; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_ec + +*/ +typedef struct core_option_Option_14_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_ec f0; +} +core_option_Option_14; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 2420 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_0d(Eurydice_arr_85 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2420U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_shared_20 +Eurydice_array_to_slice_shared_86(const Eurydice_arr_b7 *a) +{ + Eurydice_dst_ref_shared_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_mut_20 Eurydice_array_to_slice_mut_86(Eurydice_arr_b7 *a) +{ + Eurydice_dst_ref_mut_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t +with const generics +- N= 256 +*/ +static inline Eurydice_dst_ref_mut_83 +Eurydice_array_to_subslice_mut_44(Eurydice_arr_6c *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_mut_83){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types int32_t, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_83_s +{ + const int32_t *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_83; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int32_t +with const generics +- N= 256 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_slice_shared_af(const Eurydice_arr_6c *a) +{ + Eurydice_dst_ref_shared_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)256U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $136size_t +*/ +typedef struct Eurydice_arr_ff_s { uint8_t data[136U]; } Eurydice_arr_ff; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f(const Eurydice_arr_ff *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)136U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d40(const Eurydice_arr_ff *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr uint8_t[[$32size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_4b(const Eurydice_arr_ec *val) +{ + +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $768size_t +*/ +typedef struct Eurydice_arr_d2_s { uint8_t data[768U]; } Eurydice_arr_d2; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 768 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_27(const Eurydice_arr_d2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)768U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 768 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_27(Eurydice_arr_d2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)768U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $640size_t +*/ +typedef struct Eurydice_arr_20_s { uint8_t data[640U]; } Eurydice_arr_20; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 640 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_4f(const Eurydice_arr_20 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)640U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 640 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_4f(Eurydice_arr_20 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)640U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $576size_t +*/ +typedef struct Eurydice_arr_220_s { uint8_t data[576U]; } Eurydice_arr_220; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 576 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_8a(const Eurydice_arr_220 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)576U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 576 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_8a(Eurydice_arr_220 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)576U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $11size_t +*/ +typedef struct Eurydice_arr_c9_s { uint8_t data[11U]; } Eurydice_arr_c9; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 11 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_2f(const Eurydice_arr_c9 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)11U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_82_s { uint8_t data[1U]; } Eurydice_arr_82; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_79(const Eurydice_arr_82 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1U; + return lit; +} + +/** + Mark memory as secret. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_classify +with types Eurydice_derefed_slice uint8_t + +*/ +static KRML_MUSTINLINE void libcrux_secrets_mem_requests_ct_classify_45(const uint8_t (*val)[]) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1312 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_9f0(Eurydice_arr_02 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1312U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 2560 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_34(Eurydice_arr_10 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2560U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_17(const Eurydice_arr_c7 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)64U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types int32_t +with const generics +- $263size_t +*/ +typedef struct Eurydice_arr_d0_s { int32_t data[263U]; } Eurydice_arr_d0; + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types Eurydice_arr_d0, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_33_s +{ + Eurydice_arr_d0 *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_33; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_d0 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_930_s { Eurydice_arr_d0 data[4U]; } Eurydice_arr_930; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$263size_t]] +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_mut_33 Eurydice_array_to_slice_mut_7e(Eurydice_arr_930 *a) +{ + Eurydice_dst_ref_mut_33 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types Eurydice_arr_d0, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_33_s +{ + const Eurydice_arr_d0 *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_33; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $840size_t +*/ +typedef struct Eurydice_arr_d10_s { uint8_t data[840U]; } Eurydice_arr_d10; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 840 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_4c(const Eurydice_arr_d10 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)840U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 34 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_e9(const Eurydice_arr_31 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)34U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_derefed_slice uint8_t + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_45(const uint8_t (*val)[]) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int32_t +with const generics +- N= 263 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_slice_shared_2c0(const Eurydice_arr_d0 *a) +{ + Eurydice_dst_ref_shared_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)263U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types int32_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice int32_t +with const generics +- N= 263 +*/ +static inline Eurydice_dst_ref_mut_83 +Eurydice_array_to_subslice_from_mut_11(Eurydice_arr_d0 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_mut_83){ .ptr = a->data + r, .meta = (size_t)263U - r }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $66size_t +*/ +typedef struct Eurydice_arr_91_s { uint8_t data[66U]; } Eurydice_arr_91; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 66 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_f1(const Eurydice_arr_91 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)66U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 128 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_78(const Eurydice_arr_89 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)128U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 128 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_78(Eurydice_arr_89 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)128U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_82(const Eurydice_array_u8x2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_01(const Eurydice_arr_ec *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)32U; + return lit; +} + +/** + Mark memory as secret. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_classify +with types Eurydice_arr uint8_t[[$32size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_classify_4b(const Eurydice_arr_ec *val) +{ + +} + +typedef struct Eurydice_arr_c5_x4_s +{ + Eurydice_arr_c5 fst; + Eurydice_arr_c5 snd; + Eurydice_arr_c5 thd; + Eurydice_arr_c5 f3; +} +Eurydice_arr_c5_x4; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_2c(Eurydice_arr_c5 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)168U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 840 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_4c(Eurydice_arr_d10 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)840U; + return lit; +} + +typedef struct Eurydice_arr_ff_x4_s +{ + Eurydice_arr_ff fst; + Eurydice_arr_ff snd; + Eurydice_arr_ff thd; + Eurydice_arr_ff f3; +} +Eurydice_arr_ff_x4; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_58(Eurydice_arr_ff *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)136U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d4(const Eurydice_arr_ec *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_ff +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_dc0_s { Eurydice_arr_ff data[4U]; } Eurydice_arr_dc0; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_c5 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_9c_s { Eurydice_arr_c5 data[4U]; } Eurydice_arr_9c; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_borrow_slice_u8 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_68_s { Eurydice_borrow_slice_u8 data[4U]; } Eurydice_arr_68; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d46(Eurydice_arr_ec *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f0(Eurydice_arr_c5 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)168U - r }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_c5 +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_88_s { Eurydice_arr_c5 data[1U]; } Eurydice_arr_88; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_17(Eurydice_arr_c7 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)64U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 48 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_9f(Eurydice_arr_65 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)48U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_01(Eurydice_arr_ec *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)32U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $28size_t +*/ +typedef struct Eurydice_arr_a2_s { uint8_t data[28U]; } Eurydice_arr_a2; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 28 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_5e(Eurydice_arr_a2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)28U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $104size_t +*/ +typedef struct Eurydice_arr_c4_s { uint8_t data[104U]; } Eurydice_arr_c4; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 104 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_72(const Eurydice_arr_c4 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)104U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 104 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d45(Eurydice_arr_c4 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $144size_t +*/ +typedef struct Eurydice_arr_f4_s { uint8_t data[144U]; } Eurydice_arr_f4; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 144 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_38(const Eurydice_arr_f4 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)144U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 144 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d44(Eurydice_arr_f4 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $72size_t +*/ +typedef struct Eurydice_arr_ab_s { uint8_t data[72U]; } Eurydice_arr_ab; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 72 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_e2(const Eurydice_arr_ab *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)72U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 72 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d43(Eurydice_arr_ab *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.slice_subslice_to_shared +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_slice_subslice_to_shared_72(Eurydice_borrow_slice_u8 s, size_t r) +{ + return (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = s.ptr, .meta = r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f(Eurydice_arr_ff *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)136U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_to_shared +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 8 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_to_shared_21(const Eurydice_array_u8x8 *a, size_t r) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = r; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 8 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_6e(const Eurydice_array_u8x8 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.slice_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_slice_subslice_mut_c8(Eurydice_mut_borrow_slice_u8 s, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = s.ptr + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_58(const Eurydice_arr_ff *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)136U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d42(Eurydice_arr_ff *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint64_t +with const generics +- $5size_t +*/ +typedef struct Eurydice_arr_84_s { uint64_t data[5U]; } Eurydice_arr_84; + +typedef struct size_t_x2_s +{ + size_t fst; + size_t snd; +} +size_t_x2; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_borrow_slice_u8 +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_dc_s { Eurydice_borrow_slice_u8 data[1U]; } Eurydice_arr_dc; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_2c(const Eurydice_arr_c5 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)168U; + return lit; +} + +/** +A monomorphic instance of core.result.Result +with types Eurydice_array_u8x8, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_8e_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_array_u8x8 case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_8e; + +/** +This function found in impl {core::result::Result<T, E>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$8size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_array_u8x8 core_result_unwrap_26_e0(core_result_Result_8e self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d41(Eurydice_arr_c5 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint64_t +with const generics +- $24size_t +*/ +typedef struct Eurydice_arr_22_s { uint64_t data[24U]; } Eurydice_arr_22; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_ff +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_0b_s { Eurydice_arr_ff data[1U]; } Eurydice_arr_0b; + +/** +A monomorphic instance of Eurydice.arr +with types uint64_t +with const generics +- $25size_t +*/ +typedef struct Eurydice_arr_7c_s { uint64_t data[25U]; } Eurydice_arr_7c; + +/** +A monomorphic instance of Eurydice.slice_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_slice_subslice_shared_c8(Eurydice_borrow_slice_u8 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types int32_t +with const generics +- $8size_t +*/ +typedef struct Eurydice_arr_4d_s { int32_t data[8U]; } Eurydice_arr_4d; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_subslice_shared_44(const Eurydice_arr_4d *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_83){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types bool + +*/ +static KRML_MUSTINLINE void libcrux_secrets_mem_requests_ct_declassify_5f(const bool *val) +{ + +} + +typedef struct int32_t_x2_s +{ + int32_t fst; + int32_t snd; +} +int32_t_x2; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int32_t +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_slice_shared_fd(const Eurydice_arr_4d *a) +{ + Eurydice_dst_ref_shared_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.slice_subslice_shared +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t + +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_slice_subslice_shared_47(Eurydice_dst_ref_shared_83 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_shared_83){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types int32_t +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_mut_83 Eurydice_array_to_slice_mut_fd(Eurydice_arr_4d *a) +{ + Eurydice_dst_ref_mut_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_c9 + +*/ +typedef struct core_option_Option_57_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_c9 f0; +} +core_option_Option_57; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 34 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d40(Eurydice_arr_31 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +typedef struct uint8_t_x2_s +{ + uint8_t fst; + uint8_t snd; +} +uint8_t_x2; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 66 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d4(Eurydice_arr_91 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s +{ + Eurydice_arr_0e fst; + Eurydice_arr_5f snd; +} +libcrux_ml_kem_utils_extraction_helper_Keypair768; + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint64_t + +*/ +static KRML_MUSTINLINE uint64_t +libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint32_t + +*/ +static KRML_MUSTINLINE uint32_t +libcrux_secrets_int_public_integers_classify_27_df(uint32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint64_t + +*/ +static KRML_MUSTINLINE uint64_t +libcrux_secrets_int_public_integers_classify_27_49(uint64_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint16_t + +*/ +static KRML_MUSTINLINE uint16_t +libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint16_t + +*/ +static KRML_MUSTINLINE uint16_t +libcrux_secrets_int_public_integers_classify_27_de(uint16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint32_t + +*/ +static KRML_MUSTINLINE uint32_t +libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types int32_t + +*/ +static KRML_MUSTINLINE int32_t +libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types int32_t + +*/ +static KRML_MUSTINLINE int32_t libcrux_secrets_int_public_integers_classify_27_a8(int32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint8_t + +*/ +static KRML_MUSTINLINE uint8_t +libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types int16_t + +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_public_integers_classify_27_39(int16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types int16_t + +*/ +static KRML_MUSTINLINE int16_t +libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify<T> for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint8_t + +*/ +static KRML_MUSTINLINE uint8_t libcrux_secrets_int_public_integers_classify_27_90(uint8_t self) +{ + return self; +} + +#if defined(__cplusplus) +} +#endif + +#define combined_core_H_DEFINED +#endif /* combined_core_H */ + +/* from libcrux/combined_extraction/generated/libcrux_sha3_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_sha3_portable_H +#define libcrux_sha3_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState +with types uint64_t +with const generics +- $1size_t +*/ +typedef Eurydice_arr_7c libcrux_sha3_generic_keccak_KeccakState_f3; + +typedef libcrux_sha3_generic_keccak_KeccakState_f3 libcrux_sha3_portable_KeccakState; + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState +with types uint64_t +with const generics +- $1size_t +- $136size_t +*/ +typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_8d_s +{ + Eurydice_arr_7c inner; + Eurydice_arr_0b buf; + size_t buf_len; + bool sponge; +} +libcrux_sha3_generic_keccak_xof_KeccakXofState_8d; + +typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_sha3_portable_incremental_Shake256Xof; + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_zero_d2(void) +{ + return 0ULL; +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__veor5q_u64( + uint64_t a, + uint64_t b, + uint64_t c, + uint64_t d, + uint64_t e +) +{ + return (((a ^ b) ^ c) ^ d) ^ e; +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor5_d2(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) +{ + return libcrux_sha3_simd_portable__veor5q_u64(a, b, c, d, e); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_76(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)1); +} + +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a, uint64_t b) +{ + return a ^ libcrux_sha3_simd_portable_rotate_left_76(b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vrax1q_u64(a, b); +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) +{ + return a ^ (b & ~c); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a, uint64_t b, uint64_t c) +{ + return libcrux_sha3_simd_portable__vbcaxq_u64(a, b, c); +} + +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a, uint64_t c) +{ + return a ^ c; +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a, uint64_t c) +{ + return libcrux_sha3_simd_portable__veorq_n_u64(a, c); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor_d2(uint64_t a, uint64_t b) +{ + return a ^ b; +} + +/** + Create a new Shake128 x4 state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.new_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE Eurydice_arr_7c libcrux_sha3_generic_keccak_new_80_71(void) +{ + Eurydice_arr_7c lit; + uint64_t repeat_expression[25U]; + for (size_t i = (size_t)0U; i < (size_t)25U; i++) + { + repeat_expression[i] = libcrux_sha3_simd_portable_zero_d2(); + } + memcpy(lit.data, repeat_expression, (size_t)25U * sizeof (uint64_t)); + return lit; +} + +/** + Create a new SHAKE-128 state object. +*/ +static KRML_MUSTINLINE Eurydice_arr_7c libcrux_sha3_portable_incremental_shake128_init(void) +{ + return libcrux_sha3_generic_keccak_new_80_71(); +} + +#define LIBCRUX_SHA3_GENERIC_KECCAK_CONSTANTS_ROUNDCONSTANTS ((KRML_CLITERAL(Eurydice_arr_22){ .data = { 1ULL, 32898ULL, 9223372036854808714ULL, 9223372039002292224ULL, 32907ULL, 2147483649ULL, 9223372039002292353ULL, 9223372036854808585ULL, 138ULL, 136ULL, 2147516425ULL, 2147483658ULL, 2147516555ULL, 9223372036854775947ULL, 9223372036854808713ULL, 9223372036854808579ULL, 9223372036854808578ULL, 9223372036854775936ULL, 32778ULL, 9223372039002259466ULL, 9223372039002292353ULL, 9223372036854808704ULL, 2147483649ULL, 9223372039002292232ULL } })) + +/** +A monomorphic instance of libcrux_sha3.traits.get_ij +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE const +uint64_t +*libcrux_sha3_traits_get_ij_71(const Eurydice_arr_7c *arr, size_t i, size_t j) +{ + return &arr->data[(size_t)5U * j + i]; +} + +/** +A monomorphic instance of libcrux_sha3.traits.set_ij +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_traits_set_ij_71(Eurydice_arr_7c *arr, size_t i, size_t j, uint64_t value) +{ + arr->data[(size_t)5U * j + i] = value; +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_60( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 168 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_37( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_c5 buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d41(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 31U; + size_t uu____0 = (size_t)168U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_60(state, + Eurydice_array_to_slice_shared_2c(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 168 +- DELIMITER= 31 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_37( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_37(self, input->data[0U], start, len); +} + +/** + Get element `[i, j]`. +*/ +/** +This function found in impl {core::ops::index::Index<(usize, usize), T> for libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.index_c2 +with types uint64_t +with const generics +- N= 1 +*/ +static inline const +uint64_t +*libcrux_sha3_generic_keccak_index_c2_71(const Eurydice_arr_7c *self, size_t_x2 index) +{ + return libcrux_sha3_traits_get_ij_71(self, index.fst, index.snd); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.theta_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE Eurydice_arr_84 +libcrux_sha3_generic_keccak_theta_80_71(Eurydice_arr_7c *self) +{ + Eurydice_arr_84 + c = + { + .data = { + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)0U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)1U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)2U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)3U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)4U }))[0U]) + } + }; + return + ( + KRML_CLITERAL(Eurydice_arr_84){ + .data = { + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)0U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)0U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)1U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)1U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)2U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)2U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)3U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)3U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)4U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)4U + (size_t)1U) % (size_t)5U]) + } + } + ); +} + +/** + Set element `[i, j] = v`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.set_80 +with types uint64_t +with const generics +- N= 1 +*/ +static inline void +libcrux_sha3_generic_keccak_set_80_71(Eurydice_arr_7c *self, size_t i, size_t j, uint64_t v) +{ + libcrux_sha3_traits_set_ij_71(self, i, j, v); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_02(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)36); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_02(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_02(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)3); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_ac(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_ac(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_020(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)41); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_020(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_020(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)18); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_a9(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_a9(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_0_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_0_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_02(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_020(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)0U }))[0U], + t.data[0U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_76(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_76(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_58(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)44); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_58(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_58(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)10); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_e0(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_e0(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_63(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)45); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_63(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_63(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)2); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_6a(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_6a(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_1_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_1_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_76(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_58(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_63(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)1U }))[0U], + t.data[1U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)62); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_ab(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_ab(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)6); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_5b(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_5b(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)43); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_6f(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_6f(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_62(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)15); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_62(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_62(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_23(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)61); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_23(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_23(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_2_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_2_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_62(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_23(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)2U }))[0U], + t.data[2U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_37(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)28); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_37(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_37(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)55); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_bb(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_bb(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)25); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_b9(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_b9(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_54(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)21); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_54(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_54(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)56); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_4c(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_4c(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_3_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_3_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_37(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_54(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)3U }))[0U], + t.data[3U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)27); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_ce(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_ce(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_77(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)20); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_77(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_77(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_25(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)39); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_25(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_25(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_af(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)8); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_af(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_af(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)14); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_fd(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_fd(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_4_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_4_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_77(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_25(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_af(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)4U }))[0U], + t.data[4U])); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_rho_0_80_71(self, t); + libcrux_sha3_generic_keccak_rho_1_80_71(self, t); + libcrux_sha3_generic_keccak_rho_2_80_71(self, t); + libcrux_sha3_generic_keccak_rho_3_80_71(self, t); + libcrux_sha3_generic_keccak_rho_4_80_71(self, t); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_0_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_0_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)2U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_1_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_1_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)0U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)3U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_2_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_2_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)0U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)4U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_3_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_3_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)0U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_4_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_4_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)0U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)1U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_80_71(Eurydice_arr_7c *self) +{ + Eurydice_arr_7c old = self[0U]; + libcrux_sha3_generic_keccak_pi_0_80_71(self, old); + libcrux_sha3_generic_keccak_pi_1_80_71(self, old); + libcrux_sha3_generic_keccak_pi_2_80_71(self, old); + libcrux_sha3_generic_keccak_pi_3_80_71(self, old); + libcrux_sha3_generic_keccak_pi_4_80_71(self, old); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.chi_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_80_71(Eurydice_arr_7c *self) +{ + Eurydice_arr_7c old = self[0U]; + for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t j = i; + libcrux_sha3_generic_keccak_set_80_71(self, + i1, + j, + libcrux_sha3_simd_portable_and_not_xor_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = i1, .snd = j }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = i1, .snd = (j + (size_t)2U) % (size_t)5U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = i1, .snd = (j + (size_t)1U) % (size_t)5U }))[0U])); + } + } +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.iota_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_iota_80_71(Eurydice_arr_7c *self, size_t i) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_constant_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)0U }))[0U], + LIBCRUX_SHA3_GENERIC_KECCAK_CONSTANTS_ROUNDCONSTANTS.data[i])); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_keccakf1600_80_71(Eurydice_arr_7c *self) +{ + for (size_t i = (size_t)0U; i < (size_t)24U; i++) + { + size_t i0 = i; + Eurydice_arr_84 t = libcrux_sha3_generic_keccak_theta_80_71(self); + libcrux_sha3_generic_keccak_rho_80_71(self, t); + libcrux_sha3_generic_keccak_pi_80_71(self); + libcrux_sha3_generic_keccak_chi_80_71(self); + libcrux_sha3_generic_keccak_iota_80_71(self, i0); + } +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_37(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** + Absorb +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_absorb_final( + Eurydice_arr_7c *s, + Eurydice_borrow_slice_u8 data0 +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { data0 } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd(s, &lvalue, (size_t)0U, data0.meta); +} + +/** + Create a new SHAKE-256 state object. +*/ +static KRML_MUSTINLINE Eurydice_arr_7c libcrux_sha3_portable_incremental_shake256_init(void) +{ + return libcrux_sha3_generic_keccak_new_80_71(); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_b2( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 136 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_22( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_ff buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d42(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 31U; + size_t uu____0 = (size_t)136U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_b2(state, + Eurydice_array_to_slice_shared_58(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 136 +- DELIMITER= 31 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_22( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_22(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd0( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_22(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** + Absorb some data for SHAKE-256 for the last time +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_absorb_final( + Eurydice_arr_7c *s, + Eurydice_borrow_slice_u8 data +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { data } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd0(s, &lvalue, (size_t)0U, data.meta); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 168 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_60( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_60(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e9( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_60(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_60( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze<u64> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 168 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_60( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_60(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 168 +- DELIM= 31 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_37( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)168U; + size_t input_rem = input_len % (size_t)168U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e9(&s, &lvalue, i0 * (size_t)168U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)168U; + size_t output_rem = output_len % (size_t)168U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, (size_t)0U, (size_t)168U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, i0 * (size_t)168U, (size_t)168U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHAKE128 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_shake128( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_37(data, digest); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 136 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_b2( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_b2(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e90( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_b2(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_b2( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze<u64> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 136 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_b2( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_b2(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 136 +- DELIM= 31 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_22( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)136U; + size_t input_rem = input_len % (size_t)136U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e90(&s, &lvalue, i0 * (size_t)136U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd0(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)136U; + size_t output_rem = output_len % (size_t)136U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, (size_t)136U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, i0 * (size_t)136U, (size_t)136U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHAKE256 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_shake256( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_22(data, digest); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_first_block_b4 +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_b2( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_simd_portable_squeeze_9b_b2(self, out, (size_t)0U, (size_t)136U); +} + +/** + Squeeze the first SHAKE-256 block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_squeeze_first_block( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_b2(&s[0U], out); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_first_five_blocks_b4 +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_60( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)0U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)2U * (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)3U * (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)4U * (size_t)168U, (size_t)168U); +} + +/** + Squeeze five blocks +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out0 +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_60(s, out0); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_60( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start +) +{ + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, start, (size_t)168U); +} + +/** + Squeeze another block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_next_block( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out0 +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_60(s, out0, (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_b2( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start +) +{ + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_b2(self, out, start, (size_t)136U); +} + +/** + Squeeze the next SHAKE-256 block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_squeeze_next_block( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_b2(s, out, (size_t)0U); +} + +/** + Try to complete the internal partial buffer by consuming the minimum required + number of bytes from the provided `inputs` so that `self.buf` becomes exactly + one full block of size `RATE`. + + Behaviour: + - If `self.buf_len` is 0 (no buffered bytes) or already equal to `RATE` + (already a full block), or if the combined available bytes in `inputs` are + not enough to reach `RATE`, the function does nothing and returns 0. + - If `0 < self.buf_len < RATE` and `inputs[..]` contain at least + `RATE - self.buf_len` bytes, the function copies exactly + `consumed = RATE - self.buf_len` bytes from each lane `inputs[i]` into + `self.buf[i]` starting at the current `self.buf_len` offset, sets + `self.buf_len = RATE`, and returns `consumed`. + + Returns the `consumed` bytes from `inputs` if there's enough buffered + content to consume, and `0` otherwise. + If `consumed > 0` is returned, `self.buf` contains a full block to be + loaded. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_fill_buffer_35_e9( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + size_t input_len = inputs->data->meta; + size_t uu____0; + if (self->buf_len != (size_t)0U) + { + if (input_len >= (size_t)136U - self->buf_len) + { + size_t consumed = (size_t)136U - self->buf_len; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f(&self->buf.data[i0], + self->buf_len), + Eurydice_slice_subslice_to_shared_72(inputs->data[i0], consumed), + uint8_t); + } + self->buf_len = (size_t)136U; + uu____0 = consumed; + } + else + { + uu____0 = (size_t)0U; + } + } + else + { + uu____0 = (size_t)0U; + } + return uu____0; +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.closure +with const generics +- $1size_t +- $136size_t +*/ +typedef const Eurydice_arr_0b *libcrux_sha3_generic_keccak_xof_buf_to_slices_closure_94; + +/** +This function found in impl {core::ops::function::FnMut<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_mut_2a +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_81( + const Eurydice_arr_0b **_, + size_t tupled_args +) +{ + size_t i = tupled_args; + return + core_array___T__N___as_slice((size_t)136U, + &_[0U]->data[i], + uint8_t, + Eurydice_borrow_slice_u8); +} + +/** +This function found in impl {core::ops::function::FnOnce<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_once_fa +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_once_fa_81( + const Eurydice_arr_0b *_, + size_t _0 +) +{ + return libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_81(&_, _0); +} + +/** + Note: This function exists to work around a hax bug where `core::array::from_fn` + is extracted with an incorrect explicit type parameter `#(usize -> t_Slice u8)` + instead of using the typeclass-based implicit parameter `#v_F` from + `Core_models.Array.from_fn`. + See: https://github.com/cryspen/hax/issues/1920 +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE Eurydice_arr_dc +libcrux_sha3_generic_keccak_xof_buf_to_slices_81(const Eurydice_arr_0b *buf) +{ + Eurydice_arr_dc arr_struct; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + arr_struct.data[i] = libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_81(&buf, i); + } + return arr_struct; +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_absorb_full_35_e9( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + size_t consumed = libcrux_sha3_generic_keccak_xof_fill_buffer_35_e9(self, inputs); + if (self->buf_len == (size_t)136U) + { + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_81(&self->buf); + libcrux_sha3_simd_portable_load_block_a1_b2(&self->inner, &borrowed, (size_t)0U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + self->buf_len = (size_t)0U; + } + size_t input_to_consume = inputs->data->meta - consumed; + size_t num_blocks = input_to_consume / (size_t)136U; + size_t remainder = input_to_consume % (size_t)136U; + for (size_t i = (size_t)0U; i < num_blocks; i++) + { + size_t i0 = i; + size_t start = i0 * (size_t)136U + consumed; + libcrux_sha3_simd_portable_load_block_a1_b2(&self->inner, inputs, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + return remainder; +} + +/** + Absorb + + This function takes any number of bytes to absorb and buffers if it's not enough. + The function assumes that all input slices in `inputs` have the same length. + + Only a multiple of `RATE` blocks are absorbed. + For the remaining bytes [`absorb_final`] needs to be called. + + This works best with relatively small `inputs`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_35_e9( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + size_t remainder = libcrux_sha3_generic_keccak_xof_absorb_full_35_e9(self, inputs); + if (remainder > (size_t)0U) + { + size_t input_len = inputs->data->meta; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d42(&self->buf.data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = self->buf_len, + .end = self->buf_len + remainder + } + )), + Eurydice_slice_subslice_shared_c8(inputs->data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = input_len - remainder, + .end = input_len + } + )), + uint8_t); + } + self->buf_len += remainder; + } +} + +/** + Shake256 absorb +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_42( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_35_e9(self, &lvalue); +} + +/** + Absorb a final block. + + The `inputs` block may be empty. Everything in the `inputs` block beyond + `RATE` bytes is ignored. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_final_35_bd( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + libcrux_sha3_generic_keccak_xof_absorb_35_e9(self, inputs); + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_81(&self->buf); + libcrux_sha3_simd_portable_load_last_a1_22(&self->inner, &borrowed, (size_t)0U, self->buf_len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); +} + +/** + Shake256 absorb final +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_final_42( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_final_35_bd(self, &lvalue); +} + +/** + An all zero block +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline Eurydice_arr_ff libcrux_sha3_generic_keccak_xof_zero_block_35_e9(void) +{ + return (KRML_CLITERAL(Eurydice_arr_ff){ .data = { 0U } }); +} + +/** + Generate a new keccak xof state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_sha3_generic_keccak_xof_new_35_e9(void) +{ + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d lit; + lit.inner = libcrux_sha3_generic_keccak_new_80_71(); + Eurydice_arr_ff repeat_expression[1U]; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + repeat_expression[i] = libcrux_sha3_generic_keccak_xof_zero_block_35_e9(); + } + memcpy(lit.buf.data, repeat_expression, (size_t)1U * sizeof (Eurydice_arr_ff)); + lit.buf_len = (size_t)0U; + lit.sponge = false; + return lit; +} + +/** + Shake256 new state +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_sha3_portable_incremental_new_42(void) +{ + return libcrux_sha3_generic_keccak_xof_new_35_e9(); +} + +/** + Squeeze `N` x `LEN` bytes. Only `N = 1` for now. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 +with types uint64_t +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_squeeze_85_76( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + size_t out_len = out.meta; + if (!(out_len == (size_t)0U)) + { + if (self->sponge) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + if (out_len > (size_t)0U) + { + size_t blocks = out_len / (size_t)136U; + size_t last = out_len - out_len % (size_t)136U; + if (blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, out, (size_t)0U, out_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, out, (size_t)0U, (size_t)136U); + for (size_t i = (size_t)1U; i < blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, + out, + i0 * (size_t)136U, + (size_t)136U); + } + if (last < out_len) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, out, last, out_len - last); + } + } + } + self->sponge = true; + } +} + +/** + Shake256 squeeze +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_squeeze_42( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_xof_squeeze_85_76(self, out); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_c6( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 72 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_c6( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_c6(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e91( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_c6(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 72 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_dc( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_ab buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d43(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)72U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_c6(state, + Eurydice_array_to_slice_shared_e2(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 72 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_dc( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_dc(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd1( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_dc(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_c6( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze<u64> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 72 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_c6( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_c6(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 72 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_dc( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)72U; + size_t input_rem = input_len % (size_t)72U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e91(&s, &lvalue, i0 * (size_t)72U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd1(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)72U; + size_t output_rem = output_len % (size_t)72U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, (size_t)0U, (size_t)72U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, i0 * (size_t)72U, (size_t)72U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 512 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha512( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_dc(data, digest); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 136 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_220( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_ff buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d42(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)136U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_b2(state, + Eurydice_array_to_slice_shared_58(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 136 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_220( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_220(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd2( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_220(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 136 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_220( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)136U; + size_t input_rem = input_len % (size_t)136U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e90(&s, &lvalue, i0 * (size_t)136U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd2(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)136U; + size_t output_rem = output_len % (size_t)136U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, (size_t)136U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, i0 * (size_t)136U, (size_t)136U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 256 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha256( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_220(data, digest); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_first_three_blocks_b4 +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_60( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)0U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)2U * (size_t)168U, (size_t)168U); +} + +/** + Squeeze three blocks +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out0 +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_60(s, out0); +} + +#define libcrux_sha3_Algorithm_Sha224 1 +#define libcrux_sha3_Algorithm_Sha256 2 +#define libcrux_sha3_Algorithm_Sha384 3 +#define libcrux_sha3_Algorithm_Sha512 4 + +typedef uint8_t libcrux_sha3_Algorithm; + +#define LIBCRUX_SHA3_SHA3_224_DIGEST_SIZE ((size_t)28U) + +#define LIBCRUX_SHA3_SHA3_256_DIGEST_SIZE ((size_t)32U) + +#define LIBCRUX_SHA3_SHA3_384_DIGEST_SIZE ((size_t)48U) + +#define LIBCRUX_SHA3_SHA3_512_DIGEST_SIZE ((size_t)64U) + +/** + Returns the output size of a digest. +*/ +static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) +{ + switch (mode) + { + case libcrux_sha3_Algorithm_Sha224: + { + break; + } + case libcrux_sha3_Algorithm_Sha256: + { + return LIBCRUX_SHA3_SHA3_256_DIGEST_SIZE; + } + case libcrux_sha3_Algorithm_Sha384: + { + return LIBCRUX_SHA3_SHA3_384_DIGEST_SIZE; + } + case libcrux_sha3_Algorithm_Sha512: + { + return LIBCRUX_SHA3_SHA3_512_DIGEST_SIZE; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return LIBCRUX_SHA3_SHA3_224_DIGEST_SIZE; +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_9e( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 144 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_9e( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_9e(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e92( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_9e(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 144 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_3a( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_f4 buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d44(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)144U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_9e(state, + Eurydice_array_to_slice_shared_38(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 144 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_3a( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_3a(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd3( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_3a(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_9e( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze<u64> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 144 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_9e( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_9e(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 144 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_3a( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)144U; + size_t input_rem = input_len % (size_t)144U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e92(&s, &lvalue, i0 * (size_t)144U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd3(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)144U; + size_t output_rem = output_len % (size_t)144U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, (size_t)0U, (size_t)144U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, i0 * (size_t)144U, (size_t)144U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 224 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha224( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_3a(data, digest); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_53( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 104 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_53( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_53(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e93( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_53(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 104 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_dc0( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_c4 buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d45(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)104U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_53(state, + Eurydice_array_to_slice_shared_72(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 104 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_dc0( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_dc0(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd4( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_dc0(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_53( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze<u64> for libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 104 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_53( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_53(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 104 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_dc0( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)104U; + size_t input_rem = input_len % (size_t)104U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e93(&s, &lvalue, i0 * (size_t)104U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd4(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)104U; + size_t output_rem = output_len % (size_t)104U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, (size_t)0U, (size_t)104U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, i0 * (size_t)104U, (size_t)104U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 384 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha384( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_dc0(data, digest); +} + +/** + SHA3 224 + + Preconditions: + - `digest.len() == 28` +*/ +static inline void +libcrux_sha3_sha224_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha224(digest, payload); +} + +/** + SHA3 224 +*/ +static inline Eurydice_arr_a2 libcrux_sha3_sha224(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_a2 out = { .data = { 0U } }; + libcrux_sha3_sha224_ema(Eurydice_array_to_slice_mut_5e(&out), data); + return out; +} + +/** + SHA3 256 +*/ +static inline void +libcrux_sha3_sha256_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha256(digest, payload); +} + +/** + SHA3 256 +*/ +static inline Eurydice_arr_ec libcrux_sha3_sha256(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + libcrux_sha3_sha256_ema(Eurydice_array_to_slice_mut_01(&out), data); + return out; +} + +/** + SHA3 384 +*/ +static inline void +libcrux_sha3_sha384_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha384(digest, payload); +} + +/** + SHA3 384 +*/ +static inline Eurydice_arr_65 libcrux_sha3_sha384(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_65 out = { .data = { 0U } }; + libcrux_sha3_sha384_ema(Eurydice_array_to_slice_mut_9f(&out), data); + return out; +} + +/** + SHA3 512 +*/ +static inline void +libcrux_sha3_sha512_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha512(digest, payload); +} + +/** + SHA3 512 +*/ +static inline Eurydice_arr_c7 libcrux_sha3_sha512(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_c7 out = { .data = { 0U } }; + libcrux_sha3_sha512_ema(Eurydice_array_to_slice_mut_17(&out), data); + return out; +} + +/** + SHAKE 128 + + Writes `out.len()` bytes. +*/ +static inline void +libcrux_sha3_shake128_ema(Eurydice_mut_borrow_slice_u8 out, Eurydice_borrow_slice_u8 data) +{ + libcrux_sha3_portable_shake128(out, data); +} + +/** + SHAKE 256 + + Writes `out.len()` bytes. +*/ +static inline void +libcrux_sha3_shake256_ema(Eurydice_mut_borrow_slice_u8 out, Eurydice_borrow_slice_u8 data) +{ + libcrux_sha3_portable_shake256(out, data); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState +with types uint64_t +with const generics +- $1size_t +- $168size_t +*/ +typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_55_s +{ + Eurydice_arr_7c inner; + Eurydice_arr_88 buf; + size_t buf_len; + bool sponge; +} +libcrux_sha3_generic_keccak_xof_KeccakXofState_55; + +typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_55 +libcrux_sha3_portable_incremental_Shake128Xof; + +/** + Try to complete the internal partial buffer by consuming the minimum required + number of bytes from the provided `inputs` so that `self.buf` becomes exactly + one full block of size `RATE`. + + Behaviour: + - If `self.buf_len` is 0 (no buffered bytes) or already equal to `RATE` + (already a full block), or if the combined available bytes in `inputs` are + not enough to reach `RATE`, the function does nothing and returns 0. + - If `0 < self.buf_len < RATE` and `inputs[..]` contain at least + `RATE - self.buf_len` bytes, the function copies exactly + `consumed = RATE - self.buf_len` bytes from each lane `inputs[i]` into + `self.buf[i]` starting at the current `self.buf_len` offset, sets + `self.buf_len = RATE`, and returns `consumed`. + + Returns the `consumed` bytes from `inputs` if there's enough buffered + content to consume, and `0` otherwise. + If `consumed > 0` is returned, `self.buf` contains a full block to be + loaded. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_fill_buffer_35_e90( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + size_t input_len = inputs->data->meta; + size_t uu____0; + if (self->buf_len != (size_t)0U) + { + if (input_len >= (size_t)168U - self->buf_len) + { + size_t consumed = (size_t)168U - self->buf_len; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f0(&self->buf.data[i0], + self->buf_len), + Eurydice_slice_subslice_to_shared_72(inputs->data[i0], consumed), + uint8_t); + } + self->buf_len = (size_t)168U; + uu____0 = consumed; + } + else + { + uu____0 = (size_t)0U; + } + } + else + { + uu____0 = (size_t)0U; + } + return uu____0; +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.closure +with const generics +- $1size_t +- $168size_t +*/ +typedef const Eurydice_arr_88 *libcrux_sha3_generic_keccak_xof_buf_to_slices_closure_48; + +/** +This function found in impl {core::ops::function::FnMut<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_mut_2a +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_810( + const Eurydice_arr_88 **_, + size_t tupled_args +) +{ + size_t i = tupled_args; + return + core_array___T__N___as_slice((size_t)168U, + &_[0U]->data[i], + uint8_t, + Eurydice_borrow_slice_u8); +} + +/** +This function found in impl {core::ops::function::FnOnce<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_once_fa +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_once_fa_810( + const Eurydice_arr_88 *_, + size_t _0 +) +{ + return libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_810(&_, _0); +} + +/** + Note: This function exists to work around a hax bug where `core::array::from_fn` + is extracted with an incorrect explicit type parameter `#(usize -> t_Slice u8)` + instead of using the typeclass-based implicit parameter `#v_F` from + `Core_models.Array.from_fn`. + See: https://github.com/cryspen/hax/issues/1920 +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE Eurydice_arr_dc +libcrux_sha3_generic_keccak_xof_buf_to_slices_810(const Eurydice_arr_88 *buf) +{ + Eurydice_arr_dc arr_struct; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + arr_struct.data[i] = libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_810(&buf, i); + } + return arr_struct; +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_absorb_full_35_e90( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + size_t consumed = libcrux_sha3_generic_keccak_xof_fill_buffer_35_e90(self, inputs); + if (self->buf_len == (size_t)168U) + { + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_810(&self->buf); + libcrux_sha3_simd_portable_load_block_a1_60(&self->inner, &borrowed, (size_t)0U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + self->buf_len = (size_t)0U; + } + size_t input_to_consume = inputs->data->meta - consumed; + size_t num_blocks = input_to_consume / (size_t)168U; + size_t remainder = input_to_consume % (size_t)168U; + for (size_t i = (size_t)0U; i < num_blocks; i++) + { + size_t i0 = i; + size_t start = i0 * (size_t)168U + consumed; + libcrux_sha3_simd_portable_load_block_a1_60(&self->inner, inputs, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + return remainder; +} + +/** + Absorb + + This function takes any number of bytes to absorb and buffers if it's not enough. + The function assumes that all input slices in `inputs` have the same length. + + Only a multiple of `RATE` blocks are absorbed. + For the remaining bytes [`absorb_final`] needs to be called. + + This works best with relatively small `inputs`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_35_e90( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + size_t remainder = libcrux_sha3_generic_keccak_xof_absorb_full_35_e90(self, inputs); + if (remainder > (size_t)0U) + { + size_t input_len = inputs->data->meta; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d41(&self->buf.data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = self->buf_len, + .end = self->buf_len + remainder + } + )), + Eurydice_slice_subslice_shared_c8(inputs->data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = input_len - remainder, + .end = input_len + } + )), + uint8_t); + } + self->buf_len += remainder; + } +} + +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_35_e90(self, &lvalue); +} + +/** + Absorb a final block. + + The `inputs` block may be empty. Everything in the `inputs` block beyond + `RATE` bytes is ignored. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_final_35_bd0( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + libcrux_sha3_generic_keccak_xof_absorb_35_e90(self, inputs); + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_810(&self->buf); + libcrux_sha3_simd_portable_load_last_a1_37(&self->inner, &borrowed, (size_t)0U, self->buf_len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); +} + +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_final_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_final_35_bd0(self, &lvalue); +} + +/** + An all zero block +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline Eurydice_arr_c5 libcrux_sha3_generic_keccak_xof_zero_block_35_e90(void) +{ + return (KRML_CLITERAL(Eurydice_arr_c5){ .data = { 0U } }); +} + +/** + Generate a new keccak xof state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_55 +libcrux_sha3_generic_keccak_xof_new_35_e90(void) +{ + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 lit; + lit.inner = libcrux_sha3_generic_keccak_new_80_71(); + Eurydice_arr_c5 repeat_expression[1U]; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + repeat_expression[i] = libcrux_sha3_generic_keccak_xof_zero_block_35_e90(); + } + memcpy(lit.buf.data, repeat_expression, (size_t)1U * sizeof (Eurydice_arr_c5)); + lit.buf_len = (size_t)0U; + lit.sponge = false; + return lit; +} + +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_55 +libcrux_sha3_portable_incremental_new_26(void) +{ + return libcrux_sha3_generic_keccak_xof_new_35_e90(); +} + +/** + Squeeze `N` x `LEN` bytes. Only `N = 1` for now. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize, RATE>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 +with types uint64_t +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_squeeze_85_2a( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + size_t out_len = out.meta; + if (!(out_len == (size_t)0U)) + { + if (self->sponge) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + if (out_len > (size_t)0U) + { + size_t blocks = out_len / (size_t)168U; + size_t last = out_len - out_len % (size_t)168U; + if (blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, out, (size_t)0U, out_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, out, (size_t)0U, (size_t)168U); + for (size_t i = (size_t)1U; i < blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, + out, + i0 * (size_t)168U, + (size_t)168U); + } + if (last < out_len) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, out, last, out_len - last); + } + } + } + self->sponge = true; + } +} + +/** + Shake128 squeeze +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_squeeze_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_xof_squeeze_85_2a(self, out); +} + +/** +This function found in impl {core::clone::Clone for libcrux_sha3::portable::KeccakState} +*/ +static inline Eurydice_arr_7c libcrux_sha3_portable_clone_fe(const Eurydice_arr_7c *self) +{ + return self[0U]; +} + +/** +This function found in impl {core::clone::Clone for libcrux_sha3::Algorithm} +*/ +static inline libcrux_sha3_Algorithm libcrux_sha3_clone_e6(const libcrux_sha3_Algorithm *self) +{ + return self[0U]; +} + +/** +This function found in impl {core::convert::From<libcrux_sha3::Algorithm> for u32} +*/ +static inline uint32_t libcrux_sha3_from_6c(libcrux_sha3_Algorithm v) +{ + switch (v) + { + case libcrux_sha3_Algorithm_Sha224: + { + break; + } + case libcrux_sha3_Algorithm_Sha256: + { + return 2U; + } + case libcrux_sha3_Algorithm_Sha384: + { + return 3U; + } + case libcrux_sha3_Algorithm_Sha512: + { + return 4U; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return 1U; +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_sha3_portable_KeccakState +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_1b0_s { Eurydice_arr_7c data[3U]; } Eurydice_arr_1b0; + +#if defined(__cplusplus) +} +#endif + +#define libcrux_sha3_portable_H_DEFINED +#endif /* libcrux_sha3_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mlkem_core.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mlkem_core_H +#define libcrux_mlkem_core_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +#define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U) + +#define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U) + +#define LIBCRUX_ML_KEM_CONSTANTS_G_DIGEST_SIZE ((size_t)64U) + +#define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U) + +/** + K * BITS_PER_RING_ELEMENT / 8 + + [eurydice] Note that we can't use const generics here because that breaks + C extraction with eurydice. +*/ +static inline size_t libcrux_ml_kem_constants_ranked_bytes_per_ring_element(size_t rank) +{ + return rank * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U; +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE uint8_t libcrux_secrets_int_as_u8_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_90((uint8_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u8} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_59(uint8_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)(uint32_t)libcrux_secrets_int_public_integers_declassify_d8_90(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_a8((int32_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i32} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_36(int32_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)libcrux_secrets_int_public_integers_declassify_d8_a8(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u32} +*/ +static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_b8(uint32_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_a8((int32_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE uint16_t libcrux_secrets_int_as_u16_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_de((uint16_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u16} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_ca(uint16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)(uint32_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u16} +*/ +static KRML_MUSTINLINE uint64_t libcrux_secrets_int_as_u64_ca(uint16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_49((uint64_t)(uint32_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u64} +*/ +static KRML_MUSTINLINE uint32_t libcrux_secrets_int_as_u32_a3(uint64_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_df((uint32_t)libcrux_secrets_int_public_integers_declassify_d8_49(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u32} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_b8(uint32_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39(libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 32 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_utils_into_padded_array_ce(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d46(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::types::MlKemPrivateKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.default_d3 +with const generics +- SIZE= 2400 +*/ +static inline Eurydice_arr_7d libcrux_ml_kem_types_default_d3_79(void) +{ + return (KRML_CLITERAL(Eurydice_arr_7d){ .data = { 0U } }); +} + +/** +This function found in impl {core::convert::From<[u8; SIZE]> for libcrux_ml_kem::types::MlKemPublicKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_51 +with const generics +- SIZE= 1184 +*/ +static inline Eurydice_arr_5f libcrux_ml_kem_types_from_51_3d(Eurydice_arr_5f value) +{ + return value; +} + +typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s +{ + Eurydice_arr_7d sk; + Eurydice_arr_5f pk; +} +libcrux_ml_kem_mlkem768_MlKem768KeyPair; + +/** + Create a new [`MlKemKeyPair`] from the secret and public key. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_17 +with const generics +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_types_from_17_bc(Eurydice_arr_7d sk, Eurydice_arr_5f pk) +{ + return (KRML_CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){ .sk = sk, .pk = pk }); +} + +/** +This function found in impl {core::convert::From<[u8; SIZE]> for libcrux_ml_kem::types::MlKemPrivateKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_b2 +with const generics +- SIZE= 2400 +*/ +static inline Eurydice_arr_7d libcrux_ml_kem_types_from_b2_79(Eurydice_arr_7d value) +{ + return value; +} + +/** +A monomorphic instance of n-tuple +with types libcrux_ml_kem_mlkem768_MlKem768Ciphertext, Eurydice_arr_ec + +*/ +typedef struct tuple_f4_s +{ + Eurydice_arr_2b fst; + Eurydice_arr_ec snd; +} +tuple_f4; + +/** +This function found in impl {core::convert::From<[u8; SIZE]> for libcrux_ml_kem::types::MlKemCiphertext<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_19 +with const generics +- SIZE= 1088 +*/ +static inline Eurydice_arr_2b libcrux_ml_kem_types_from_19_52(Eurydice_arr_2b value) +{ + return value; +} + +/** + A reference to the raw byte slice. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_slice_e6 +with const generics +- SIZE= 1184 +*/ +static inline const +Eurydice_arr_5f +*libcrux_ml_kem_types_as_slice_e6_3d(const Eurydice_arr_5f *self) +{ + return self; +} + +/** + A reference to the raw byte slice. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_slice_a9 +with const generics +- SIZE= 1088 +*/ +static inline const +Eurydice_arr_2b +*libcrux_ml_kem_types_as_slice_a9_52(const Eurydice_arr_2b *self) +{ + return self; +} + +/** +A monomorphic instance of libcrux_ml_kem.utils.prf_input_inc +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE uint8_t +libcrux_ml_kem_utils_prf_input_inc_78(Eurydice_arr_fd *prf_inputs, uint8_t domain_separator) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + prf_inputs->data[i0].data[32U] = domain_separator; + domain_separator = (uint32_t)domain_separator + 1U; + } + return domain_separator; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 33 +*/ +static KRML_MUSTINLINE Eurydice_arr_fa0 +libcrux_ml_kem_utils_into_padded_array_29(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_fa0 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d412(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 34 +*/ +static KRML_MUSTINLINE Eurydice_arr_31 +libcrux_ml_kem_utils_into_padded_array_de(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_31 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d40(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** +This function found in impl {core::convert::AsRef<[u8]> for libcrux_ml_kem::types::MlKemCiphertext<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_ref_c1 +with const generics +- SIZE= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_ml_kem_types_as_ref_c1_52(const Eurydice_arr_2b *self) +{ + return Eurydice_array_to_slice_shared_06(self); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_af +libcrux_ml_kem_utils_into_padded_array_66(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_af out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d411(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 64 +*/ +static KRML_MUSTINLINE Eurydice_arr_c7 +libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_c7 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d410(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +typedef struct Eurydice_borrow_slice_u8_x4_s +{ + Eurydice_borrow_slice_u8 fst; + Eurydice_borrow_slice_u8 snd; + Eurydice_borrow_slice_u8 thd; + Eurydice_borrow_slice_u8 f3; +} +Eurydice_borrow_slice_u8_x4; + +typedef struct Eurydice_borrow_slice_u8_x2_s +{ + Eurydice_borrow_slice_u8 fst; + Eurydice_borrow_slice_u8 snd; +} +Eurydice_borrow_slice_u8_x2; + +/** + Unpack an incoming private key into it's different parts. + + We have this here in types to extract into a common core for C. +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.unpack_private_key +with const generics +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline Eurydice_borrow_slice_u8_x4 +libcrux_ml_kem_types_unpack_private_key_64(Eurydice_borrow_slice_u8 private_key) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(private_key, + (size_t)1152U, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 ind_cpa_secret_key = uu____0.fst; + Eurydice_borrow_slice_u8 secret_key0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(secret_key0, + (size_t)1184U, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 ind_cpa_public_key = uu____1.fst; + Eurydice_borrow_slice_u8 secret_key = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(secret_key, + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 ind_cpa_public_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 implicit_rejection_value = uu____2.snd; + return + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8_x4){ + .fst = ind_cpa_secret_key, + .snd = ind_cpa_public_key, + .thd = ind_cpa_public_key_hash, + .f3 = implicit_rejection_value + } + ); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mlkem_core_H_DEFINED +#endif /* libcrux_mlkem_core_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa_core.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa_core_H +#define libcrux_mldsa_core_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +#define libcrux_ml_dsa_constants_Eta_Two 2 +#define libcrux_ml_dsa_constants_Eta_Four 4 + +typedef uint8_t libcrux_ml_dsa_constants_Eta; + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_SIMD_UNITS_IN_RING_ELEMENT ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T ((size_t)13U) + +#define LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS_MINUS_ONE_BIT_LENGTH ((size_t)23U) + +#define LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_UPPER_PART_OF_T (LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS_MINUS_ONE_BIT_LENGTH - LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T) + +#define LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) + +#define LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN ((size_t)255U) + +#define LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS (8380417) + +#define LIBCRUX_ML_DSA_CONSTANTS_GAMMA2_V261_888 (261888) + +#define LIBCRUX_ML_DSA_CONSTANTS_GAMMA2_V95_232 (95232) + +typedef int32_t libcrux_ml_dsa_constants_Gamma2; + +#define LIBCRUX_ML_DSA_CONSTANTS_KEY_GENERATION_RANDOMNESS_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_MASK_SEED_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_MESSAGE_REPRESENTATIVE_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN ((size_t)814U) + +#define LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE (LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE (LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_UPPER_PART_OF_T * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SIGNING_RANDOMNESS_SIZE ((size_t)32U) + +static inline int32_t +libcrux_ml_dsa_constants_beta( + size_t ones_in_verifier_challenge, + libcrux_ml_dsa_constants_Eta eta +) +{ + size_t eta_val; + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + eta_val = (size_t)2U; + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + eta_val = (size_t)4U; + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return (int32_t)(ones_in_verifier_challenge * eta_val); +} + +static inline size_t +libcrux_ml_dsa_constants_commitment_ring_element_size(size_t bits_per_commitment_coefficient) +{ + return + bits_per_commitment_coefficient * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / + (size_t)8U; +} + +static inline size_t +libcrux_ml_dsa_constants_commitment_vector_size( + size_t bits_per_commitment_coefficient, + size_t rows_in_a +) +{ + return + libcrux_ml_dsa_constants_commitment_ring_element_size(bits_per_commitment_coefficient) * + rows_in_a; +} + +static inline size_t +libcrux_ml_dsa_constants_error_ring_element_size(size_t bits_per_error_coefficient) +{ + return + bits_per_error_coefficient * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)8U; +} + +static inline size_t +libcrux_ml_dsa_constants_gamma1_ring_element_size(size_t bits_per_gamma1_coefficient) +{ + return + bits_per_gamma1_coefficient * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / + (size_t)8U; +} + +static inline size_t +libcrux_ml_dsa_constants_signature_size( + size_t rows_in_a, + size_t columns_in_a, + size_t max_ones_in_hint, + size_t commitment_hash_size, + size_t bits_per_gamma1_coefficient +) +{ + return + commitment_hash_size + + columns_in_a * libcrux_ml_dsa_constants_gamma1_ring_element_size(bits_per_gamma1_coefficient) + + max_ones_in_hint + + rows_in_a; +} + +static inline size_t +libcrux_ml_dsa_constants_signing_key_size( + size_t rows_in_a, + size_t columns_in_a, + size_t error_ring_element_size +) +{ + return + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE + + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH + + (rows_in_a + columns_in_a) * error_ring_element_size + + rows_in_a * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE; +} + +static inline size_t libcrux_ml_dsa_constants_verification_key_size(size_t rows_in_a) +{ + return + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + + LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * rows_in_a * + (LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS_MINUS_ONE_BIT_LENGTH - + LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T) + / (size_t)8U; +} + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_COMMITMENT_COEFFICIENT ((size_t)6U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_ERROR_COEFFICIENT ((size_t)3U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_GAMMA1_COEFFICIENT ((size_t)18U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA (libcrux_ml_dsa_constants_Eta_Two) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT ((size_t)17U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2 ((LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS - 1) / 88) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT ((size_t)80U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE ((size_t)39U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_COMMITMENT_COEFFICIENT ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_ERROR_COEFFICIENT ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_GAMMA1_COEFFICIENT ((size_t)20U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A ((size_t)5U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE ((size_t)48U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA (libcrux_ml_dsa_constants_Eta_Four) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT ((size_t)19U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2 ((LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS - 1) / 32) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT ((size_t)55U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE ((size_t)49U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A ((size_t)6U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_COMMITMENT_COEFFICIENT ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_ERROR_COEFFICIENT ((size_t)3U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_GAMMA1_COEFFICIENT ((size_t)20U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A ((size_t)7U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA (libcrux_ml_dsa_constants_Eta_Two) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT ((size_t)19U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2 ((LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS - 1) / 32) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT ((size_t)75U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE ((size_t)60U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A ((size_t)8U) + +/** +This function found in impl {core::clone::Clone for libcrux_ml_dsa::constants::Eta} +*/ +static inline libcrux_ml_dsa_constants_Eta +libcrux_ml_dsa_constants_clone_54(const libcrux_ml_dsa_constants_Eta *self) +{ + return self[0U]; +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_encoding_error_chunk_size(libcrux_ml_dsa_constants_Eta eta) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + return (size_t)4U; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return (size_t)3U; +} + +#define libcrux_ml_dsa_types_VerificationError_MalformedHintError 0 +#define libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError 1 +#define libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError 2 +#define libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError 3 + +typedef uint8_t libcrux_ml_dsa_types_VerificationError; + +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_signature_set_hint( + Eurydice_dst_ref_mut_20 out_hint, + size_t i, + size_t j +) +{ + out_hint.ptr[i].data[j] = 1; +} + +#define LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT ((size_t)13U) + +#define LIBCRUX_ML_DSA_ENCODING_T1_DESERIALIZE_WINDOW ((size_t)10U) + +#define LIBCRUX_ML_DSA_ENCODING_T1_SERIALIZE_OUTPUT_BYTES_PER_SIMD_UNIT ((size_t)10U) + +#define LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE128_BLOCK_SIZE ((size_t)168U) + +#define LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE128_FIVE_BLOCKS_SIZE (LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE128_BLOCK_SIZE * (size_t)5U) + +#define LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE256_BLOCK_SIZE ((size_t)136U) + +static KRML_MUSTINLINE Eurydice_arr_91 +libcrux_ml_dsa_sample_add_error_domain_separator( + Eurydice_borrow_slice_u8 slice, + uint16_t domain_separator +) +{ + Eurydice_arr_91 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d4(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + out.data[64U] = (uint8_t)(uint32_t)domain_separator; + out.data[65U] = (uint8_t)((uint32_t)domain_separator >> 8U & 0xFFFFU); + return out; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_error_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_ERROR_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS (8380417) + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R (58728449ULL) + +static inline uint8_t_x2 +libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(size_t index, size_t width) +{ + return + (KRML_CLITERAL(uint8_t_x2){ .fst = (uint8_t)(index / width), .snd = (uint8_t)(index % width) }); +} + +static KRML_MUSTINLINE uint16_t libcrux_ml_dsa_sample_generate_domain_separator(uint8_t_x2 _) +{ + uint8_t row = _.fst; + uint8_t column = _.snd; + return (uint32_t)(uint16_t)(uint32_t)column | (uint32_t)(uint16_t)(uint32_t)row << 8U; +} + +static KRML_MUSTINLINE Eurydice_arr_31 +libcrux_ml_dsa_sample_add_domain_separator(Eurydice_borrow_slice_u8 slice, uint8_t_x2 indices) +{ + Eurydice_arr_31 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d40(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + uint16_t domain_separator = libcrux_ml_dsa_sample_generate_domain_separator(indices); + out.data[32U] = (uint8_t)(uint32_t)domain_separator; + out.data[33U] = (uint8_t)((uint32_t)domain_separator >> 8U & 0xFFFFU); + return out; +} + +#define libcrux_ml_dsa_types_SigningError_RejectionSamplingError 0 +#define libcrux_ml_dsa_types_SigningError_ContextTooLongError 1 + +typedef uint8_t libcrux_ml_dsa_types_SigningError; + +typedef struct libcrux_ml_dsa_pre_hash_DomainSeparationContext_s +{ + Eurydice_borrow_slice_u8 context; + core_option_Option_57 pre_hash_oid; +} +libcrux_ml_dsa_pre_hash_DomainSeparationContext; + +#define libcrux_ml_dsa_pre_hash_DomainSeparationError_ContextTooLongError 0 + +typedef uint8_t libcrux_ml_dsa_pre_hash_DomainSeparationError; + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_pre_hash_DomainSeparationContext, libcrux_ml_dsa_pre_hash_DomainSeparationError + +*/ +typedef struct core_result_Result_a8_s +{ + core_result_Result_57_tags tag; + union { + libcrux_ml_dsa_pre_hash_DomainSeparationContext case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationError case_Err; + } + val; +} +core_result_Result_a8; + +/** + `context` must be at most 255 bytes long. +*/ +/** +This function found in impl {libcrux_ml_dsa::pre_hash::DomainSeparationContext<'a>} +*/ +static inline core_result_Result_a8 +libcrux_ml_dsa_pre_hash_new_88( + Eurydice_borrow_slice_u8 context, + core_option_Option_57 pre_hash_oid +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + return + ( + KRML_CLITERAL(core_result_Result_a8){ + .tag = core_result_Ok, + .val = { .case_Ok = { .context = context, .pre_hash_oid = pre_hash_oid } } + } + ); + } + return + ( + KRML_CLITERAL(core_result_Result_a8){ + .tag = core_result_Err, + .val = { .case_Err = libcrux_ml_dsa_pre_hash_DomainSeparationError_ContextTooLongError } + } + ); +} + +/** + Returns the pre-hash OID, if any. +*/ +/** +This function found in impl {libcrux_ml_dsa::pre_hash::DomainSeparationContext<'a>} +*/ +static inline const +core_option_Option_57 +*libcrux_ml_dsa_pre_hash_pre_hash_oid_88( + const libcrux_ml_dsa_pre_hash_DomainSeparationContext *self +) +{ + return &self->pre_hash_oid; +} + +/** + Returns the context, guaranteed to be at most 255 bytes long. +*/ +/** +This function found in impl {libcrux_ml_dsa::pre_hash::DomainSeparationContext<'a>} +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_ml_dsa_pre_hash_context_88(const libcrux_ml_dsa_pre_hash_DomainSeparationContext *self) +{ + return self->context; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_commitment_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_COMMITMENT_COEFFICIENT)) + +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_inside_out_shuffle( + Eurydice_borrow_slice_u8 randomness, + size_t *out_index, + uint64_t *signs, + Eurydice_arr_6c *result +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta; i++) + { + size_t _cloop_j = i; + const uint8_t *byte = &randomness.ptr[_cloop_j]; + if (!done) + { + size_t sample_at = (size_t)(uint32_t)byte[0U]; + if (sample_at <= out_index[0U]) + { + result->data[out_index[0U]] = result->data[sample_at]; + out_index[0U]++; + result->data[sample_at] = 1 - 2 * (int32_t)(signs[0U] & 1ULL); + signs[0U] >>= 1U; + } + done = out_index[0U] == (size_t)256U; + } + } + return done; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA (libcrux_ml_dsa_constants_beta(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_GAMMA1_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_gamma1_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_PRE_HASH_SHAKE128_OID ((KRML_CLITERAL(Eurydice_arr_c9){ .data = { 6U, 9U, 96U, 134U, 72U, 1U, 101U, 3U, 4U, 2U, 11U } })) + +/** +This function found in impl {libcrux_ml_dsa::pre_hash::PreHash for libcrux_ml_dsa::pre_hash::SHAKE128_PH} +*/ +static inline Eurydice_arr_c9 libcrux_ml_dsa_pre_hash_oid_30(void) +{ + return LIBCRUX_ML_DSA_PRE_HASH_SHAKE128_OID; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_VERIFICATION_KEY_SIZE (libcrux_ml_dsa_constants_verification_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_SIGNATURE_SIZE (libcrux_ml_dsa_constants_signature_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_GAMMA1_COEFFICIENT)) + +typedef Eurydice_arr_4d libcrux_ml_dsa_simd_portable_vector_type_Coefficients; + +static KRML_MUSTINLINE Eurydice_arr_4d libcrux_ml_dsa_simd_portable_vector_type_zero(void) +{ + return (KRML_CLITERAL(Eurydice_arr_4d){ .data = { 0U } }); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline Eurydice_arr_4d libcrux_ml_dsa_simd_portable_zero_65(void) +{ + return libcrux_ml_dsa_simd_portable_vector_type_zero(); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_vector_type_from_coefficient_array( + Eurydice_dst_ref_shared_83 array, + Eurydice_arr_4d *out +) +{ + Eurydice_slice_copy(Eurydice_array_to_slice_mut_fd(out), + Eurydice_slice_subslice_shared_47(array, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT + } + )), + int32_t); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_from_coefficient_array_65( + Eurydice_dst_ref_shared_83 array, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_vector_type_from_coefficient_array(array, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_vector_type_to_coefficient_array( + const Eurydice_arr_4d *value, + Eurydice_dst_ref_mut_83 out +) +{ + Eurydice_slice_copy(out, Eurydice_array_to_slice_shared_fd(value), int32_t); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_to_coefficient_array_65( + const Eurydice_arr_4d *value, + Eurydice_dst_ref_mut_83 out +) +{ + libcrux_ml_dsa_simd_portable_vector_type_to_coefficient_array(value, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_add(Eurydice_arr_4d *lhs, const Eurydice_arr_4d *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs->data[uu____0] += rhs->data[i0]; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_add_65(Eurydice_arr_4d *lhs, const Eurydice_arr_4d *rhs) +{ + libcrux_ml_dsa_simd_portable_arithmetic_add(lhs, rhs); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_subtract( + Eurydice_arr_4d *lhs, + const Eurydice_arr_4d *rhs +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs->data[uu____0] -= rhs->data[i0]; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_subtract_65(Eurydice_arr_4d *lhs, const Eurydice_arr_4d *rhs) +{ + libcrux_ml_dsa_simd_portable_arithmetic_subtract(lhs, rhs); +} + +static KRML_MUSTINLINE bool +libcrux_ml_dsa_simd_portable_arithmetic_infinity_norm_exceeds( + const Eurydice_arr_4d *simd_unit, + int32_t bound +) +{ + bool result = false; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t coefficient = simd_unit->data[i0]; + int32_t sign = coefficient >> 31U; + int32_t normalized = coefficient - (sign & 2 * coefficient); + bool uu____0; + if (result) + { + uu____0 = true; + } + else + { + uu____0 = normalized >= bound; + } + result = uu____0; + } + return result; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline bool +libcrux_ml_dsa_simd_portable_infinity_norm_exceeds_65( + const Eurydice_arr_4d *simd_unit, + int32_t bound +) +{ + return libcrux_ml_dsa_simd_portable_arithmetic_infinity_norm_exceeds(simd_unit, bound); +} + +static KRML_MUSTINLINE int32_t_x2 +libcrux_ml_dsa_simd_portable_arithmetic_decompose_element(int32_t gamma2, int32_t r) +{ + int32_t r0 = r + (r >> 31U & LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS); + int32_t ceil_of_r_by_128 = (r0 + 127) >> 7U; + int32_t r1; + switch (gamma2) + { + case 95232: + { + int32_t result = (ceil_of_r_by_128 * 11275 + (int32_t)((uint32_t)1 << 23U)) >> 24U; + int32_t result_0 = (result ^ (43 - result) >> 31U) & result; + r1 = result_0; + break; + } + case 261888: + { + int32_t result = (ceil_of_r_by_128 * 1025 + (int32_t)((uint32_t)1 << 21U)) >> 22U; + int32_t result_0 = result & 15; + r1 = result_0; + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + int32_t alpha = gamma2 * 2; + int32_t r00 = r0 - r1 * alpha; + r00 -= + ((LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS - 1) / 2 - r00) >> 31U & + LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS; + return (KRML_CLITERAL(int32_t_x2){ .fst = r00, .snd = r1 }); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_decompose( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *low, + Eurydice_arr_4d *high +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t_x2 + uu____0 = + libcrux_ml_dsa_simd_portable_arithmetic_decompose_element(gamma2, + simd_unit->data[i0]); + int32_t uu____1 = uu____0.snd; + low->data[i0] = uu____0.fst; + high->data[i0] = uu____1; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_decompose_65( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *low, + Eurydice_arr_4d *high +) +{ + libcrux_ml_dsa_simd_portable_arithmetic_decompose(gamma2, simd_unit, low, high); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_compute_one_hint( + int32_t low, + int32_t high, + int32_t gamma2 +) +{ + int32_t uu____0; + if (low > gamma2) + { + uu____0 = 1; + } + else if (low < -gamma2) + { + uu____0 = 1; + } + else if (low == -gamma2) + { + if (high != 0) + { + uu____0 = 1; + } + else + { + uu____0 = 0; + } + } + else + { + uu____0 = 0; + } + return uu____0; +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_arithmetic_compute_hint( + const Eurydice_arr_4d *low, + const Eurydice_arr_4d *high, + int32_t gamma2, + Eurydice_arr_4d *hint +) +{ + size_t one_hints_count = (size_t)0U; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + hint->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_compute_one_hint(low->data[i0], + high->data[i0], + gamma2); + one_hints_count += (size_t)hint->data[i0]; + } + return one_hints_count; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_compute_hint_65( + const Eurydice_arr_4d *low, + const Eurydice_arr_4d *high, + int32_t gamma2, + Eurydice_arr_4d *hint +) +{ + return libcrux_ml_dsa_simd_portable_arithmetic_compute_hint(low, high, gamma2, hint); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_use_one_hint(int32_t gamma2, int32_t r, int32_t hint) +{ + int32_t_x2 uu____0 = libcrux_ml_dsa_simd_portable_arithmetic_decompose_element(gamma2, r); + int32_t r0 = uu____0.fst; + int32_t r1 = uu____0.snd; + int32_t uu____1; + if (!(hint == 0)) + { + switch (gamma2) + { + case 95232: + { + if (r0 > 0) + { + if (r1 == 43) + { + uu____1 = 0; + } + else + { + uu____1 = r1 + hint; + } + } + else if (r1 == 0) + { + uu____1 = 43; + } + else + { + uu____1 = r1 - hint; + } + break; + } + case 261888: + { + if (r0 > 0) + { + uu____1 = (r1 + hint) & 15; + } + else + { + uu____1 = (r1 - hint) & 15; + } + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + return uu____1; + } + return r1; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_use_hint( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *hint +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t + uu____0 = + libcrux_ml_dsa_simd_portable_arithmetic_use_one_hint(gamma2, + simd_unit->data[i0], + hint->data[i0]); + hint->data[i0] = uu____0; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_use_hint_65( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *hint +) +{ + libcrux_ml_dsa_simd_portable_arithmetic_use_hint(gamma2, simd_unit, hint); +} + +static KRML_MUSTINLINE uint64_t +libcrux_ml_dsa_simd_portable_arithmetic_get_n_least_significant_bits(uint8_t n, uint64_t value) +{ + return value & ((1ULL << (uint32_t)n) - 1ULL); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (32U) + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element(int64_t value) +{ + uint64_t + t = + libcrux_ml_dsa_simd_portable_arithmetic_get_n_least_significant_bits(LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT, + (uint64_t)value) + * LIBCRUX_ML_DSA_SIMD_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R; + int32_t + k = + (int32_t)libcrux_ml_dsa_simd_portable_arithmetic_get_n_least_significant_bits(LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT, + t); + int64_t k_times_modulus = (int64_t)k * (int64_t)LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS; + int32_t + c = + (int32_t)(k_times_modulus >> (uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + int32_t + value_high = + (int32_t)(value >> (uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + return value_high - c; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply( + Eurydice_arr_4d *lhs, + const Eurydice_arr_4d *rhs +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + lhs->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element((int64_t)lhs->data[i0] * + (int64_t)rhs->data[i0]); + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_montgomery_multiply_65( + Eurydice_arr_4d *lhs, + const Eurydice_arr_4d *rhs +) +{ + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply(lhs, rhs); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_element(int32_t fe) +{ + int32_t quotient = (fe + (int32_t)((uint32_t)1 << 22U)) >> 23U; + return fe - quotient * LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS; +} + +static inline void +libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_simd_unit(Eurydice_arr_4d *simd_unit) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + simd_unit->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_element(simd_unit->data[i0]); + } +} + +static KRML_MUSTINLINE int32_t_x2 +libcrux_ml_dsa_simd_portable_arithmetic_power2round_element(int32_t t) +{ + int32_t t2 = t + (t >> 31U & LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS); + int32_t + t1 = + (t2 - 1 + + (int32_t)((uint32_t)1 << + (uint32_t)(LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T - (size_t)1U))) + >> (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T; + int32_t + t0 = t2 - (int32_t)((uint32_t)t1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T); + return (KRML_CLITERAL(int32_t_x2){ .fst = t0, .snd = t1 }); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_power2round(Eurydice_arr_4d *t0, Eurydice_arr_4d *t1) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t_x2 uu____0 = libcrux_ml_dsa_simd_portable_arithmetic_power2round_element(t0->data[i0]); + int32_t uu____1 = uu____0.snd; + t0->data[i0] = uu____0.fst; + t1->data[i0] = uu____1; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_power2round_65(Eurydice_arr_4d *t0, Eurydice_arr_4d *t1) +{ + libcrux_ml_dsa_simd_portable_arithmetic_power2round(t0, t1); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_field_modulus( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)3U; i++) + { + size_t i0 = i; + int32_t b0 = (int32_t)(uint32_t)randomness.ptr[i0 * (size_t)3U]; + int32_t b1 = (int32_t)(uint32_t)randomness.ptr[i0 * (size_t)3U + (size_t)1U]; + int32_t b2 = (int32_t)(uint32_t)randomness.ptr[i0 * (size_t)3U + (size_t)2U]; + int32_t + coefficient = (((int32_t)((uint32_t)b2 << 16U) | (int32_t)((uint32_t)b1 << 8U)) | b0) & 8388607; + if (coefficient < LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS) + { + out.ptr[sampled] = coefficient; + sampled++; + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_rejection_sample_less_than_field_modulus_65( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + return + libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_field_modulus(randomness, + out); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_2( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < randomness.meta; i++) + { + size_t i0 = i; + uint8_t byte = randomness.ptr[i0]; + uint8_t try_0 = (uint32_t)byte & 15U; + uint8_t try_1 = (uint32_t)byte >> 4U; + bool try_0_comp = try_0 < 15U; + bool try_1_comp = try_1 < 15U; + if (try_0_comp) + { + int32_t try_00 = (int32_t)(uint32_t)try_0; + int32_t try_0_mod_5 = try_00 - (try_00 * 26 >> 7U) * 5; + out.ptr[sampled] = 2 - try_0_mod_5; + sampled++; + } + if (try_1_comp) + { + int32_t try_10 = (int32_t)(uint32_t)try_1; + int32_t try_1_mod_5 = try_10 - (try_10 * 26 >> 7U) * 5; + out.ptr[sampled] = 2 - try_1_mod_5; + sampled++; + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_2_65( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + return + libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_2(randomness, + out); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_4( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < randomness.meta; i++) + { + size_t i0 = i; + uint8_t byte = randomness.ptr[i0]; + uint8_t try_0 = (uint32_t)byte & 15U; + uint8_t try_1 = (uint32_t)byte >> 4U; + bool try_0_comp = try_0 < 9U; + bool try_1_comp = try_1 < 9U; + if (try_0_comp) + { + out.ptr[sampled] = 4 - (int32_t)(uint32_t)try_0; + sampled++; + } + if (try_1_comp) + { + out.ptr[sampled] = 4 - (int32_t)(uint32_t)try_1; + sampled++; + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_4_65( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + return + libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_4(randomness, + out); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 ((int32_t)((uint32_t)1 << 19U)) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_19( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)2U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)2U, + .end = i0 * (size_t)2U + (size_t)2U + } + )); + int32_t + coefficient0 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficients.ptr[0U]; + int32_t + coefficient1 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficients.ptr[1U]; + serialized.ptr[(size_t)5U * i0] = (uint8_t)coefficient0; + serialized.ptr[(size_t)5U * i0 + (size_t)1U] = (uint8_t)(coefficient0 >> 8U); + serialized.ptr[(size_t)5U * i0 + (size_t)2U] = (uint8_t)(coefficient0 >> 16U); + size_t uu____0 = (size_t)5U * i0 + (size_t)2U; + serialized.ptr[uu____0] = + (uint32_t)serialized.ptr[uu____0] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient1 << 4U); + serialized.ptr[(size_t)5U * i0 + (size_t)3U] = (uint8_t)(coefficient1 >> 4U); + serialized.ptr[(size_t)5U * i0 + (size_t)4U] = (uint8_t)(coefficient1 >> 12U); + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 ((int32_t)((uint32_t)1 << 17U)) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_17( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)4U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)4U, + .end = i0 * (size_t)4U + (size_t)4U + } + )); + int32_t + coefficient0 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[0U]; + int32_t + coefficient1 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[1U]; + int32_t + coefficient2 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[2U]; + int32_t + coefficient3 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[3U]; + serialized.ptr[(size_t)9U * i0] = (uint8_t)coefficient0; + serialized.ptr[(size_t)9U * i0 + (size_t)1U] = (uint8_t)(coefficient0 >> 8U); + serialized.ptr[(size_t)9U * i0 + (size_t)2U] = (uint8_t)(coefficient0 >> 16U); + size_t uu____0 = (size_t)9U * i0 + (size_t)2U; + serialized.ptr[uu____0] = + (uint32_t)serialized.ptr[uu____0] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient1 << 2U); + serialized.ptr[(size_t)9U * i0 + (size_t)3U] = (uint8_t)(coefficient1 >> 6U); + serialized.ptr[(size_t)9U * i0 + (size_t)4U] = (uint8_t)(coefficient1 >> 14U); + size_t uu____1 = (size_t)9U * i0 + (size_t)4U; + serialized.ptr[uu____1] = + (uint32_t)serialized.ptr[uu____1] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient2 << 4U); + serialized.ptr[(size_t)9U * i0 + (size_t)5U] = (uint8_t)(coefficient2 >> 4U); + serialized.ptr[(size_t)9U * i0 + (size_t)6U] = (uint8_t)(coefficient2 >> 12U); + size_t uu____2 = (size_t)9U * i0 + (size_t)6U; + serialized.ptr[uu____2] = + (uint32_t)serialized.ptr[uu____2] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient3 << 6U); + serialized.ptr[(size_t)9U * i0 + (size_t)7U] = (uint8_t)(coefficient3 >> 2U); + serialized.ptr[(size_t)9U * i0 + (size_t)8U] = (uint8_t)(coefficient3 >> 10U); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized, + size_t gamma1_exponent +) +{ + switch (gamma1_exponent) + { + case 17U: + { + break; + } + case 19U: + { + libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_19(simd_unit, + serialized); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_17(simd_unit, + serialized); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_gamma1_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized, + size_t gamma1_exponent +) +{ + libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize(simd_unit, serialized, gamma1_exponent); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 ((int32_t)((uint32_t)1 << 19U)) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1_TIMES_2_BITMASK ((int32_t)((uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 << 1U) - 1) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_19( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)5U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)5U, + .end = i0 * (size_t)5U + (size_t)5U + } + )); + int32_t coefficient0 = (int32_t)(uint32_t)bytes.ptr[0U]; + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[1U] << 8U); + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[2U] << 16U); + coefficient0 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient1 = (int32_t)(uint32_t)bytes.ptr[2U] >> 4U; + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[3U] << 4U); + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[4U] << 12U); + simd_unit->data[(size_t)2U * i0] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficient0; + simd_unit->data[(size_t)2U * i0 + (size_t)1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficient1; + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 ((int32_t)((uint32_t)1 << 17U)) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK ((int32_t)((uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 << 1U) - 1) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_17( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)9U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)9U, + .end = i0 * (size_t)9U + (size_t)9U + } + )); + int32_t coefficient0 = (int32_t)(uint32_t)bytes.ptr[0U]; + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[1U] << 8U); + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[2U] << 16U); + coefficient0 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient1 = (int32_t)(uint32_t)bytes.ptr[2U] >> 2U; + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[3U] << 6U); + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[4U] << 14U); + coefficient1 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient2 = (int32_t)(uint32_t)bytes.ptr[4U] >> 4U; + coefficient2 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[5U] << 4U); + coefficient2 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[6U] << 12U); + coefficient2 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient3 = (int32_t)(uint32_t)bytes.ptr[6U] >> 6U; + coefficient3 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[7U] << 2U); + coefficient3 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[8U] << 10U); + coefficient3 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + simd_unit->data[(size_t)4U * i0] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient0; + simd_unit->data[(size_t)4U * i0 + (size_t)1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient1; + simd_unit->data[(size_t)4U * i0 + (size_t)2U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient2; + simd_unit->data[(size_t)4U * i0 + (size_t)3U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient3; + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out, + size_t gamma1_exponent +) +{ + switch (gamma1_exponent) + { + case 17U: + { + break; + } + case 19U: + { + libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_19(serialized, + out); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_17(serialized, + out); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_gamma1_deserialize_65( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out, + size_t gamma1_exponent +) +{ + libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize(serialized, out, gamma1_exponent); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_4( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + uint8_t coefficient0 = (uint8_t)simd_unit->data[0U]; + uint8_t coefficient1 = (uint8_t)simd_unit->data[1U]; + uint8_t coefficient2 = (uint8_t)simd_unit->data[2U]; + uint8_t coefficient3 = (uint8_t)simd_unit->data[3U]; + uint8_t coefficient4 = (uint8_t)simd_unit->data[4U]; + uint8_t coefficient5 = (uint8_t)simd_unit->data[5U]; + uint8_t coefficient6 = (uint8_t)simd_unit->data[6U]; + uint8_t coefficient7 = (uint8_t)simd_unit->data[7U]; + uint8_t byte0 = (uint32_t)coefficient1 << 4U | (uint32_t)coefficient0; + uint8_t byte1 = (uint32_t)coefficient3 << 4U | (uint32_t)coefficient2; + uint8_t byte2 = (uint32_t)coefficient5 << 4U | (uint32_t)coefficient4; + uint8_t byte3 = (uint32_t)coefficient7 << 4U | (uint32_t)coefficient6; + serialized.ptr[0U] = byte0; + serialized.ptr[1U] = byte1; + serialized.ptr[2U] = byte2; + serialized.ptr[3U] = byte3; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_6( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + uint8_t coefficient0 = (uint8_t)simd_unit->data[0U]; + uint8_t coefficient1 = (uint8_t)simd_unit->data[1U]; + uint8_t coefficient2 = (uint8_t)simd_unit->data[2U]; + uint8_t coefficient3 = (uint8_t)simd_unit->data[3U]; + uint8_t coefficient4 = (uint8_t)simd_unit->data[4U]; + uint8_t coefficient5 = (uint8_t)simd_unit->data[5U]; + uint8_t coefficient6 = (uint8_t)simd_unit->data[6U]; + uint8_t coefficient7 = (uint8_t)simd_unit->data[7U]; + uint8_t byte0 = (uint32_t)coefficient1 << 6U | (uint32_t)coefficient0; + uint8_t byte1 = (uint32_t)coefficient2 << 4U | (uint32_t)coefficient1 >> 2U; + uint8_t byte2 = (uint32_t)coefficient3 << 2U | (uint32_t)coefficient2 >> 4U; + uint8_t byte3 = (uint32_t)coefficient5 << 6U | (uint32_t)coefficient4; + uint8_t byte4 = (uint32_t)coefficient6 << 4U | (uint32_t)coefficient5 >> 2U; + uint8_t byte5 = (uint32_t)coefficient7 << 2U | (uint32_t)coefficient6 >> 4U; + serialized.ptr[0U] = byte0; + serialized.ptr[1U] = byte1; + serialized.ptr[2U] = byte2; + serialized.ptr[3U] = byte3; + serialized.ptr[4U] = byte4; + serialized.ptr[5U] = byte5; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_commitment_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + switch ((uint32_t)(uint8_t)serialized.meta) + { + case 4U: + { + libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_4(simd_unit, serialized); + break; + } + case 6U: + { + libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_6(simd_unit, serialized); + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_commitment_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + libcrux_ml_dsa_simd_portable_encoding_commitment_serialize(simd_unit, serialized); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_4_ETA (4) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_4( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)2U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)2U, + .end = i0 * (size_t)2U + (size_t)2U + } + )); + uint8_t + coefficient0 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_4_ETA - + coefficients.ptr[0U]); + uint8_t + coefficient1 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_4_ETA - + coefficients.ptr[1U]); + serialized.ptr[i0] = (uint32_t)coefficient1 << 4U | (uint32_t)coefficient0; + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA (2) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_2( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + uint8_t + coefficient0 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[0U]); + uint8_t + coefficient1 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[1U]); + uint8_t + coefficient2 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[2U]); + uint8_t + coefficient3 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[3U]); + uint8_t + coefficient4 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[4U]); + uint8_t + coefficient5 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[5U]); + uint8_t + coefficient6 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[6U]); + uint8_t + coefficient7 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[7U]); + serialized.ptr[0U] = + ((uint32_t)coefficient2 << 6U | (uint32_t)coefficient1 << 3U) | (uint32_t)coefficient0; + serialized.ptr[1U] = + (((uint32_t)coefficient5 << 7U | (uint32_t)coefficient4 << 4U) | (uint32_t)coefficient3 << 1U) + | (uint32_t)coefficient2 >> 2U; + serialized.ptr[2U] = + ((uint32_t)coefficient7 << 5U | (uint32_t)coefficient6 << 2U) | (uint32_t)coefficient5 >> 1U; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_serialize( + libcrux_ml_dsa_constants_Eta eta, + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_4(simd_unit, serialized); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_2(simd_unit, serialized); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_error_serialize_65( + libcrux_ml_dsa_constants_Eta eta, + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + libcrux_ml_dsa_simd_portable_encoding_error_serialize(eta, simd_unit, serialized); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_4_ETA (4) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_4( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_units +) +{ + for (size_t i = (size_t)0U; i < serialized.meta; i++) + { + size_t i0 = i; + const uint8_t *byte = &serialized.ptr[i0]; + uint8_t uu____0 = core_ops_bit__core__ops__bit__BitAnd_u8__u8__for__0__u8___bitand(byte, 15U); + simd_units->data[(size_t)2U * i0] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_4_ETA - + (int32_t)(uint32_t)uu____0; + uint8_t uu____1 = core_ops_bit__core__ops__bit__Shr_i32__u8__for__0__u8___shr(byte, 4); + simd_units->data[(size_t)2U * i0 + (size_t)1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_4_ETA - + (int32_t)(uint32_t)uu____1; + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA (2) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_2( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + int32_t byte0 = (int32_t)(uint32_t)serialized.ptr[0U]; + int32_t byte1 = (int32_t)(uint32_t)serialized.ptr[1U]; + int32_t byte2 = (int32_t)(uint32_t)serialized.ptr[2U]; + simd_unit->data[0U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte0 & 7); + simd_unit->data[1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte0 >> 3U & 7); + simd_unit->data[2U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - + ((byte0 >> 6U | (int32_t)((uint32_t)byte1 << 2U)) & 7); + simd_unit->data[3U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte1 >> 1U & 7); + simd_unit->data[4U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte1 >> 4U & 7); + simd_unit->data[5U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - + ((byte1 >> 7U | (int32_t)((uint32_t)byte2 << 1U)) & 7); + simd_unit->data[6U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte2 >> 2U & 7); + simd_unit->data[7U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte2 >> 5U & 7); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_deserialize( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_4(serialized, out); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_2(serialized, out); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_error_deserialize_65( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_encoding_error_deserialize(eta, serialized, out); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(int32_t t0) +{ + return + (int32_t)((uint32_t)1 << + (uint32_t)(LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T - (size_t)1U)) + - t0; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t0_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + int32_t + coefficient0 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[0U]); + int32_t + coefficient1 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[1U]); + int32_t + coefficient2 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[2U]); + int32_t + coefficient3 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[3U]); + int32_t + coefficient4 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[4U]); + int32_t + coefficient5 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[5U]); + int32_t + coefficient6 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[6U]); + int32_t + coefficient7 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[7U]); + serialized.ptr[0U] = (uint8_t)coefficient0; + serialized.ptr[1U] = + (uint32_t)(uint8_t)(coefficient0 >> 8U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient1 << 5U); + serialized.ptr[2U] = (uint8_t)(coefficient1 >> 3U); + serialized.ptr[3U] = + (uint32_t)(uint8_t)(coefficient1 >> 11U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient2 << 2U); + serialized.ptr[4U] = + (uint32_t)(uint8_t)(coefficient2 >> 6U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient3 << 7U); + serialized.ptr[5U] = (uint8_t)(coefficient3 >> 1U); + serialized.ptr[6U] = + (uint32_t)(uint8_t)(coefficient3 >> 9U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient4 << 4U); + serialized.ptr[7U] = (uint8_t)(coefficient4 >> 4U); + serialized.ptr[8U] = + (uint32_t)(uint8_t)(coefficient4 >> 12U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient5 << 1U); + serialized.ptr[9U] = + (uint32_t)(uint8_t)(coefficient5 >> 7U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient6 << 6U); + serialized.ptr[10U] = (uint8_t)(coefficient6 >> 2U); + serialized.ptr[11U] = + (uint32_t)(uint8_t)(coefficient6 >> 10U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient7 << 3U); + serialized.ptr[12U] = (uint8_t)(coefficient7 >> 5U); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t0_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t0_serialize(simd_unit, out); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK ((int32_t)((uint32_t)1 << (uint32_t)(int32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T) - 1) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t0_deserialize( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + int32_t byte0 = (int32_t)(uint32_t)serialized.ptr[0U]; + int32_t byte1 = (int32_t)(uint32_t)serialized.ptr[1U]; + int32_t byte2 = (int32_t)(uint32_t)serialized.ptr[2U]; + int32_t byte3 = (int32_t)(uint32_t)serialized.ptr[3U]; + int32_t byte4 = (int32_t)(uint32_t)serialized.ptr[4U]; + int32_t byte5 = (int32_t)(uint32_t)serialized.ptr[5U]; + int32_t byte6 = (int32_t)(uint32_t)serialized.ptr[6U]; + int32_t byte7 = (int32_t)(uint32_t)serialized.ptr[7U]; + int32_t byte8 = (int32_t)(uint32_t)serialized.ptr[8U]; + int32_t byte9 = (int32_t)(uint32_t)serialized.ptr[9U]; + int32_t byte10 = (int32_t)(uint32_t)serialized.ptr[10U]; + int32_t byte11 = (int32_t)(uint32_t)serialized.ptr[11U]; + int32_t byte12 = (int32_t)(uint32_t)serialized.ptr[12U]; + int32_t coefficient0 = byte0; + coefficient0 |= (int32_t)((uint32_t)byte1 << 8U); + coefficient0 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient1 = byte1 >> 5U; + coefficient1 |= (int32_t)((uint32_t)byte2 << 3U); + coefficient1 |= (int32_t)((uint32_t)byte3 << 11U); + coefficient1 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient2 = byte3 >> 2U; + coefficient2 |= (int32_t)((uint32_t)byte4 << 6U); + coefficient2 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient3 = byte4 >> 7U; + coefficient3 |= (int32_t)((uint32_t)byte5 << 1U); + coefficient3 |= (int32_t)((uint32_t)byte6 << 9U); + coefficient3 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient4 = byte6 >> 4U; + coefficient4 |= (int32_t)((uint32_t)byte7 << 4U); + coefficient4 |= (int32_t)((uint32_t)byte8 << 12U); + coefficient4 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient5 = byte8 >> 1U; + coefficient5 |= (int32_t)((uint32_t)byte9 << 7U); + coefficient5 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient6 = byte9 >> 6U; + coefficient6 |= (int32_t)((uint32_t)byte10 << 2U); + coefficient6 |= (int32_t)((uint32_t)byte11 << 10U); + coefficient6 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient7 = byte11 >> 3U; + coefficient7 |= (int32_t)((uint32_t)byte12 << 5U); + coefficient7 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + simd_unit->data[0U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient0); + simd_unit->data[1U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient1); + simd_unit->data[2U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient2); + simd_unit->data[3U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient3); + simd_unit->data[4U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient4); + simd_unit->data[5U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient5); + simd_unit->data[6U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient6); + simd_unit->data[7U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient7); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t0_deserialize_65( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t0_deserialize(serialized, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t1_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)4U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)4U, + .end = i0 * (size_t)4U + (size_t)4U + } + )); + serialized.ptr[(size_t)5U * i0] = (uint8_t)(coefficients.ptr[0U] & 255); + serialized.ptr[(size_t)5U * i0 + (size_t)1U] = + (uint32_t)(uint8_t)(coefficients.ptr[1U] & 63) << 2U | + (uint32_t)(uint8_t)(coefficients.ptr[0U] >> 8U & 3); + serialized.ptr[(size_t)5U * i0 + (size_t)2U] = + (uint32_t)(uint8_t)(coefficients.ptr[2U] & 15) << 4U | + (uint32_t)(uint8_t)(coefficients.ptr[1U] >> 6U & 15); + serialized.ptr[(size_t)5U * i0 + (size_t)3U] = + (uint32_t)(uint8_t)(coefficients.ptr[3U] & 3) << 6U | + (uint32_t)(uint8_t)(coefficients.ptr[2U] >> 4U & 63); + serialized.ptr[(size_t)5U * i0 + (size_t)4U] = (uint8_t)(coefficients.ptr[3U] >> 2U & 255); + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t1_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t1_serialize(simd_unit, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t1_deserialize( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + int32_t + mask = (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_UPPER_PART_OF_T) - 1; + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)5U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)5U, + .end = i0 * (size_t)5U + (size_t)5U + } + )); + int32_t byte0 = (int32_t)(uint32_t)bytes.ptr[0U]; + int32_t byte1 = (int32_t)(uint32_t)bytes.ptr[1U]; + int32_t byte2 = (int32_t)(uint32_t)bytes.ptr[2U]; + int32_t byte3 = (int32_t)(uint32_t)bytes.ptr[3U]; + int32_t byte4 = (int32_t)(uint32_t)bytes.ptr[4U]; + simd_unit->data[(size_t)4U * i0] = (byte0 | (int32_t)((uint32_t)byte1 << 8U)) & mask; + simd_unit->data[(size_t)4U * i0 + (size_t)1U] = + (byte1 >> 2U | (int32_t)((uint32_t)byte2 << 6U)) & mask; + simd_unit->data[(size_t)4U * i0 + (size_t)2U] = + (byte2 >> 4U | (int32_t)((uint32_t)byte3 << 4U)) & mask; + simd_unit->data[(size_t)4U * i0 + (size_t)3U] = + (byte3 >> 6U | (int32_t)((uint32_t)byte4 << 2U)) & mask; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t1_deserialize_65( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t1_deserialize(serialized, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant( + Eurydice_arr_4d *simd_unit, + int32_t c +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + simd_unit->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element((int64_t)simd_unit->data[i0] + * (int64_t)c); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- $32size_t +*/ +typedef struct Eurydice_arr_a3_s { Eurydice_arr_4d data[32U]; } Eurydice_arr_a3; + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round( + Eurydice_arr_a3 *re, + size_t index, + size_t step_by, + int32_t zeta +) +{ + Eurydice_arr_4d tmp = re->data[index + step_by]; + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&tmp, zeta); + re->data[index + step_by] = re->data[index]; + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[index + step_by], &tmp); + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[index], &tmp); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 16 +- ZETA= 25847 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_30(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)16U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)16U, 25847); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_7(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_30(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 8 +- ZETA= -2608894 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_300(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)8U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)8U, -2608894); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 8 +- ZETA= -518909 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_42(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)8U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)8U, -518909); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_6(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_300(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_42(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 4 +- ZETA= 237124 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_301(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, 237124); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 4 +- ZETA= -777960 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_82(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, -777960); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 4 +- ZETA= -876248 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_420(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, -876248); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 4 +- ZETA= 466468 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, 466468); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_5(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_301(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_82(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_420(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 2 +- ZETA= 1826347 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_302(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 1826347); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 2 +- ZETA= 2353451 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_43(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 2353451); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 2 +- ZETA= -359251 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_820(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, -359251); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 2 +- ZETA= -2091905 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, -2091905); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 2 +- ZETA= 3119733 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_421(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 3119733); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 2 +- ZETA= -2884855 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_61(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, -2884855); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 2 +- ZETA= 3111497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 3111497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 2 +- ZETA= 2680103 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_38(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 2680103); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_4(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_302(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_43(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_820(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_421(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_61(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe0(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_38(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 1 +- ZETA= 2725464 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_303(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 2725464); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 2 +- STEP_BY= 1 +- ZETA= 1024112 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_25(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)2U; i < (size_t)2U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 1024112); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 1 +- ZETA= -1079900 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_430(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -1079900); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 6 +- STEP_BY= 1 +- ZETA= 3585928 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_f4(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)6U; i < (size_t)6U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 3585928); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 1 +- ZETA= -549488 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_821(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -549488); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 10 +- STEP_BY= 1 +- ZETA= -1119584 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_1d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)10U; i < (size_t)10U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -1119584); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 1 +- ZETA= 2619752 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 2619752); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 14 +- STEP_BY= 1 +- ZETA= -2108549 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_d8(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)14U; i < (size_t)14U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -2108549); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 1 +- ZETA= -2118186 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_422(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -2118186); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 18 +- STEP_BY= 1 +- ZETA= -3859737 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_60(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)18U; i < (size_t)18U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -3859737); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 1 +- ZETA= -1399561 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_610(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -1399561); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 22 +- STEP_BY= 1 +- ZETA= -3277672 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_29(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)22U; i < (size_t)22U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -3277672); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 1 +- ZETA= 1757237 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe1(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 1757237); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 26 +- STEP_BY= 1 +- ZETA= -19422 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_9d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)26U; i < (size_t)26U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -19422); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 1 +- ZETA= 4010497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_380(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 4010497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 30 +- STEP_BY= 1 +- ZETA= 280005 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_5f(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)30U; i < (size_t)30U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 280005); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_3(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_303(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_25(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_430(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_f4(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_821(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_1d(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea0(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_d8(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_422(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_60(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_610(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_29(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe1(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_9d(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_380(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_5f(re); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_fe_by_fer(int32_t fe, int32_t fer) +{ + return + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element((int64_t)fe * (int64_t)fer); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step( + Eurydice_arr_4d *simd_unit, + int32_t zeta, + size_t index, + size_t step +) +{ + int32_t + t = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_fe_by_fer(simd_unit->data[index + + step], + zeta); + simd_unit->data[index + step] = simd_unit->data[index] - t; + simd_unit->data[index] += t; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_2( + Eurydice_arr_4d *simd_unit, + int32_t zeta +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)0U, (size_t)4U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)1U, (size_t)4U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)2U, (size_t)4U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)3U, (size_t)4U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_2(&re->data[index], zeta); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)0U, 2706023); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)1U, 95776); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)2U, 3077325); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)3U, 3530437); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)4U, -1661693); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)5U, -3592148); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)6U, -2537516); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)7U, 3915439); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)8U, -3861115); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)9U, -3043716); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)10U, 3574422); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)11U, -2867647); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)12U, 3539968); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)13U, -300467); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)14U, 2348700); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)15U, -539299); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)16U, -1699267); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)17U, -1643818); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)18U, 3505694); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)19U, -3821735); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)20U, 3507263); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)21U, -2140649); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)22U, -1600420); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)23U, 3699596); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)24U, 811944); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)25U, 531354); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)26U, 954230); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)27U, 3881043); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)28U, 3900724); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)29U, -2556880); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)30U, 2071892); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)31U, -2797779); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_1( + Eurydice_arr_4d *simd_unit, + int32_t zeta1, + int32_t zeta2 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta1, (size_t)0U, (size_t)2U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta1, (size_t)1U, (size_t)2U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta2, (size_t)4U, (size_t)2U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta2, (size_t)5U, (size_t)2U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta_0, + int32_t zeta_1 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_1(&re->data[index], zeta_0, zeta_1); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)0U, -3930395, -1528703); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)1U, -3677745, -3041255); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)2U, -1452451, 3475950); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)3U, 2176455, -1585221); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)4U, -1257611, 1939314); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)5U, -4083598, -1000202); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)6U, -3190144, -3157330); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)7U, -3632928, 126922); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)8U, 3412210, -983419); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)9U, 2147896, 2715295); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)10U, -2967645, -3693493); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)11U, -411027, -2477047); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)12U, -671102, -1228525); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)13U, -22981, -1308169); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)14U, -381987, 1349076); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)15U, 1852771, -1430430); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)16U, -3343383, 264944); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)17U, 508951, 3097992); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)18U, 44288, -1100098); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)19U, 904516, 3958618); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)20U, -3724342, -8578); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)21U, 1653064, -3249728); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)22U, 2389356, -210977); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)23U, 759969, -1316856); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)24U, 189548, -3553272); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)25U, 3159746, -1851402); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)26U, -2409325, -177440); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)27U, 1315589, 1341330); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)28U, 1285669, -1584928); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)29U, -812732, -1439742); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)30U, -3019102, -3881060); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)31U, -3628969, 3839961); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_0( + Eurydice_arr_4d *simd_unit, + int32_t zeta0, + int32_t zeta1, + int32_t zeta2, + int32_t zeta3 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta0, (size_t)0U, (size_t)1U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta1, (size_t)2U, (size_t)1U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta2, (size_t)4U, (size_t)1U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta3, (size_t)6U, (size_t)1U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta_0, + int32_t zeta_1, + int32_t zeta_2, + int32_t zeta_3 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_0(&re->data[index], + zeta_0, + zeta_1, + zeta_2, + zeta_3); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)0U, + 2091667, + 3407706, + 2316500, + 3817976); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)1U, + -3342478, + 2244091, + -2446433, + -3562462); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)2U, + 266997, + 2434439, + -1235728, + 3513181); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)3U, + -3520352, + -3759364, + -1197226, + -3193378); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)4U, + 900702, + 1859098, + 909542, + 819034); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)5U, + 495491, + -1613174, + -43260, + -522500); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)6U, + -655327, + -3122442, + 2031748, + 3207046); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)7U, + -3556995, + -525098, + -768622, + -3595838); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)8U, + 342297, + 286988, + -2437823, + 4108315); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)9U, + 3437287, + -3342277, + 1735879, + 203044); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)10U, + 2842341, + 2691481, + -2590150, + 1265009); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)11U, + 4055324, + 1247620, + 2486353, + 1595974); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)12U, + -3767016, + 1250494, + 2635921, + -3548272); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)13U, + -2994039, + 1869119, + 1903435, + -1050970); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)14U, + -1333058, + 1237275, + -3318210, + -1430225); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)15U, + -451100, + 1312455, + 3306115, + -1962642); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)16U, + -1279661, + 1917081, + -2546312, + -1374803); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)17U, + 1500165, + 777191, + 2235880, + 3406031); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)18U, + -542412, + -2831860, + -1671176, + -1846953); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)19U, + -2584293, + -3724270, + 594136, + -3776993); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)20U, + -2013608, + 2432395, + 2454455, + -164721); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)21U, + 1957272, + 3369112, + 185531, + -1207385); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)22U, + -3183426, + 162844, + 1616392, + 3014001); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)23U, + 810149, + 1652634, + -3694233, + -1799107); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)24U, + -3038916, + 3523897, + 3866901, + 269760); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)25U, + 2213111, + -975884, + 1717735, + 472078); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)26U, + -426683, + 1723600, + -1803090, + 1910376); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)27U, + -1667432, + -1104333, + -260646, + -3833893); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)28U, + -2939036, + -2235985, + -420899, + -2286327); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)29U, + 183443, + -976891, + 1612842, + -3545687); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)30U, + -554416, + 3919660, + -48306, + -1362209); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)31U, + 3937738, + 1400424, + -846154, + 1976782); +} + +static KRML_MUSTINLINE void libcrux_ml_dsa_simd_portable_ntt_ntt(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_7(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_6(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_5(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_4(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_3(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0(re); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void libcrux_ml_dsa_simd_portable_ntt_65(Eurydice_arr_a3 *simd_units) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt(simd_units); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step( + Eurydice_arr_4d *simd_unit, + int32_t zeta, + size_t index, + size_t step +) +{ + int32_t a_minus_b = simd_unit->data[index + step] - simd_unit->data[index]; + simd_unit->data[index] += simd_unit->data[index + step]; + simd_unit->data[index + step] = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_fe_by_fer(a_minus_b, + zeta); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_0( + Eurydice_arr_4d *simd_unit, + int32_t zeta0, + int32_t zeta1, + int32_t zeta2, + int32_t zeta3 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta0, + (size_t)0U, + (size_t)1U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta1, + (size_t)2U, + (size_t)1U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta2, + (size_t)4U, + (size_t)1U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta3, + (size_t)6U, + (size_t)1U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta0, + int32_t zeta1, + int32_t zeta2, + int32_t zeta3 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_0(&re->data[index], + zeta0, + zeta1, + zeta2, + zeta3); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)0U, + 1976782, + -846154, + 1400424, + 3937738); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)1U, + -1362209, + -48306, + 3919660, + -554416); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)2U, + -3545687, + 1612842, + -976891, + 183443); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)3U, + -2286327, + -420899, + -2235985, + -2939036); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)4U, + -3833893, + -260646, + -1104333, + -1667432); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)5U, + 1910376, + -1803090, + 1723600, + -426683); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)6U, + 472078, + 1717735, + -975884, + 2213111); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)7U, + 269760, + 3866901, + 3523897, + -3038916); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)8U, + -1799107, + -3694233, + 1652634, + 810149); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)9U, + 3014001, + 1616392, + 162844, + -3183426); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)10U, + -1207385, + 185531, + 3369112, + 1957272); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)11U, + -164721, + 2454455, + 2432395, + -2013608); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)12U, + -3776993, + 594136, + -3724270, + -2584293); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)13U, + -1846953, + -1671176, + -2831860, + -542412); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)14U, + 3406031, + 2235880, + 777191, + 1500165); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)15U, + -1374803, + -2546312, + 1917081, + -1279661); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)16U, + -1962642, + 3306115, + 1312455, + -451100); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)17U, + -1430225, + -3318210, + 1237275, + -1333058); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)18U, + -1050970, + 1903435, + 1869119, + -2994039); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)19U, + -3548272, + 2635921, + 1250494, + -3767016); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)20U, + 1595974, + 2486353, + 1247620, + 4055324); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)21U, + 1265009, + -2590150, + 2691481, + 2842341); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)22U, + 203044, + 1735879, + -3342277, + 3437287); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)23U, + 4108315, + -2437823, + 286988, + 342297); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)24U, + -3595838, + -768622, + -525098, + -3556995); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)25U, + 3207046, + 2031748, + -3122442, + -655327); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)26U, + -522500, + -43260, + -1613174, + 495491); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)27U, + 819034, + 909542, + 1859098, + 900702); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)28U, + -3193378, + -1197226, + -3759364, + -3520352); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)29U, + 3513181, + -1235728, + 2434439, + 266997); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)30U, + -3562462, + -2446433, + 2244091, + -3342478); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)31U, + 3817976, + 2316500, + 3407706, + 2091667); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_1( + Eurydice_arr_4d *simd_unit, + int32_t zeta0, + int32_t zeta1 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta0, + (size_t)0U, + (size_t)2U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta0, + (size_t)1U, + (size_t)2U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta1, + (size_t)4U, + (size_t)2U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta1, + (size_t)5U, + (size_t)2U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta_00, + int32_t zeta_01 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_1(&re->data[index], + zeta_00, + zeta_01); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)0U, + 3839961, + -3628969); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)1U, + -3881060, + -3019102); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)2U, + -1439742, + -812732); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)3U, + -1584928, + 1285669); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)4U, + 1341330, + 1315589); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)5U, + -177440, + -2409325); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)6U, + -1851402, + 3159746); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)7U, + -3553272, + 189548); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)8U, + -1316856, + 759969); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)9U, + -210977, + 2389356); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)10U, + -3249728, + 1653064); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)11U, + -8578, + -3724342); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)12U, + 3958618, + 904516); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)13U, + -1100098, + 44288); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)14U, + 3097992, + 508951); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)15U, + 264944, + -3343383); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)16U, + -1430430, + 1852771); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)17U, + 1349076, + -381987); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)18U, + -1308169, + -22981); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)19U, + -1228525, + -671102); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)20U, + -2477047, + -411027); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)21U, + -3693493, + -2967645); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)22U, + 2715295, + 2147896); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)23U, + -983419, + 3412210); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)24U, + 126922, + -3632928); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)25U, + -3157330, + -3190144); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)26U, + -1000202, + -4083598); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)27U, + 1939314, + -1257611); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)28U, + -1585221, + 2176455); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)29U, + 3475950, + -1452451); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)30U, + -3041255, + -3677745); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)31U, + -1528703, + -3930395); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_2( + Eurydice_arr_4d *simd_unit, + int32_t zeta +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)0U, + (size_t)4U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)1U, + (size_t)4U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)2U, + (size_t)4U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)3U, + (size_t)4U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta1 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_2(&re->data[index], zeta1); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)0U, -2797779); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)1U, 2071892); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)2U, -2556880); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)3U, 3900724); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)4U, 3881043); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)5U, 954230); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)6U, 531354); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)7U, 811944); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)8U, 3699596); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)9U, -1600420); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)10U, -2140649); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)11U, 3507263); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)12U, -3821735); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)13U, 3505694); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)14U, -1643818); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)15U, -1699267); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)16U, -539299); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)17U, 2348700); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)18U, -300467); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)19U, 3539968); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)20U, -2867647); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)21U, 3574422); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)22U, -3043716); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)23U, -3861115); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)24U, 3915439); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)25U, -2537516); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)26U, -3592148); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)27U, -1661693); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)28U, 3530437); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)29U, 3077325); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)30U, 95776); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)31U, 2706023); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 1 +- ZETA= 280005 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_30(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 280005); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 2 +- STEP_BY= 1 +- ZETA= 4010497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_25(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)2U; i < (size_t)2U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 4010497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 1 +- ZETA= -19422 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_43(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -19422); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 6 +- STEP_BY= 1 +- ZETA= 1757237 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_f4(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)6U; i < (size_t)6U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 1757237); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 1 +- ZETA= -3277672 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_82(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -3277672); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 10 +- STEP_BY= 1 +- ZETA= -1399561 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_1d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)10U; i < (size_t)10U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -1399561); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 1 +- ZETA= -3859737 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -3859737); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 14 +- STEP_BY= 1 +- ZETA= -2118186 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_d8(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)14U; i < (size_t)14U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -2118186); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 1 +- ZETA= -2108549 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_42(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -2108549); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 18 +- STEP_BY= 1 +- ZETA= 2619752 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_60(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)18U; i < (size_t)18U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 2619752); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 1 +- ZETA= -1119584 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_61(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -1119584); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 22 +- STEP_BY= 1 +- ZETA= -549488 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_29(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)22U; i < (size_t)22U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -549488); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 1 +- ZETA= 3585928 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 3585928); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 26 +- STEP_BY= 1 +- ZETA= -1079900 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_9d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)26U; i < (size_t)26U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -1079900); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 1 +- ZETA= 1024112 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_38(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 1024112); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 30 +- STEP_BY= 1 +- ZETA= 2725464 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_5f(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)30U; i < (size_t)30U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 2725464); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_3(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_30(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_25(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_43(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_f4(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_82(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_1d(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_d8(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_42(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_60(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_61(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_29(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_9d(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_38(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_5f(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 2 +- ZETA= 2680103 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_300(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 2680103); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 2 +- ZETA= 3111497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_430(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 3111497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 2 +- ZETA= -2884855 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_820(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + -2884855); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 2 +- ZETA= 3119733 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 3119733); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 2 +- ZETA= -2091905 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_420(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + -2091905); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 2 +- ZETA= -359251 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_610(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + -359251); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 2 +- ZETA= 2353451 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 2353451); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 2 +- ZETA= 1826347 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_380(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 1826347); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_4(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_300(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_430(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_820(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea0(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_420(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_610(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe0(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_380(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 4 +- ZETA= 466468 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_301(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + 466468); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 4 +- ZETA= -876248 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_821(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + -876248); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 4 +- ZETA= -777960 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_421(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + -777960); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 4 +- ZETA= 237124 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe1(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + 237124); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_5(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_301(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_821(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_421(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe1(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 8 +- ZETA= -518909 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_302(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)8U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)8U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)8U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)8U], + -518909); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 8 +- ZETA= -2608894 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_422(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)8U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)8U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)8U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)8U], + -2608894); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_6(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_302(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_422(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 16 +- ZETA= 25847 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_303(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)16U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)16U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)16U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)16U], + 25847); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_7(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_303(re); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_montgomery(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_3(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_4(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_5(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_6(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_7(re); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[i0], 41978); + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_invert_ntt_montgomery_65(Eurydice_arr_a3 *simd_units) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_montgomery(simd_units); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_barrett_reduce_simd_unit_65(Eurydice_arr_4d *simd_unit) +{ + libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_simd_unit(simd_unit); +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_error_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_ERROR_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_commitment_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_COMMITMENT_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA (libcrux_ml_dsa_constants_beta(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_GAMMA1_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_gamma1_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_VERIFICATION_KEY_SIZE (libcrux_ml_dsa_constants_verification_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_SIGNATURE_SIZE (libcrux_ml_dsa_constants_signature_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_error_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_ERROR_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_commitment_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_COMMITMENT_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA (libcrux_ml_dsa_constants_beta(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_GAMMA1_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_gamma1_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_VERIFICATION_KEY_SIZE (libcrux_ml_dsa_constants_verification_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_SIGNATURE_SIZE (libcrux_ml_dsa_constants_signature_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_VECTOR_SIZE (libcrux_ml_dsa_constants_commitment_vector_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_COMMITMENT_COEFFICIENT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A)) + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSASigningKey +with const generics +- $2560size_t +*/ +typedef Eurydice_arr_10 libcrux_ml_dsa_types_MLDSASigningKey_11; + +typedef Eurydice_arr_10 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44SigningKey; + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSAVerificationKey +with const generics +- $1312size_t +*/ +typedef Eurydice_arr_02 libcrux_ml_dsa_types_MLDSAVerificationKey_1d; + +typedef Eurydice_arr_02 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44VerificationKey; + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ROW_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ROW_X_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A * LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_SIGNING_KEY_SIZE (libcrux_ml_dsa_constants_signing_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_VECTOR_SIZE (libcrux_ml_dsa_constants_commitment_vector_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_COMMITMENT_COEFFICIENT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A)) + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSASigningKey +with const generics +- $4032size_t +*/ +typedef Eurydice_arr_24 libcrux_ml_dsa_types_MLDSASigningKey_8e; + +typedef Eurydice_arr_24 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65SigningKey; + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSAVerificationKey +with const generics +- $1952size_t +*/ +typedef Eurydice_arr_29 libcrux_ml_dsa_types_MLDSAVerificationKey_c8; + +typedef Eurydice_arr_29 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65VerificationKey; + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ROW_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ROW_X_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A * LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_SIGNING_KEY_SIZE (libcrux_ml_dsa_constants_signing_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_VECTOR_SIZE (libcrux_ml_dsa_constants_commitment_vector_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_COMMITMENT_COEFFICIENT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A)) + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSASigningKey +with const generics +- $4896size_t +*/ +typedef Eurydice_arr_e2 libcrux_ml_dsa_types_MLDSASigningKey_b8; + +typedef Eurydice_arr_e2 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87SigningKey; + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSAVerificationKey +with const generics +- $2592size_t +*/ +typedef Eurydice_arr_43 libcrux_ml_dsa_types_MLDSAVerificationKey_e9; + +typedef Eurydice_arr_43 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87VerificationKey; + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ROW_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ROW_X_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A * LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_SIGNING_KEY_SIZE (libcrux_ml_dsa_constants_signing_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE)) + +#define LIBCRUX_ML_DSA_PRE_HASH_PRE_HASH_OID_LEN ((size_t)11U) + +typedef Eurydice_arr_c9 libcrux_ml_dsa_pre_hash_PreHashOID; + +typedef core_result_Result_a8 libcrux_ml_dsa_pre_hash_PreHashResult; + +/** +This function found in impl {core::convert::From<libcrux_ml_dsa::pre_hash::DomainSeparationError> for libcrux_ml_dsa::types::SigningError} +*/ +static inline libcrux_ml_dsa_types_SigningError +libcrux_ml_dsa_pre_hash_from_96(libcrux_ml_dsa_pre_hash_DomainSeparationError e) +{ + return libcrux_ml_dsa_types_SigningError_ContextTooLongError; +} + +/** +This function found in impl {core::convert::From<libcrux_ml_dsa::pre_hash::DomainSeparationError> for libcrux_ml_dsa::types::VerificationError} +*/ +static inline libcrux_ml_dsa_types_VerificationError +libcrux_ml_dsa_pre_hash_from_bf(libcrux_ml_dsa_pre_hash_DomainSeparationError e) +{ + return libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError; +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_3_STEP ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_3_STEP_BY ((size_t)1U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_4_STEP ((size_t)16U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_4_STEP_BY ((size_t)2U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_5_STEP ((size_t)32U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_5_STEP_BY ((size_t)4U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_6_STEP ((size_t)64U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_6_STEP_BY ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_7_STEP ((size_t)128U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_7_STEP_BY ((size_t)16U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_3_STEP ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_3_STEP_BY ((size_t)1U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_4_STEP ((size_t)16U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_4_STEP_BY ((size_t)2U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_5_STEP ((size_t)32U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_5_STEP_BY ((size_t)4U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_6_STEP ((size_t)64U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_6_STEP_BY ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_7_STEP ((size_t)128U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_7_STEP_BY ((size_t)16U) + +typedef int32_t libcrux_ml_dsa_simd_portable_vector_type_FieldElement; + +/** +This function found in impl {core::clone::Clone for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline Eurydice_arr_4d +libcrux_ml_dsa_simd_portable_vector_type_clone_a5(const Eurydice_arr_4d *self) +{ + return self[0U]; +} + +typedef int32_t libcrux_ml_dsa_simd_traits_FieldElementTimesMontgomeryR; + +typedef Eurydice_arr_93 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87Signature; + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_c5 +with const generics +- SIZE= 4627 +*/ +static inline const +Eurydice_arr_93 +*libcrux_ml_dsa_types_as_ref_c5_f1(const Eurydice_arr_93 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_7f +with const generics +- SIZE= 2592 +*/ +static inline const +Eurydice_arr_43 +*libcrux_ml_dsa_types_as_ref_7f_c6(const Eurydice_arr_43 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_9b +with const generics +- SIZE= 4896 +*/ +static inline const +Eurydice_arr_e2 +*libcrux_ml_dsa_types_as_ref_9b_72(const Eurydice_arr_e2 *self) +{ + return self; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_7f +with const generics +- SIZE= 2592 +*/ +static inline Eurydice_arr_43 libcrux_ml_dsa_types_new_7f_c6(Eurydice_arr_43 value) +{ + return value; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_9b +with const generics +- SIZE= 4896 +*/ +static inline Eurydice_arr_e2 libcrux_ml_dsa_types_new_9b_72(Eurydice_arr_e2 value) +{ + return value; +} + +typedef Eurydice_arr_85 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44Signature; + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_c5 +with const generics +- SIZE= 2420 +*/ +static inline const +Eurydice_arr_85 +*libcrux_ml_dsa_types_as_ref_c5_37(const Eurydice_arr_85 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_7f +with const generics +- SIZE= 1312 +*/ +static inline const +Eurydice_arr_02 +*libcrux_ml_dsa_types_as_ref_7f_7d(const Eurydice_arr_02 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_9b +with const generics +- SIZE= 2560 +*/ +static inline const +Eurydice_arr_10 +*libcrux_ml_dsa_types_as_ref_9b_ab(const Eurydice_arr_10 *self) +{ + return self; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_7f +with const generics +- SIZE= 1312 +*/ +static inline Eurydice_arr_02 libcrux_ml_dsa_types_new_7f_7d(Eurydice_arr_02 value) +{ + return value; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_9b +with const generics +- SIZE= 2560 +*/ +static inline Eurydice_arr_10 libcrux_ml_dsa_types_new_9b_ab(Eurydice_arr_10 value) +{ + return value; +} + +typedef Eurydice_arr_0c libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65Signature; + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_c5 +with const generics +- SIZE= 3309 +*/ +static inline const +Eurydice_arr_0c +*libcrux_ml_dsa_types_as_ref_c5_5c(const Eurydice_arr_0c *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_7f +with const generics +- SIZE= 1952 +*/ +static inline const +Eurydice_arr_29 +*libcrux_ml_dsa_types_as_ref_7f_a2(const Eurydice_arr_29 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_9b +with const generics +- SIZE= 4032 +*/ +static inline const +Eurydice_arr_24 +*libcrux_ml_dsa_types_as_ref_9b_e5(const Eurydice_arr_24 *self) +{ + return self; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_7f +with const generics +- SIZE= 1952 +*/ +static inline Eurydice_arr_29 libcrux_ml_dsa_types_new_7f_a2(Eurydice_arr_29 value) +{ + return value; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_9b +with const generics +- SIZE= 4032 +*/ +static inline Eurydice_arr_24 libcrux_ml_dsa_types_new_9b_e5(Eurydice_arr_24 value) +{ + return value; +} + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87Signature, libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_8b_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_93 case_Ok; + libcrux_ml_dsa_types_SigningError case_Err; + } + val; +} +core_result_Result_8b; + +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.PolynomialRingElement +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients + +*/ +typedef Eurydice_arr_a3 libcrux_ml_dsa_polynomial_PolynomialRingElement_e8; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $7size_t +*/ +typedef struct Eurydice_arr_bb_s { Eurydice_arr_a3 data[7U]; } Eurydice_arr_bb; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_bb + +*/ +typedef struct core_option_Option_2d_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_bb f0; +} +core_option_Option_2d; + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_44_s +{ + const Eurydice_arr_a3 *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_44; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $56size_t +*/ +typedef struct Eurydice_arr_0f_s { Eurydice_arr_a3 data[56U]; } Eurydice_arr_0f; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 56 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_208(const Eurydice_arr_0f *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)56U; + return lit; +} + +/** + Init with zero +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.zero_c5 +with const generics +- SIZE= 4627 +*/ +static inline Eurydice_arr_93 libcrux_ml_dsa_types_zero_c5_f1(void) +{ + return (KRML_CLITERAL(Eurydice_arr_93){ .data = { 0U } }); +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $8size_t +*/ +typedef struct Eurydice_arr_8f_s { Eurydice_arr_a3 data[8U]; } Eurydice_arr_8f; + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients[[$8size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_6a(const Eurydice_arr_8f *val) +{ + +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $15size_t +*/ +typedef struct Eurydice_arr_92_s { Eurydice_arr_a3 data[15U]; } Eurydice_arr_92; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 15 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_207(const Eurydice_arr_92 *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)15U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 7 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_206(const Eurydice_arr_bb *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)7U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients, core_ops_range_Range size_t, Eurydice_derefed_slice libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 15 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_subslice_shared_251(const Eurydice_arr_92 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_44){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_44_s +{ + Eurydice_arr_a3 *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_44; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 7 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_208(Eurydice_arr_bb *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)7U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 56 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_207(Eurydice_arr_0f *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)56U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 15 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_206(Eurydice_arr_92 *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)15U; + return lit; +} + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65Signature, libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_8c_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_0c case_Ok; + libcrux_ml_dsa_types_SigningError case_Err; + } + val; +} +core_result_Result_8c; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $5size_t +*/ +typedef struct Eurydice_arr_5d_s { Eurydice_arr_a3 data[5U]; } Eurydice_arr_5d; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_5d + +*/ +typedef struct core_option_Option_1e_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_5d f0; +} +core_option_Option_1e; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $30size_t +*/ +typedef struct Eurydice_arr_5a_s { Eurydice_arr_a3 data[30U]; } Eurydice_arr_5a; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 30 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_205(const Eurydice_arr_5a *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)30U; + return lit; +} + +/** + Init with zero +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.zero_c5 +with const generics +- SIZE= 3309 +*/ +static inline Eurydice_arr_0c libcrux_ml_dsa_types_zero_c5_5c(void) +{ + return (KRML_CLITERAL(Eurydice_arr_0c){ .data = { 0U } }); +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $6size_t +*/ +typedef struct Eurydice_arr_dc1_s { Eurydice_arr_a3 data[6U]; } Eurydice_arr_dc1; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_204(const Eurydice_arr_dc1 *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients[[$6size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_b2(const Eurydice_arr_dc1 *val) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_205(Eurydice_arr_dc1 *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $11size_t +*/ +typedef struct Eurydice_arr_47_s { Eurydice_arr_a3 data[11U]; } Eurydice_arr_47; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 11 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_203(const Eurydice_arr_47 *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)11U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 5 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_202(const Eurydice_arr_5d *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)5U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients, core_ops_range_Range size_t, Eurydice_derefed_slice libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 11 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_subslice_shared_250(const Eurydice_arr_47 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_44){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 5 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_204(Eurydice_arr_5d *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)5U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 30 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_203(Eurydice_arr_5a *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)30U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 11 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_202(Eurydice_arr_47 *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)11U; + return lit; +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.zero_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline Eurydice_arr_a3 libcrux_ml_dsa_polynomial_zero_ff_37(void) +{ + Eurydice_arr_a3 lit; + Eurydice_arr_4d repeat_expression[32U]; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_simd_portable_zero_65(); + } + memcpy(lit.data, repeat_expression, (size_t)32U * sizeof (Eurydice_arr_4d)); + return lit; +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.from_i32_array_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline void +libcrux_ml_dsa_polynomial_from_i32_array_ff_37( + Eurydice_dst_ref_shared_83 array, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_DSA_SIMD_TRAITS_SIMD_UNITS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_from_coefficient_array_65(Eurydice_slice_subslice_shared_47(array, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.use_hint +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_use_hint_37( + int32_t gamma2, + Eurydice_dst_ref_shared_20 hint, + Eurydice_dst_ref_mut_44 re_vector +) +{ + for (size_t i0 = (size_t)0U; i0 < re_vector.meta; i0++) + { + size_t i1 = i0; + Eurydice_arr_a3 tmp = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_af(&hint.ptr[i1]), + &tmp); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_use_hint_65(gamma2, &re_vector.ptr[i1].data[j], &tmp.data[j]); + } + re_vector.ptr[i1] = tmp; + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ntt.ntt_multiply_montgomery +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(Eurydice_arr_a3 *lhs, const Eurydice_arr_a3 *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_montgomery_multiply_65(&lhs->data[i0], &rhs->data[i0]); + } +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.add_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_polynomial_add_ff_37(Eurydice_arr_a3 *self, const Eurydice_arr_a3 *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_add_65(&self->data[i0], &rhs->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.arithmetic.shift_left_then_reduce +with const generics +- SHIFT_BY= 13 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_shift_left_then_reduce_84(Eurydice_arr_4d *simd_unit) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + simd_unit->data[i0] = (int32_t)((uint32_t)simd_unit->data[i0] << (uint32_t)13); + } + libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_simd_unit(simd_unit); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.shift_left_then_reduce_65 +with const generics +- SHIFT_BY= 13 +*/ +static inline void +libcrux_ml_dsa_simd_portable_shift_left_then_reduce_65_84(Eurydice_arr_4d *simd_unit) +{ + libcrux_ml_dsa_simd_portable_arithmetic_shift_left_then_reduce_84(simd_unit); +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.shift_left_then_reduce +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- SHIFT_BY= 13 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_shift_left_then_reduce_68(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_shift_left_then_reduce_65_84(&re->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ntt.ntt +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_dsa_ntt_ntt_37(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_65(re); +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.subtract_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_polynomial_subtract_ff_37(Eurydice_arr_a3 *self, const Eurydice_arr_a3 *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_subtract_65(&self->data[i0], &rhs->data[i0]); + } +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.barrett_reduce_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(Eurydice_arr_a3 *self) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_barrett_reduce_simd_unit_65(&self->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ntt.invert_ntt_montgomery +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invert_ntt_montgomery_65(re); +} + +/** + Compute InvertNTT(Â ◦ ẑ - ĉ ◦ NTT(t₁2ᵈ)) +*/ +/** +A monomorphic instance of libcrux_ml_dsa.matrix.compute_w_approx +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_compute_w_approx_37( + size_t rows_in_a, + size_t columns_in_a, + Eurydice_dst_ref_shared_44 matrix, + Eurydice_dst_ref_shared_44 signer_response, + const Eurydice_arr_a3 *verifier_challenge_as_ntt, + Eurydice_dst_ref_mut_44 t1 +) +{ + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + Eurydice_arr_a3 inner_result = libcrux_ml_dsa_polynomial_zero_ff_37(); + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t j = i; + Eurydice_arr_a3 product = matrix.ptr[i1 * columns_in_a + j]; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&product, &signer_response.ptr[j]); + libcrux_ml_dsa_polynomial_add_ff_37(&inner_result, &product); + } + libcrux_ml_dsa_arithmetic_shift_left_then_reduce_68(&t1.ptr[i1]); + libcrux_ml_dsa_ntt_ntt_37(&t1.ptr[i1]); + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&t1.ptr[i1], verifier_challenge_as_ntt); + libcrux_ml_dsa_polynomial_subtract_ff_37(&inner_result, &t1.ptr[i1]); + t1.ptr[i1] = inner_result; + libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(&t1.ptr[i1]); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&t1.ptr[i1]); + } +} + +/** +A monomorphic instance of core.result.Result +with types (), libcrux_ml_dsa_types_VerificationError + +*/ +typedef struct core_result_Result_41_s +{ + core_result_Result_57_tags tag; + libcrux_ml_dsa_types_VerificationError f0; +} +core_result_Result_41; + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.gamma1.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_gamma1_deserialize_37( + size_t gamma1_exponent, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_gamma1_deserialize_65(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (gamma1_exponent + (size_t)1U), + .end = (i0 + (size_t)1U) * (gamma1_exponent + (size_t)1U) + } + )), + &result->data[i0], + gamma1_exponent); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.signature.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_encoding_signature_deserialize_37( + size_t columns_in_a, + size_t rows_in_a, + size_t commitment_hash_size, + size_t gamma1_exponent, + size_t gamma1_ring_element_size, + size_t max_ones_in_hint, + size_t signature_size, + Eurydice_borrow_slice_u8 serialized, + Eurydice_mut_borrow_slice_u8 out_commitment_hash, + Eurydice_dst_ref_mut_44 out_signer_response, + Eurydice_dst_ref_mut_20 out_hint +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(serialized, + commitment_hash_size, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 commitment_hash = uu____0.fst; + Eurydice_borrow_slice_u8 rest_of_serialized = uu____0.snd; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out_commitment_hash, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = commitment_hash_size })), + commitment_hash, + uint8_t); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(rest_of_serialized, + gamma1_ring_element_size * columns_in_a, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 signer_response_serialized = uu____1.fst; + Eurydice_borrow_slice_u8 hint_serialized = uu____1.snd; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_slice_subslice_shared_c8(signer_response_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * gamma1_ring_element_size, + .end = (i0 + (size_t)1U) * gamma1_ring_element_size + } + )), + &out_signer_response.ptr[i0]); + } + size_t previous_true_hints_seen = (size_t)0U; + bool malformed_hint = false; + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + size_t current_true_hints_seen = (size_t)(uint32_t)hint_serialized.ptr[max_ones_in_hint + i1]; + if (current_true_hints_seen < previous_true_hints_seen) + { + malformed_hint = true; + break; + } + if (current_true_hints_seen > max_ones_in_hint) + { + malformed_hint = true; + break; + } + for (size_t i = previous_true_hints_seen; i < current_true_hints_seen; i++) + { + size_t j = i; + if (j > previous_true_hints_seen) + { + if (hint_serialized.ptr[j] <= hint_serialized.ptr[j - (size_t)1U]) + { + malformed_hint = true; + break; + } + } + libcrux_ml_dsa_encoding_signature_set_hint(out_hint, + i1, + (size_t)(uint32_t)hint_serialized.ptr[j]); + } + if (malformed_hint) + { + break; + } + previous_true_hints_seen = current_true_hints_seen; + } + for (size_t i = previous_true_hints_seen; i < max_ones_in_hint; i++) + { + size_t j = i; + if (hint_serialized.ptr[j] != 0U) + { + malformed_hint = true; + break; + } + } + core_result_Result_41 uu____2; + if (malformed_hint) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_MalformedHintError + } + ); + } + else + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t1.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline void +libcrux_ml_dsa_encoding_t1_deserialize_37( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_t1_deserialize_65(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T1_DESERIALIZE_WINDOW, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_ENCODING_T1_DESERIALIZE_WINDOW + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.verification_key.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_verification_key_deserialize_37( + size_t rows_in_a, + size_t verification_key_size, + Eurydice_borrow_slice_u8 serialized, + Eurydice_dst_ref_mut_44 t1 +) +{ + for (size_t i = (size_t)0U; i < rows_in_a; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_t1_deserialize_37(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE + } + )), + &t1.ptr[i0]); + } +} + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44Signature, libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_48_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_85 case_Ok; + libcrux_ml_dsa_types_SigningError case_Err; + } + val; +} +core_result_Result_48; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_9d_s { Eurydice_arr_a3 data[4U]; } Eurydice_arr_9d; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_9d + +*/ +typedef struct core_option_Option_d9_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_9d f0; +} +core_option_Option_d9; + +/** +A monomorphic instance of core.result.Result +with types (), libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_53_s +{ + core_result_Result_57_tags tag; + libcrux_ml_dsa_types_SigningError f0; +} +core_result_Result_53; + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.gamma1.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_gamma1_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized, + size_t gamma1_exponent +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_gamma1_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (gamma1_exponent + (size_t)1U), + .end = (i0 + (size_t)1U) * (gamma1_exponent + (size_t)1U) + } + )), + gamma1_exponent); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.signature.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_signature_serialize_37( + Eurydice_borrow_slice_u8 commitment_hash, + Eurydice_dst_ref_shared_44 signer_response, + Eurydice_dst_ref_shared_20 hint, + size_t commitment_hash_size, + size_t columns_in_a, + size_t rows_in_a, + size_t gamma1_exponent, + size_t gamma1_ring_element_size, + size_t max_ones_in_hint, + Eurydice_mut_borrow_slice_u8 signature +) +{ + size_t offset = (size_t)0U; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signature, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + commitment_hash_size + } + )), + commitment_hash, + uint8_t); + offset += commitment_hash_size; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_gamma1_serialize_37(&signer_response.ptr[i0], + Eurydice_slice_subslice_mut_c8(signature, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + gamma1_ring_element_size + } + )), + gamma1_exponent); + offset += gamma1_ring_element_size; + } + size_t true_hints_seen = (size_t)0U; + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)256U; i++) + { + size_t j = i; + if (hint.ptr[i1].data[j] == 1) + { + signature.ptr[offset + true_hints_seen] = (uint8_t)j; + true_hints_seen++; + } + } + signature.ptr[offset + max_ones_in_hint + i1] = (uint8_t)true_hints_seen; + } +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.to_i32_array_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline Eurydice_arr_6c +libcrux_ml_dsa_polynomial_to_i32_array_ff_37(const Eurydice_arr_a3 *self) +{ + Eurydice_arr_6c result = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_to_coefficient_array_65(&self->data[i0], + Eurydice_array_to_subslice_mut_44(&result, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT + } + ))); + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.make_hint +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_arithmetic_make_hint_37( + Eurydice_dst_ref_shared_44 low, + Eurydice_dst_ref_shared_44 high, + int32_t gamma2, + Eurydice_dst_ref_mut_20 hint +) +{ + size_t true_hints = (size_t)0U; + Eurydice_arr_a3 hint_simd = libcrux_ml_dsa_polynomial_zero_ff_37(); + for (size_t i0 = (size_t)0U; i0 < low.meta; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + size_t + one_hints_count = + libcrux_ml_dsa_simd_portable_compute_hint_65(&low.ptr[i1].data[j], + &high.ptr[i1].data[j], + gamma2, + &hint_simd.data[j]); + true_hints += one_hints_count; + } + Eurydice_arr_6c uu____0 = libcrux_ml_dsa_polynomial_to_i32_array_ff_37(&hint_simd); + hint.ptr[i1] = uu____0; + } + return true_hints; +} + +/** + CAUTION: This function must only be called with inputs for + which it is safe to leak the index of a violating coefficient. + + For all norm checks during ML-DSA signature generation it is + safe to leak the index of a violating coefficient. +*/ +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement<SIMDUnit>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.infinity_norm_exceeds_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_polynomial_infinity_norm_exceeds_ff_37( + const Eurydice_arr_a3 *self, + int32_t bound +) +{ + bool result = false; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + bool + coeff_exceeds = libcrux_ml_dsa_simd_portable_infinity_norm_exceeds_65(&self->data[i0], bound); + bool uu____0; + if (result) + { + uu____0 = true; + } + else + { + uu____0 = coeff_exceeds; + } + result = uu____0; + } + return result; +} + +/** + CAUTION: This function must only be called with inputs for + which it is safe to leak the index of a violating coefficient. + + For all norm checks during ML-DSA signature generation it is + safe to leak the index of a violating coefficient. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.vector_infinity_norm_exceeds +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37( + Eurydice_dst_ref_shared_44 vector, + int32_t bound +) +{ + bool result = false; + for (size_t i = (size_t)0U; i < vector.meta; i++) + { + size_t i0 = i; + bool uu____0; + if (result) + { + uu____0 = true; + } + else + { + uu____0 = libcrux_ml_dsa_polynomial_infinity_norm_exceeds_ff_37(&vector.ptr[i0], bound); + } + result = uu____0; + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_dsa.matrix.subtract_vectors +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_subtract_vectors_37( + size_t dimension, + Eurydice_dst_ref_mut_44 lhs, + Eurydice_dst_ref_shared_44 rhs +) +{ + for (size_t i = (size_t)0U; i < dimension; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_subtract_ff_37(&lhs.ptr[i0], &rhs.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.matrix.add_vectors +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_add_vectors_37( + size_t dimension, + Eurydice_dst_ref_mut_44 lhs, + Eurydice_dst_ref_shared_44 rhs +) +{ + for (size_t i = (size_t)0U; i < dimension; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_add_ff_37(&lhs.ptr[i0], &rhs.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.matrix.vector_times_ring_element +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_vector_times_ring_element_37( + Eurydice_dst_ref_mut_44 vector, + const Eurydice_arr_a3 *ring_element +) +{ + for (size_t i = (size_t)0U; i < vector.meta; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&vector.ptr[i0], ring_element); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&vector.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.commitment.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_commitment_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + size_t output_bytes_per_simd_unit = serialized.meta / ((size_t)8U * (size_t)4U); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_commitment_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * output_bytes_per_simd_unit, + .end = (i0 + (size_t)1U) * output_bytes_per_simd_unit + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.commitment.serialize_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_commitment_serialize_vector_37( + size_t ring_element_size, + Eurydice_dst_ref_shared_44 vector, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + size_t offset = (size_t)0U; + for (size_t i = (size_t)0U; i < vector.meta; i++) + { + size_t _cloop_j = i; + const Eurydice_arr_a3 *ring_element = &vector.ptr[_cloop_j]; + libcrux_ml_dsa_encoding_commitment_serialize_37(ring_element, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + ring_element_size + } + ))); + offset += ring_element_size; + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.decompose_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_decompose_vector_37( + size_t dimension, + int32_t gamma2, + Eurydice_dst_ref_shared_44 t, + Eurydice_dst_ref_mut_44 low, + Eurydice_dst_ref_mut_44 high +) +{ + for (size_t i0 = (size_t)0U; i0 < dimension; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_decompose_65(gamma2, + &t.ptr[i1].data[j], + &low.ptr[i1].data[j], + &high.ptr[i1].data[j]); + } + } +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_2f_s { Eurydice_arr_a3 data[16U]; } Eurydice_arr_2f; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 16 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_201(const Eurydice_arr_2f *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** + Compute InvertNTT(Â ◦ ŷ) +*/ +/** +A monomorphic instance of libcrux_ml_dsa.matrix.compute_matrix_x_mask +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_compute_matrix_x_mask_37( + size_t rows_in_a, + size_t columns_in_a, + Eurydice_dst_ref_shared_44 matrix, + Eurydice_dst_ref_shared_44 mask, + Eurydice_dst_ref_mut_44 result +) +{ + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t j = i; + Eurydice_arr_a3 product = mask.ptr[j]; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&product, &matrix.ptr[i1 * columns_in_a + j]); + libcrux_ml_dsa_polynomial_add_ff_37(&result.ptr[i1], &product); + } + libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(&result.ptr[i1]); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&result.ptr[i1]); + } +} + +/** +A monomorphic instance of core.option.Option +with types libcrux_ml_dsa_pre_hash_DomainSeparationContext + +*/ +typedef struct core_option_Option_84_s +{ + core_option_Option_45_tags tag; + libcrux_ml_dsa_pre_hash_DomainSeparationContext f0; +} +core_option_Option_84; + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t0.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t0_deserialize_37( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_t0_deserialize_65(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t0.deserialize_to_vector_then_ntt +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37( + Eurydice_borrow_slice_u8 serialized, + Eurydice_dst_ref_mut_44 ring_elements +) +{ + for + (size_t + i = (size_t)0U; + i < serialized.meta / LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE; + i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE, + .end = i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE + + LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE + } + )); + libcrux_ml_dsa_encoding_t0_deserialize_37(bytes, &ring_elements.ptr[i0]); + libcrux_ml_dsa_ntt_ntt_37(&ring_elements.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.error.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_error_deserialize_37( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + size_t chunk_size = libcrux_ml_dsa_encoding_error_chunk_size(eta); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_error_deserialize_65(eta, + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * chunk_size, + .end = (i0 + (size_t)1U) * chunk_size + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.error.deserialize_to_vector_then_ntt +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37( + libcrux_ml_dsa_constants_Eta eta, + size_t ring_element_size, + Eurydice_borrow_slice_u8 serialized, + Eurydice_dst_ref_mut_44 ring_elements +) +{ + for (size_t i = (size_t)0U; i < serialized.meta / ring_element_size; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * ring_element_size, + .end = i0 * ring_element_size + ring_element_size + } + )); + libcrux_ml_dsa_encoding_error_deserialize_37(eta, bytes, &ring_elements.ptr[i0]); + libcrux_ml_dsa_ntt_ntt_37(&ring_elements.ptr[i0]); + } +} + +/** + Init with zero +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature<SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.zero_c5 +with const generics +- SIZE= 2420 +*/ +static inline Eurydice_arr_85 libcrux_ml_dsa_types_zero_c5_37(void) +{ + return (KRML_CLITERAL(Eurydice_arr_85){ .data = { 0U } }); +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t0.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t0_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_t0_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.error.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_error_serialize_37( + libcrux_ml_dsa_constants_Eta eta, + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + size_t output_bytes_per_simd_unit = libcrux_ml_dsa_encoding_error_chunk_size(eta); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_error_serialize_65(eta, + simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * output_bytes_per_simd_unit, + .end = (i0 + (size_t)1U) * output_bytes_per_simd_unit + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t1.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t1_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_t1_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T1_SERIALIZE_OUTPUT_BYTES_PER_SIMD_UNIT, + .end = (i0 + (size_t)1U) * + LIBCRUX_ML_DSA_ENCODING_T1_SERIALIZE_OUTPUT_BYTES_PER_SIMD_UNIT + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.verification_key.generate_serialized +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_verification_key_generate_serialized_37( + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_shared_44 t1, + Eurydice_mut_borrow_slice_u8 verification_key_serialized +) +{ + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(verification_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + } + )), + seed, + uint8_t); + for (size_t i = (size_t)0U; i < t1.meta; i++) + { + size_t i0 = i; + const Eurydice_arr_a3 *ring_element = &t1.ptr[i0]; + size_t + offset = + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + + i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE; + libcrux_ml_dsa_encoding_t1_serialize_37(ring_element, + Eurydice_slice_subslice_mut_c8(verification_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.power2round_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_power2round_vector_37( + Eurydice_dst_ref_mut_44 t, + Eurydice_dst_ref_mut_44 t1 +) +{ + for (size_t i0 = (size_t)0U; i0 < t.meta; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_power2round_65(&t.ptr[i1].data[j], &t1.ptr[i1].data[j]); + } + } +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients[[$4size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_f5(const Eurydice_arr_9d *val) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_200(const Eurydice_arr_8f *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_20(const Eurydice_arr_9d *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** + Compute InvertNTT(Â ◦ ŝ₁) + s₂ +*/ +/** +A monomorphic instance of libcrux_ml_dsa.matrix.compute_as1_plus_s2 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_compute_as1_plus_s2_37( + size_t rows_in_a, + size_t columns_in_a, + Eurydice_dst_ref_mut_44 a_as_ntt, + Eurydice_dst_ref_shared_44 s1_ntt, + Eurydice_dst_ref_shared_44 s1_s2, + Eurydice_dst_ref_mut_44 result +) +{ + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t j = i; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&a_as_ntt.ptr[i1 * columns_in_a + j], + &s1_ntt.ptr[j]); + libcrux_ml_dsa_polynomial_add_ff_37(&result.ptr[i1], &a_as_ntt.ptr[i1 * columns_in_a + j]); + } + } + for (size_t i = (size_t)0U; i < result.meta; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(&result.ptr[i0]); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&result.ptr[i0]); + libcrux_ml_dsa_polynomial_add_ff_37(&result.ptr[i0], &s1_s2.ptr[columns_in_a + i0]); + } +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients, core_ops_range_Range size_t, Eurydice_derefed_slice libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_subslice_shared_25(const Eurydice_arr_8f *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_44){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_201(Eurydice_arr_9d *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 16 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_200(Eurydice_arr_2f *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_field_modulus +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37( + Eurydice_borrow_slice_u8 randomness, + size_t *sampled_coefficients, + Eurydice_arr_d0 *out +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)24U; i++) + { + size_t _cloop_i = i; + Eurydice_borrow_slice_u8 + random_bytes = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = _cloop_i * (size_t)24U, + .end = _cloop_i * (size_t)24U + (size_t)24U + } + )); + if (!done) + { + size_t + sampled = + libcrux_ml_dsa_simd_portable_rejection_sample_less_than_field_modulus_65(random_bytes, + Eurydice_array_to_subslice_from_mut_11(out, sampled_coefficients[0U])); + sampled_coefficients[0U] += sampled; + if (sampled_coefficients[0U] >= LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + done = true; + } + } + } + return done; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_20(Eurydice_arr_8f *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_eta_equals_4 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_4_37( + Eurydice_borrow_slice_u8 randomness, + size_t *sampled_coefficients, + Eurydice_arr_d0 *out +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)4U; i++) + { + size_t _cloop_i = i; + Eurydice_borrow_slice_u8 + random_bytes = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = _cloop_i * (size_t)4U, + .end = _cloop_i * (size_t)4U + (size_t)4U + } + )); + if (!done) + { + size_t + sampled = + libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_4_65(random_bytes, + Eurydice_array_to_subslice_from_mut_11(out, sampled_coefficients[0U])); + sampled_coefficients[0U] += sampled; + if (sampled_coefficients[0U] >= LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + done = true; + } + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_eta_equals_2 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_2_37( + Eurydice_borrow_slice_u8 randomness, + size_t *sampled_coefficients, + Eurydice_arr_d0 *out +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)4U; i++) + { + size_t _cloop_i = i; + Eurydice_borrow_slice_u8 + random_bytes = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = _cloop_i * (size_t)4U, + .end = _cloop_i * (size_t)4U + (size_t)4U + } + )); + if (!done) + { + size_t + sampled = + libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_2_65(random_bytes, + Eurydice_array_to_subslice_from_mut_11(out, sampled_coefficients[0U])); + sampled_coefficients[0U] += sampled; + if (sampled_coefficients[0U] >= LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + done = true; + } + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_eta +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 randomness, + size_t *sampled, + Eurydice_arr_d0 *out +) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + return + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_4_37(randomness, + sampled, + out); + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_2_37(randomness, + sampled, + out); +} + +typedef struct libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair_s +{ + Eurydice_arr_e2 signing_key; + Eurydice_arr_43 verification_key; +} +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair; + +typedef struct libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair_s +{ + Eurydice_arr_24 signing_key; + Eurydice_arr_29 verification_key; +} +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair; + +typedef struct libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair_s +{ + Eurydice_arr_10 signing_key; + Eurydice_arr_02 verification_key; +} +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair; + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa_core_H_DEFINED +#endif /* libcrux_mldsa_core_H */ + +/* from libcrux/combined_extraction/generated/libcrux_ct_ops.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_ct_ops_H +#define libcrux_ct_ops_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Return 1 if `value` is not zero and 0 otherwise. +*/ +static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_inz(uint8_t value) +{ + uint16_t value0 = (uint16_t)(uint32_t)value; + uint8_t result = (uint8_t)((uint32_t)core_num__u16__wrapping_add(~value0, 1U) >> 8U & 0xFFFFU); + return (uint32_t)result & 1U; +} + +static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) +{ + return libcrux_ml_kem_constant_time_ops_inz(value); +} + +/** + Return 1 if the bytes of `lhs` and `rhs` do not exactly + match and 0 otherwise. +*/ +static KRML_NOINLINE uint8_t +libcrux_ml_kem_constant_time_ops_compare( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs +) +{ + uint8_t r = 0U; + for (size_t i = (size_t)0U; i < lhs.meta; i++) + { + size_t i0 = i; + uint8_t nr = (uint32_t)r | ((uint32_t)lhs.ptr[i0] ^ (uint32_t)rhs.ptr[i0]); + r = nr; + } + return libcrux_ml_kem_constant_time_ops_is_non_zero(r); +} + +static KRML_NOINLINE uint8_t +libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs +) +{ + return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs); +} + +/** + If `selector` is not zero, return the bytes in `rhs`; return the bytes in + `lhs` otherwise. +*/ +static KRML_NOINLINE Eurydice_arr_ec +libcrux_ml_kem_constant_time_ops_select_ct( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs, + uint8_t selector +) +{ + uint8_t + mask = core_num__u8__wrapping_sub(libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U); + Eurydice_arr_ec out = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE; i++) + { + size_t i0 = i; + uint8_t + outi = + ((uint32_t)lhs.ptr[i0] & (uint32_t)mask) | ((uint32_t)rhs.ptr[i0] & (~(uint32_t)mask & 0xFFU)); + out.data[i0] = outi; + } + return out; +} + +static KRML_NOINLINE Eurydice_arr_ec +libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs, + uint8_t selector +) +{ + return libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector); +} + +static KRML_NOINLINE Eurydice_arr_ec +libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( + Eurydice_borrow_slice_u8 lhs_c, + Eurydice_borrow_slice_u8 rhs_c, + Eurydice_borrow_slice_u8 lhs_s, + Eurydice_borrow_slice_u8 rhs_s +) +{ + uint8_t + selector = libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(lhs_c, rhs_c); + return + libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(lhs_s, + rhs_s, + selector); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_ct_ops_H_DEFINED +#endif /* libcrux_ct_ops_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa_portable_H +#define libcrux_mldsa_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +typedef struct libcrux_ml_dsa_hash_functions_portable_Shake128X4_s +{ + Eurydice_arr_7c state0; + Eurydice_arr_7c state1; + Eurydice_arr_7c state2; + Eurydice_arr_7c state3; +} +libcrux_ml_dsa_hash_functions_portable_Shake128X4; + +typedef libcrux_sha3_portable_KeccakState libcrux_ml_dsa_hash_functions_portable_Shake256; + +typedef struct libcrux_ml_dsa_hash_functions_portable_Shake256X4_s +{ + Eurydice_arr_7c state0; + Eurydice_arr_7c state1; + Eurydice_arr_7c state2; + Eurydice_arr_7c state3; +} +libcrux_ml_dsa_hash_functions_portable_Shake256X4; + +typedef libcrux_sha3_portable_incremental_Shake256Xof +libcrux_ml_dsa_hash_functions_portable_Shake256Xof; + +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake128X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + Eurydice_arr_7c state0 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state0, input0); + Eurydice_arr_7c state1 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state1, input1); + Eurydice_arr_7c state2 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state2, input2); + Eurydice_arr_7c state3 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state3, input3); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_hash_functions_portable_Shake128X4){ + .state0 = state0, + .state1 = state1, + .state2 = state2, + .state3 = state3 + } + ); +} + +static KRML_MUSTINLINE Eurydice_arr_7c +libcrux_ml_dsa_hash_functions_portable_init_absorb_final_shake256( + Eurydice_borrow_slice_u8 input +) +{ + Eurydice_arr_7c state = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state, input); + return state; +} + +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake256X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb_x4( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + Eurydice_arr_7c state0 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state0, input0); + Eurydice_arr_7c state1 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state1, input1); + Eurydice_arr_7c state2 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state2, input2); + Eurydice_arr_7c state3 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state3, input3); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_hash_functions_portable_Shake256X4){ + .state0 = state0, + .state1 = state1, + .state2 = state2, + .state3 = state3 + } + ); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake128( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_portable_shake128(out, input); +} + +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_shake256(Eurydice_arr_7c *state) +{ + Eurydice_arr_ff out = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(state, + Eurydice_array_to_slice_mut_58(&out)); + return out; +} + +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *state +) +{ + Eurydice_arr_ff out0 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state0, + Eurydice_array_to_slice_mut_58(&out0)); + Eurydice_arr_ff out1 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state1, + Eurydice_array_to_slice_mut_58(&out1)); + Eurydice_arr_ff out2 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state2, + Eurydice_array_to_slice_mut_58(&out2)); + Eurydice_arr_ff out3 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state3, + Eurydice_array_to_slice_mut_58(&out3)); + return + (KRML_CLITERAL(Eurydice_arr_ff_x4){ .fst = out0, .snd = out1, .thd = out2, .f3 = out3 }); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *state, + Eurydice_arr_d10 *out0, + Eurydice_arr_d10 *out1, + Eurydice_arr_d10 *out2, + Eurydice_arr_d10 *out3 +) +{ + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state0, + Eurydice_array_to_slice_mut_4c(out0)); + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state1, + Eurydice_array_to_slice_mut_4c(out1)); + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state2, + Eurydice_array_to_slice_mut_4c(out2)); + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state3, + Eurydice_array_to_slice_mut_4c(out3)); +} + +static KRML_MUSTINLINE Eurydice_arr_c5_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *state +) +{ + Eurydice_arr_c5 out0 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state0, + Eurydice_array_to_slice_mut_2c(&out0)); + Eurydice_arr_c5 out1 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state1, + Eurydice_array_to_slice_mut_2c(&out1)); + Eurydice_arr_c5 out2 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state2, + Eurydice_array_to_slice_mut_2c(&out2)); + Eurydice_arr_c5 out3 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state3, + Eurydice_array_to_slice_mut_2c(&out3)); + return + (KRML_CLITERAL(Eurydice_arr_c5_x4){ .fst = out0, .snd = out1, .thd = out2, .f3 = out3 }); +} + +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_shake256(Eurydice_arr_7c *state) +{ + Eurydice_arr_ff out = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(state, + Eurydice_array_to_slice_mut_58(&out)); + return out; +} + +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *state +) +{ + Eurydice_arr_ff out0 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state0, + Eurydice_array_to_slice_mut_58(&out0)); + Eurydice_arr_ff out1 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state1, + Eurydice_array_to_slice_mut_58(&out1)); + Eurydice_arr_ff out2 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state2, + Eurydice_array_to_slice_mut_58(&out2)); + Eurydice_arr_ff out3 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state3, + Eurydice_array_to_slice_mut_58(&out3)); + return + (KRML_CLITERAL(Eurydice_arr_ff_x4){ .fst = out0, .snd = out1, .thd = out2, .f3 = out3 }); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::Xof for libcrux_ml_dsa::hash_functions::portable::Shake128} +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake128_7b( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake128(input, out); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake128X4} +*/ +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake128X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb_11( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + return libcrux_ml_dsa_hash_functions_portable_init_absorb(input0, input1, input2, input3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake128X4} +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks_11( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *self, + Eurydice_arr_d10 *out0, + Eurydice_arr_d10 *out1, + Eurydice_arr_d10 *out2, + Eurydice_arr_d10 *out3 +) +{ + libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks(self, out0, out1, out2, out3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake128X4} +*/ +static KRML_MUSTINLINE Eurydice_arr_c5_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *self +) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_next_block(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +static KRML_MUSTINLINE Eurydice_arr_7c +libcrux_ml_dsa_hash_functions_portable_init_absorb_final_61(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_dsa_hash_functions_portable_init_absorb_final_shake256(input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_61(Eurydice_arr_7c *self) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_shake256(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_61(Eurydice_arr_7c *self) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_shake256(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline void +libcrux_ml_dsa_hash_functions_portable_absorb_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + libcrux_sha3_portable_incremental_absorb_42(self, input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline void +libcrux_ml_dsa_hash_functions_portable_absorb_final_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + libcrux_sha3_portable_incremental_absorb_final_42(self, input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_ml_dsa_hash_functions_portable_init_26(void) +{ + return libcrux_sha3_portable_incremental_new_42(); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline void +libcrux_ml_dsa_hash_functions_portable_squeeze_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_portable_incremental_squeeze_42(self, out); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake256X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb_x4_9b( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + return libcrux_ml_dsa_hash_functions_portable_init_absorb_x4(input0, input1, input2, input3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4_9b( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *self +) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *self +) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4(self); +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_four_error_ring_elements +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_four_error_ring_elements_29( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 seed, + uint16_t start_index, + Eurydice_dst_ref_mut_44 re +) +{ + Eurydice_arr_91 seed0 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, start_index); + Eurydice_arr_91 + seed1 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, (uint32_t)start_index + 1U); + Eurydice_arr_91 + seed2 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, (uint32_t)start_index + 2U); + Eurydice_arr_91 + seed3 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, (uint32_t)start_index + 3U); + libcrux_ml_dsa_hash_functions_portable_Shake256X4 + state = + libcrux_ml_dsa_hash_functions_portable_init_absorb_x4_9b(Eurydice_array_to_slice_shared_f1(&seed0), + Eurydice_array_to_slice_shared_f1(&seed1), + Eurydice_array_to_slice_shared_f1(&seed2), + Eurydice_array_to_slice_shared_f1(&seed3)); + Eurydice_arr_ff_x4 + randomnesses0 = libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4_9b(&state); + Eurydice_arr_930 + out = + { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + size_t sampled0 = (size_t)0U; + size_t sampled1 = (size_t)0U; + size_t sampled2 = (size_t)0U; + size_t sampled3 = (size_t)0U; + libcrux_ml_dsa_constants_Eta uu____0 = eta; + bool + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____0, + Eurydice_array_to_slice_shared_58(&randomnesses0.fst), + &sampled0, + out.data); + libcrux_ml_dsa_constants_Eta uu____1 = eta; + bool + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____1, + Eurydice_array_to_slice_shared_58(&randomnesses0.snd), + &sampled1, + &out.data[1U]); + libcrux_ml_dsa_constants_Eta uu____2 = eta; + bool + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____2, + Eurydice_array_to_slice_shared_58(&randomnesses0.thd), + &sampled2, + &out.data[2U]); + libcrux_ml_dsa_constants_Eta uu____3 = eta; + bool + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____3, + Eurydice_array_to_slice_shared_58(&randomnesses0.f3), + &sampled3, + &out.data[3U]); + while (true) + { + if (done0) + { + if (done1) + { + if (done2) + { + if (done3) + { + break; + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____4 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____4, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____5 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____5, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____6 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____6, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____7 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____7, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____8 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____8, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____9 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____9, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____10 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____10, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____11 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____11, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____12 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____12, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____13 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____13, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____14 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____14, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____15 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____15, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____16 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____16, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____17 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____17, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____18 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____18, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____19 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____19, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + size_t max0 = (size_t)(uint32_t)start_index + (size_t)4U; + size_t max; + if (re.meta < max0) + { + max = re.meta; + } + else + { + max = max0; + } + for (size_t i = (size_t)(uint32_t)start_index; i < max; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_2c0(&out.data[i0 + % (size_t)4U]), + &re.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.samplex4.sample_s1_and_s2 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_samplex4_sample_s1_and_s2_29( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 s1_s2 +) +{ + size_t len = s1_s2.meta; + for (size_t i = (size_t)0U; i < len / (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_sample_sample_four_error_ring_elements_29(eta, + seed, + 4U * (uint32_t)(uint16_t)i0, + s1_s2); + } + size_t remainder = len % (size_t)4U; + if (remainder != (size_t)0U) + { + libcrux_ml_dsa_sample_sample_four_error_ring_elements_29(eta, + seed, + (uint16_t)(len - remainder), + s1_s2); + } +} + +/** + Sample and write out up to four ring elements. + + If i <= `elements_requested`, a field element with domain separated + seed according to the provided index is generated in + `tmp_stack[i]`. After successful rejection sampling in + `tmp_stack[i]`, the ring element is written to `matrix` at the + provided index in `indices[i]`. + `rand_stack` is a working buffer that holds initial Shake output. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_up_to_four_ring_elements_flat +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake128X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_63( + size_t columns, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 matrix, + Eurydice_arr_d10 *rand_stack0, + Eurydice_arr_d10 *rand_stack1, + Eurydice_arr_d10 *rand_stack2, + Eurydice_arr_d10 *rand_stack3, + Eurydice_dst_ref_mut_33 tmp_stack, + size_t start_index, + size_t elements_requested +) +{ + Eurydice_arr_31 + seed0 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index, columns)); + Eurydice_arr_31 + seed1 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index + (size_t)1U, + columns)); + Eurydice_arr_31 + seed2 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index + (size_t)2U, + columns)); + Eurydice_arr_31 + seed3 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index + (size_t)3U, + columns)); + libcrux_ml_dsa_hash_functions_portable_Shake128X4 + state = + libcrux_ml_dsa_hash_functions_portable_init_absorb_11(Eurydice_array_to_slice_shared_e9(&seed0), + Eurydice_array_to_slice_shared_e9(&seed1), + Eurydice_array_to_slice_shared_e9(&seed2), + Eurydice_array_to_slice_shared_e9(&seed3)); + libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks_11(&state, + rand_stack0, + rand_stack1, + rand_stack2, + rand_stack3); + size_t sampled0 = (size_t)0U; + size_t sampled1 = (size_t)0U; + size_t sampled2 = (size_t)0U; + size_t sampled3 = (size_t)0U; + bool + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack0), + &sampled0, + tmp_stack.ptr); + bool + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack1), + &sampled1, + &tmp_stack.ptr[1U]); + bool + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack2), + &sampled2, + &tmp_stack.ptr[2U]); + bool + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack3), + &sampled3, + &tmp_stack.ptr[3U]); + while (true) + { + if (done0) + { + if (done1) + { + if (done2) + { + if (done3) + { + break; + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + for (size_t i = (size_t)0U; i < elements_requested; i++) + { + size_t k = i; + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_2c0(&tmp_stack.ptr[k]), + &matrix.ptr[start_index + k]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.samplex4.matrix_flat +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake128X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_samplex4_matrix_flat_63( + size_t columns, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 matrix +) +{ + Eurydice_arr_d10 rand_stack0 = { .data = { 0U } }; + Eurydice_arr_d10 rand_stack1 = { .data = { 0U } }; + Eurydice_arr_d10 rand_stack2 = { .data = { 0U } }; + Eurydice_arr_d10 rand_stack3 = { .data = { 0U } }; + Eurydice_arr_930 + tmp_stack = + { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < matrix.meta / (size_t)4U + (size_t)1U; i++) + { + size_t start_index = i; + size_t start_index0 = start_index * (size_t)4U; + if (start_index0 >= matrix.meta) + { + break; + } + size_t elements_requested; + if (start_index0 + (size_t)4U <= matrix.meta) + { + elements_requested = (size_t)4U; + } + else + { + elements_requested = matrix.meta - start_index0; + } + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_63(columns, + seed, + matrix, + &rand_stack0, + &rand_stack1, + &rand_stack2, + &rand_stack3, + Eurydice_array_to_slice_mut_7e(&tmp_stack), + start_index0, + elements_requested); + } +} + +/** +This function found in impl {libcrux_ml_dsa::samplex4::X4Sampler for libcrux_ml_dsa::samplex4::portable::PortableSampler} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.samplex4.portable.matrix_flat_a8 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline void +libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37( + size_t columns, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 matrix +) +{ + libcrux_ml_dsa_samplex4_matrix_flat_63(columns, seed, matrix); +} + +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256 +with const generics +- OUTPUT_LENGTH= 64 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_c9( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_c7 *out +) +{ + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_17(out), input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_61 +with const generics +- OUTPUT_LENGTH= 64 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_61_c9( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_c7 *out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_c9(input, out); +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.signing_key.generate_serialized +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e( + libcrux_ml_dsa_constants_Eta eta, + size_t error_ring_element_size, + Eurydice_borrow_slice_u8 seed_matrix, + Eurydice_borrow_slice_u8 seed_signing, + Eurydice_borrow_slice_u8 verification_key, + Eurydice_dst_ref_shared_44 s1_2, + Eurydice_dst_ref_shared_44 t0, + Eurydice_mut_borrow_slice_u8 signing_key_serialized +) +{ + size_t offset = (size_t)0U; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + } + )), + seed_matrix, + uint8_t); + offset += LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE + } + )), + seed_signing, + uint8_t); + offset += LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE; + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(verification_key, + &verification_key_hash); + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH + } + )), + Eurydice_array_to_slice_shared_17(&verification_key_hash), + uint8_t); + offset += LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH; + for (size_t i = (size_t)0U; i < s1_2.meta; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_error_serialize_37(eta, + &s1_2.ptr[i0], + Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + error_ring_element_size + } + ))); + offset += error_ring_element_size; + } + for (size_t i = (size_t)0U; i < t0.meta; i++) + { + size_t _cloop_j = i; + const Eurydice_arr_a3 *ring_element = &t0.ptr[_cloop_j]; + libcrux_ml_dsa_encoding_t0_serialize_37(ring_element, + Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE + } + ))); + offset += LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE; + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.generate_key_pair +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_generate_key_pair_5a( + Eurydice_arr_ec randomness, + Eurydice_mut_borrow_slice_u8 signing_key, + Eurydice_mut_borrow_slice_u8 verification_key +) +{ + Eurydice_arr_89 seed_expanded0 = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_01(&randomness)); + /* original Rust expression is not an lvalue in C */ + Eurydice_array_u8x2 + lvalue = + { + .data = { + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_82(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_78(&seed_expanded0)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_78(&seed_expanded0), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 seed_expanded = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(seed_expanded, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_error_vectors = uu____1.fst; + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.snd; + Eurydice_arr_8f s1_s2; + Eurydice_arr_a3 repeat_expression0[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_s2.data, repeat_expression0, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_sample_s1_and_s2_29(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + seed_for_error_vectors, + Eurydice_array_to_slice_mut_20(&s1_s2)); + Eurydice_arr_9d t0; + Eurydice_arr_a3 repeat_expression1[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0.data, repeat_expression1, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_2f a_as_ntt; + Eurydice_arr_a3 repeat_expression2[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_as_ntt.data, repeat_expression2, (size_t)16U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_200(&a_as_ntt)); + Eurydice_arr_9d s1_ntt; + Eurydice_arr_a3 repeat_expression3[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_ntt.data, repeat_expression3, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_201(&s1_ntt), + Eurydice_array_to_subslice_shared_25(&s1_s2, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A + } + )), + Eurydice_arr_a3); + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&s1_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_as1_plus_s2_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_200(&a_as_ntt), + Eurydice_array_to_slice_shared_20(&s1_ntt), + Eurydice_array_to_slice_shared_200(&s1_s2), + Eurydice_array_to_slice_mut_201(&t0)); + Eurydice_arr_9d t1; + Eurydice_arr_a3 repeat_expression[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_arithmetic_power2round_vector_37(Eurydice_array_to_slice_mut_201(&t0), + Eurydice_array_to_slice_mut_201(&t1)); + libcrux_ml_dsa_encoding_verification_key_generate_serialized_37(seed_for_a, + Eurydice_array_to_slice_shared_20(&t1), + verification_key); + libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE, + seed_for_a, + seed_for_signing, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = verification_key.ptr, + .meta = verification_key.meta + } + ), + Eurydice_array_to_slice_shared_200(&s1_s2), + Eurydice_array_to_slice_shared_20(&t0), + signing_key); +} + +/** + Generate key pair. +*/ +static inline void +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_generate_key_pair( + Eurydice_arr_ec randomness, + Eurydice_arr_10 *signing_key, + Eurydice_arr_02 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_generate_key_pair_5a(randomness, + Eurydice_array_to_slice_mut_34(signing_key), + Eurydice_array_to_slice_mut_9f0(verification_key)); +} + +/** + This corresponds to line 6 in algorithm 7 in FIPS 204 (line 7 in algorithm + 8, resp.). + + If `domain_separation_context` is supplied, applies domain + separation and length encoding to the context string, + before appending the message (in the regular variant) or the + pre-hash OID as well as the pre-hashed message digest. Otherwise, + it is assumed that `message` already contains domain separation + information. + + In FIPS 204 M' is the concatenation of the domain separated context, any + potential pre-hash OID and the message (or the message pre-hash). We do not + explicitely construct the concatenation in memory since it is of statically unknown + length, but feed its components directly into the incremental XOF. + + Refer to line 10 of Algorithm 2 (and line 5 of Algorithm 3, resp.) in [FIPS + 204](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf#section.5) + for details on the domain separation for regular ML-DSA. Line + 23 of Algorithm 4 (and line 18 of Algorithm 5,resp.) describe domain separation for the HashMl-DSA + variant. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.derive_message_representative +with types libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43( + Eurydice_borrow_slice_u8 verification_key_hash, + const core_option_Option_84 *domain_separation_context, + Eurydice_borrow_slice_u8 message, + Eurydice_arr_c7 *message_representative +) +{ + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, verification_key_hash); + if (domain_separation_context->tag == core_option_Some) + { + const + libcrux_ml_dsa_pre_hash_DomainSeparationContext + *domain_separation_context0 = &domain_separation_context->f0; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *uu____0 = &shake; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_82 + lvalue0 = + { + .data = { + (uint8_t)core_option__core__option__Option_T__TraitClause_0___is_some(libcrux_ml_dsa_pre_hash_pre_hash_oid_88(domain_separation_context0), + Eurydice_arr_c9, + bool) + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_26(uu____0, + Eurydice_array_to_slice_shared_79(&lvalue0)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *uu____1 = &shake; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_82 + lvalue = + { .data = { (uint8_t)libcrux_ml_dsa_pre_hash_context_88(domain_separation_context0).meta } }; + libcrux_ml_dsa_hash_functions_portable_absorb_26(uu____1, + Eurydice_array_to_slice_shared_79(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + libcrux_ml_dsa_pre_hash_context_88(domain_separation_context0)); + const + core_option_Option_57 + *uu____2 = libcrux_ml_dsa_pre_hash_pre_hash_oid_88(domain_separation_context0); + if (uu____2->tag == core_option_Some) + { + const Eurydice_arr_c9 *pre_hash_oid = &uu____2->f0; + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_2f(pre_hash_oid)); + } + } + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, message); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_17(message_representative)); +} + +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256 +with const generics +- OUTPUT_LENGTH= 576 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_5a( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_220 *out +) +{ + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_8a(out), input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_x4_9b +with const generics +- OUT_LEN= 576 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_5a( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3, + Eurydice_arr_220 *out0, + Eurydice_arr_220 *out1, + Eurydice_arr_220 *out2, + Eurydice_arr_220 *out3 +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input0, out0); + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input1, out1); + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input2, out2); + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input3, out3); +} + +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256 +with const generics +- OUTPUT_LENGTH= 640 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_0e( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_20 *out +) +{ + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_4f(out), input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_x4_9b +with const generics +- OUT_LEN= 640 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_0e( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3, + Eurydice_arr_20 *out0, + Eurydice_arr_20 *out1, + Eurydice_arr_20 *out2, + Eurydice_arr_20 *out3 +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input0, out0); + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input1, out1); + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input2, out2); + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input3, out3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_61 +with const generics +- OUTPUT_LENGTH= 640 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_61_0e( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_20 *out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input, out); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_61 +with const generics +- OUTPUT_LENGTH= 576 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_61_5a( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_220 *out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input, out); +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_mask_ring_element +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_mask_ring_element_2e( + const Eurydice_arr_91 *seed, + Eurydice_arr_a3 *result, + size_t gamma1_exponent +) +{ + switch (gamma1_exponent) + { + case 17U: + { + break; + } + case 19U: + { + Eurydice_arr_20 out = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_0e(Eurydice_array_to_slice_shared_f1(seed), + &out); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out), + result); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + Eurydice_arr_220 out = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_5a(Eurydice_array_to_slice_shared_f1(seed), + &out); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out), + result); +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_mask_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_mask_vector_67( + size_t dimension, + size_t gamma1_exponent, + const Eurydice_arr_c7 *seed, + uint16_t *domain_separator, + Eurydice_dst_ref_mut_44 mask +) +{ + Eurydice_arr_91 + seed0 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + domain_separator[0U]); + Eurydice_arr_91 + seed1 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + (uint32_t)domain_separator[0U] + 1U); + Eurydice_arr_91 + seed2 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + (uint32_t)domain_separator[0U] + 2U); + Eurydice_arr_91 + seed3 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + (uint32_t)domain_separator[0U] + 3U); + domain_separator[0U] = (uint32_t)domain_separator[0U] + 4U; + switch (gamma1_exponent) + { + case 17U: + { + Eurydice_arr_220 out0 = { .data = { 0U } }; + Eurydice_arr_220 out1 = { .data = { 0U } }; + Eurydice_arr_220 out2 = { .data = { 0U } }; + Eurydice_arr_220 out3 = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_5a(Eurydice_array_to_slice_shared_f1(&seed0), + Eurydice_array_to_slice_shared_f1(&seed1), + Eurydice_array_to_slice_shared_f1(&seed2), + Eurydice_array_to_slice_shared_f1(&seed3), + &out0, + &out1, + &out2, + &out3); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out0), + mask.ptr); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out1), + &mask.ptr[1U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out2), + &mask.ptr[2U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out3), + &mask.ptr[3U]); + break; + } + case 19U: + { + Eurydice_arr_20 out0 = { .data = { 0U } }; + Eurydice_arr_20 out1 = { .data = { 0U } }; + Eurydice_arr_20 out2 = { .data = { 0U } }; + Eurydice_arr_20 out3 = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_0e(Eurydice_array_to_slice_shared_f1(&seed0), + Eurydice_array_to_slice_shared_f1(&seed1), + Eurydice_array_to_slice_shared_f1(&seed2), + Eurydice_array_to_slice_shared_f1(&seed3), + &out0, + &out1, + &out2, + &out3); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out0), + mask.ptr); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out1), + &mask.ptr[1U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out2), + &mask.ptr[2U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out3), + &mask.ptr[3U]); + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + for (size_t i = (size_t)4U; i < dimension; i++) + { + size_t i0 = i; + Eurydice_arr_91 + seed4 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + domain_separator[0U]); + domain_separator[0U] = (uint32_t)domain_separator[0U] + 1U; + libcrux_ml_dsa_sample_sample_mask_ring_element_2e(&seed4, &mask.ptr[i0], gamma1_exponent); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_challenge_ring_element +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_challenge_ring_element_2e( + Eurydice_borrow_slice_u8 seed, + size_t number_of_ones, + Eurydice_arr_a3 *re +) +{ + Eurydice_arr_7c state = libcrux_ml_dsa_hash_functions_portable_init_absorb_final_61(seed); + Eurydice_arr_ff + randomness0 = libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_61(&state); + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_array_to_subslice_shared_d40(&randomness0, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + uint64_t + signs = + core_num__u64__from_le_bytes(core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + ))); + Eurydice_arr_6c result = { .data = { 0U } }; + size_t out_index = (size_t)256U - number_of_ones; + bool + done = + libcrux_ml_dsa_sample_inside_out_shuffle(Eurydice_array_to_subslice_from_shared_5f(&randomness0, + (size_t)8U), + &out_index, + &signs, + &result); + while (true) + { + if (done) + { + break; + } + else + { + Eurydice_arr_ff + randomness = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_61(&state); + done = + libcrux_ml_dsa_sample_inside_out_shuffle(Eurydice_array_to_slice_shared_58(&randomness), + &out_index, + &signs, + &result); + } + } + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_af(&result), re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_internal_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(signing_key, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 remaining_serialized0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(remaining_serialized0, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.fst; + Eurydice_borrow_slice_u8 remaining_serialized1 = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(remaining_serialized1, + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 verification_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 remaining_serialized2 = uu____2.snd; + Eurydice_borrow_slice_u8_x2 + uu____3 = + Eurydice_slice_split_at(remaining_serialized2, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s1_serialized = uu____3.fst; + Eurydice_borrow_slice_u8 remaining_serialized = uu____3.snd; + Eurydice_borrow_slice_u8_x2 + uu____4 = + Eurydice_slice_split_at(remaining_serialized, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s2_serialized = uu____4.fst; + Eurydice_borrow_slice_u8 t0_serialized = uu____4.snd; + Eurydice_arr_9d s1_as_ntt; + Eurydice_arr_a3 repeat_expression0[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_as_ntt.data, repeat_expression0, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d s2_as_ntt; + Eurydice_arr_a3 repeat_expression1[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s2_as_ntt.data, repeat_expression1, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d t0_as_ntt; + Eurydice_arr_a3 repeat_expression2[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0_as_ntt.data, repeat_expression2, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE, + s1_serialized, + Eurydice_array_to_slice_mut_201(&s1_as_ntt)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE, + s2_serialized, + Eurydice_array_to_slice_mut_201(&s2_as_ntt)); + libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37(t0_serialized, + Eurydice_array_to_slice_mut_201(&t0_as_ntt)); + Eurydice_arr_2f matrix; + Eurydice_arr_a3 repeat_expression3[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression3, (size_t)16U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_200(&matrix)); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(verification_key_hash, + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_c7 mask_seed = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake0 = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, seed_for_signing); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, + Eurydice_array_to_slice_shared_01(&randomness)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake0, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake0, + Eurydice_array_to_slice_mut_17(&mask_seed)); + uint16_t domain_separator_for_mask = 0U; + size_t attempt = (size_t)0U; + core_option_Option_14 commitment_hash0 = { .tag = core_option_None }; + core_option_Option_d9 signer_response0 = { .tag = core_option_None }; + core_option_Option_51 hint0 = { .tag = core_option_None }; + while (attempt < LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN) + { + attempt++; + Eurydice_arr_9d mask; + Eurydice_arr_a3 repeat_expression4[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression4[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(mask.data, repeat_expression4, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d w0; + Eurydice_arr_a3 repeat_expression5[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression5[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(w0.data, repeat_expression5, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d commitment; + Eurydice_arr_a3 repeat_expression6[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression6[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(commitment.data, repeat_expression6, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_sample_sample_mask_vector_67(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT, + &mask_seed, + &domain_separator_for_mask, + Eurydice_array_to_slice_mut_201(&mask)); + Eurydice_arr_9d a_x_mask; + Eurydice_arr_a3 repeat_expression[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_x_mask.data, repeat_expression, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d + mask_ntt = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &mask, + Eurydice_arr_a3, + Eurydice_arr_9d); + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&mask_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_matrix_x_mask_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_201(&matrix), + Eurydice_array_to_slice_shared_20(&mask_ntt), + Eurydice_array_to_slice_mut_201(&a_x_mask)); + libcrux_ml_dsa_arithmetic_decompose_vector_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2, + Eurydice_array_to_slice_shared_20(&a_x_mask), + Eurydice_array_to_slice_mut_201(&w0), + Eurydice_array_to_slice_mut_201(&commitment)); + Eurydice_arr_ec commitment_hash_candidate = { .data = { 0U } }; + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_20(&commitment), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_01(&commitment_hash_candidate)); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_01(&commitment_hash_candidate), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + Eurydice_arr_9d + challenge_times_s1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &s1_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_9d); + Eurydice_arr_9d + challenge_times_s2 = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &s2_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_9d); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_201(&challenge_times_s1), + &verifier_challenge); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_201(&challenge_times_s2), + &verifier_challenge); + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_201(&mask), + Eurydice_array_to_slice_shared_20(&challenge_times_s1)); + libcrux_ml_dsa_matrix_subtract_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + Eurydice_array_to_slice_mut_201(&w0), + Eurydice_array_to_slice_shared_20(&challenge_times_s2)); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&mask), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA) + ) + { + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&w0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2 - LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA) + ) + { + Eurydice_arr_9d + challenge_times_t0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &t0_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_9d); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_201(&challenge_times_t0), + &verifier_challenge); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&challenge_times_t0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2) + ) + { + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + Eurydice_array_to_slice_mut_201(&w0), + Eurydice_array_to_slice_shared_20(&challenge_times_t0)); + Eurydice_arr_b7 + hint_candidate = + { + .data = { + { .data = { 0U } }, + { .data = { 0U } }, + { .data = { 0U } }, + { .data = { 0U } } + } + }; + size_t + ones_in_hint = + libcrux_ml_dsa_arithmetic_make_hint_37(Eurydice_array_to_slice_shared_20(&w0), + Eurydice_array_to_slice_shared_20(&commitment), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2, + Eurydice_array_to_slice_mut_86(&hint_candidate)); + if (!(ones_in_hint > LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT)) + { + attempt = LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN; + commitment_hash0 = + ( + KRML_CLITERAL(core_option_Option_14){ + .tag = core_option_Some, + .f0 = commitment_hash_candidate + } + ); + signer_response0 = + (KRML_CLITERAL(core_option_Option_d9){ .tag = core_option_Some, .f0 = mask }); + hint0 = + ( + KRML_CLITERAL(core_option_Option_51){ + .tag = core_option_Some, + .f0 = hint_candidate + } + ); + } + } + } + } + } + core_result_Result_53 uu____5; + if (commitment_hash0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_ec commitment_hash = commitment_hash0.f0; + Eurydice_arr_ec commitment_hash1 = commitment_hash; + if (signer_response0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_9d signer_response = signer_response0.f0; + Eurydice_arr_9d signer_response1 = signer_response; + if (!(hint0.tag == core_option_None)) + { + Eurydice_arr_b7 hint = hint0.f0; + Eurydice_arr_b7 hint1 = hint; + libcrux_ml_dsa_encoding_signature_serialize_37(Eurydice_array_to_slice_shared_01(&commitment_hash1), + Eurydice_array_to_slice_shared_20(&signer_response1), + Eurydice_array_to_slice_shared_86(&hint1), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT, + Eurydice_array_to_slice_mut_0d(signature)); + return (KRML_CLITERAL(core_result_Result_53){ .tag = core_result_Ok }); + } + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + } + return uu____5; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_mut_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_internal_5a(signing_key, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_85 signature = libcrux_ml_dsa_types_zero_c5_37(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_mut_5a(signing_key, + message, + context, + randomness, + &signature); + core_result_Result_48 uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_48){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_48){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign. +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_5a(Eurydice_array_to_slice_shared_34(signing_key), + message, + context, + randomness); +} + +/** + Sign. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_mut( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_mut_5a(Eurydice_array_to_slice_shared_34(signing_key), + message, + context, + randomness, + signature); +} + +/** +This function found in impl {libcrux_ml_dsa::pre_hash::PreHash for libcrux_ml_dsa::pre_hash::SHAKE128_PH} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.pre_hash.hash_30 +with types libcrux_ml_dsa_hash_functions_portable_Shake128 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_pre_hash_hash_30_83( + Eurydice_borrow_slice_u8 message, + Eurydice_mut_borrow_slice_u8 output +) +{ + libcrux_ml_dsa_hash_functions_portable_shake128_7b(message, output); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_pre_hashed_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_mut_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_internal_5a(signing_key, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); + } + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_85 signature = libcrux_ml_dsa_types_zero_c5_37(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_mut_3f(signing_key, + message, + context, + pre_hash_buffer, + randomness, + &signature); + core_result_Result_48 uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_48){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_48){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign (pre-hashed). +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_pre_hashed_shake128( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_3f(Eurydice_array_to_slice_shared_34(signing_key), + message, + context, + pre_hash_buffer, + randomness); +} + +/** + The internal verification API. + + If no `domain_separation_context` is supplied, it is assumed that + `message` already contains the domain separation. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.verify_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_internal_5a( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + const Eurydice_arr_85 *signature_serialized +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_9f(verification_key), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 t1_serialized = uu____0.snd; + Eurydice_arr_9d t1; + Eurydice_arr_a3 repeat_expression0[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression0, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_verification_key_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_VERIFICATION_KEY_SIZE, + t1_serialized, + Eurydice_array_to_slice_mut_201(&t1)); + Eurydice_arr_ec deserialized_commitment_hash = { .data = { 0U } }; + Eurydice_arr_9d deserialized_signer_response; + Eurydice_arr_a3 repeat_expression1[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(deserialized_signer_response.data, + repeat_expression1, + (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_b7 + deserialized_hint = + { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + core_result_Result_41 + uu____1 = + libcrux_ml_dsa_encoding_signature_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_SIGNATURE_SIZE, + Eurydice_array_to_slice_shared_0d(signature_serialized), + Eurydice_array_to_slice_mut_01(&deserialized_commitment_hash), + Eurydice_array_to_slice_mut_201(&deserialized_signer_response), + Eurydice_array_to_slice_mut_86(&deserialized_hint)); + core_result_Result_41 uu____2; + if (uu____1.tag == core_result_Ok) + { + if + ( + libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&deserialized_signer_response), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA) + ) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError + } + ); + } + else + { + Eurydice_arr_2f matrix; + Eurydice_arr_a3 repeat_expression[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression, (size_t)16U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_200(&matrix)); + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(Eurydice_array_to_slice_shared_9f(verification_key), + &verification_key_hash); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(Eurydice_array_to_slice_shared_17(&verification_key_hash), + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_01(&deserialized_commitment_hash), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&deserialized_signer_response.data[i0]); + } + libcrux_ml_dsa_matrix_compute_w_approx_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_201(&matrix), + Eurydice_array_to_slice_shared_20(&deserialized_signer_response), + &verifier_challenge, + Eurydice_array_to_slice_mut_201(&t1)); + Eurydice_arr_ec recomputed_commitment_hash = { .data = { 0U } }; + libcrux_ml_dsa_arithmetic_use_hint_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2, + Eurydice_array_to_slice_shared_86(&deserialized_hint), + Eurydice_array_to_slice_mut_201(&t1)); + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_20(&t1), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_01(&recomputed_commitment_hash)); + if + ( + Eurydice_array_eq((size_t)32U, + &deserialized_commitment_hash, + &recomputed_commitment_hash, + uint8_t) + ) + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + else + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError + } + ); + } + } + } + else + { + libcrux_ml_dsa_types_VerificationError e = uu____1.f0; + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Err, .f0 = e }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.verify +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_5a( + const Eurydice_arr_02 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature_serialized +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_internal_5a(verification_key_serialized, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_5a(verification_key, + message, + context, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.verify_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_pre_hashed_3f( + const Eurydice_arr_02 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_85 *signature_serialized +) +{ + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_internal_5a(verification_key_serialized, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify (pre-hashed with SHAKE-128). +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify_pre_hashed_shake128( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_pre_hashed_3f(verification_key, + message, + context, + pre_hash_buffer, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.generate_key_pair +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_generate_key_pair_5a( + Eurydice_arr_ec randomness, + Eurydice_mut_borrow_slice_u8 signing_key, + Eurydice_mut_borrow_slice_u8 verification_key +) +{ + Eurydice_arr_89 seed_expanded0 = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_01(&randomness)); + /* original Rust expression is not an lvalue in C */ + Eurydice_array_u8x2 + lvalue = + { + .data = { + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_82(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_78(&seed_expanded0)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_78(&seed_expanded0), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 seed_expanded = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(seed_expanded, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_error_vectors = uu____1.fst; + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.snd; + Eurydice_arr_47 s1_s2; + Eurydice_arr_a3 repeat_expression0[11U]; + for (size_t i = (size_t)0U; i < (size_t)11U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_s2.data, repeat_expression0, (size_t)11U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_sample_s1_and_s2_29(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + seed_for_error_vectors, + Eurydice_array_to_slice_mut_202(&s1_s2)); + Eurydice_arr_dc1 t0; + Eurydice_arr_a3 repeat_expression1[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0.data, repeat_expression1, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_5a a_as_ntt; + Eurydice_arr_a3 repeat_expression2[30U]; + for (size_t i = (size_t)0U; i < (size_t)30U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_as_ntt.data, repeat_expression2, (size_t)30U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_203(&a_as_ntt)); + Eurydice_arr_5d s1_ntt; + Eurydice_arr_a3 repeat_expression3[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_ntt.data, repeat_expression3, (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_204(&s1_ntt), + Eurydice_array_to_subslice_shared_250(&s1_s2, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A + } + )), + Eurydice_arr_a3); + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&s1_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_as1_plus_s2_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_203(&a_as_ntt), + Eurydice_array_to_slice_shared_202(&s1_ntt), + Eurydice_array_to_slice_shared_203(&s1_s2), + Eurydice_array_to_slice_mut_205(&t0)); + Eurydice_arr_dc1 t1; + Eurydice_arr_a3 repeat_expression[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_arithmetic_power2round_vector_37(Eurydice_array_to_slice_mut_205(&t0), + Eurydice_array_to_slice_mut_205(&t1)); + libcrux_ml_dsa_encoding_verification_key_generate_serialized_37(seed_for_a, + Eurydice_array_to_slice_shared_204(&t1), + verification_key); + libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE, + seed_for_a, + seed_for_signing, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = verification_key.ptr, + .meta = verification_key.meta + } + ), + Eurydice_array_to_slice_shared_203(&s1_s2), + Eurydice_array_to_slice_shared_204(&t0), + signing_key); +} + +/** + Generate key pair. +*/ +static inline void +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_generate_key_pair( + Eurydice_arr_ec randomness, + Eurydice_arr_24 *signing_key, + Eurydice_arr_29 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_generate_key_pair_5a(randomness, + Eurydice_array_to_slice_mut_98(signing_key), + Eurydice_array_to_slice_mut_37(verification_key)); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_internal_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(signing_key, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 remaining_serialized0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(remaining_serialized0, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.fst; + Eurydice_borrow_slice_u8 remaining_serialized1 = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(remaining_serialized1, + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 verification_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 remaining_serialized2 = uu____2.snd; + Eurydice_borrow_slice_u8_x2 + uu____3 = + Eurydice_slice_split_at(remaining_serialized2, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s1_serialized = uu____3.fst; + Eurydice_borrow_slice_u8 remaining_serialized = uu____3.snd; + Eurydice_borrow_slice_u8_x2 + uu____4 = + Eurydice_slice_split_at(remaining_serialized, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s2_serialized = uu____4.fst; + Eurydice_borrow_slice_u8 t0_serialized = uu____4.snd; + Eurydice_arr_5d s1_as_ntt; + Eurydice_arr_a3 repeat_expression0[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_as_ntt.data, repeat_expression0, (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 s2_as_ntt; + Eurydice_arr_a3 repeat_expression1[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s2_as_ntt.data, repeat_expression1, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 t0_as_ntt; + Eurydice_arr_a3 repeat_expression2[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0_as_ntt.data, repeat_expression2, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE, + s1_serialized, + Eurydice_array_to_slice_mut_204(&s1_as_ntt)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE, + s2_serialized, + Eurydice_array_to_slice_mut_205(&s2_as_ntt)); + libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37(t0_serialized, + Eurydice_array_to_slice_mut_205(&t0_as_ntt)); + Eurydice_arr_5a matrix; + Eurydice_arr_a3 repeat_expression3[30U]; + for (size_t i = (size_t)0U; i < (size_t)30U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression3, (size_t)30U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_203(&matrix)); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(verification_key_hash, + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_c7 mask_seed = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake0 = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, seed_for_signing); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, + Eurydice_array_to_slice_shared_01(&randomness)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake0, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake0, + Eurydice_array_to_slice_mut_17(&mask_seed)); + uint16_t domain_separator_for_mask = 0U; + size_t attempt = (size_t)0U; + core_option_Option_81 commitment_hash0 = { .tag = core_option_None }; + core_option_Option_1e signer_response0 = { .tag = core_option_None }; + core_option_Option_05 hint0 = { .tag = core_option_None }; + while (attempt < LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN) + { + attempt++; + Eurydice_arr_5d mask; + Eurydice_arr_a3 repeat_expression4[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression4[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(mask.data, repeat_expression4, (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 w0; + Eurydice_arr_a3 repeat_expression5[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression5[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(w0.data, repeat_expression5, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 commitment; + Eurydice_arr_a3 repeat_expression6[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression6[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(commitment.data, repeat_expression6, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_sample_sample_mask_vector_67(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT, + &mask_seed, + &domain_separator_for_mask, + Eurydice_array_to_slice_mut_204(&mask)); + Eurydice_arr_dc1 a_x_mask; + Eurydice_arr_a3 repeat_expression[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_x_mask.data, repeat_expression, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_5d + mask_ntt = + core_array__core__clone__Clone_for__T__N___clone((size_t)5U, + &mask, + Eurydice_arr_a3, + Eurydice_arr_5d); + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&mask_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_matrix_x_mask_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_205(&matrix), + Eurydice_array_to_slice_shared_202(&mask_ntt), + Eurydice_array_to_slice_mut_205(&a_x_mask)); + libcrux_ml_dsa_arithmetic_decompose_vector_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2, + Eurydice_array_to_slice_shared_204(&a_x_mask), + Eurydice_array_to_slice_mut_205(&w0), + Eurydice_array_to_slice_mut_205(&commitment)); + Eurydice_arr_65 commitment_hash_candidate = { .data = { 0U } }; + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_204(&commitment), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_9f(&commitment_hash_candidate)); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_9f0(&commitment_hash_candidate), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + Eurydice_arr_5d + challenge_times_s1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)5U, + &s1_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_5d); + Eurydice_arr_dc1 + challenge_times_s2 = + core_array__core__clone__Clone_for__T__N___clone((size_t)6U, + &s2_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_dc1); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_204(&challenge_times_s1), + &verifier_challenge); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_205(&challenge_times_s2), + &verifier_challenge); + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_204(&mask), + Eurydice_array_to_slice_shared_202(&challenge_times_s1)); + libcrux_ml_dsa_matrix_subtract_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + Eurydice_array_to_slice_mut_205(&w0), + Eurydice_array_to_slice_shared_204(&challenge_times_s2)); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_202(&mask), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA) + ) + { + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_204(&w0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2 - LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA) + ) + { + Eurydice_arr_dc1 + challenge_times_t0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)6U, + &t0_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_dc1); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_205(&challenge_times_t0), + &verifier_challenge); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_204(&challenge_times_t0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2) + ) + { + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + Eurydice_array_to_slice_mut_205(&w0), + Eurydice_array_to_slice_shared_204(&challenge_times_t0)); + Eurydice_arr_5d0 + hint_candidate = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } } + } + }; + size_t + ones_in_hint = + libcrux_ml_dsa_arithmetic_make_hint_37(Eurydice_array_to_slice_shared_204(&w0), + Eurydice_array_to_slice_shared_204(&commitment), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2, + Eurydice_array_to_slice_mut_860(&hint_candidate)); + if (!(ones_in_hint > LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT)) + { + attempt = LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN; + commitment_hash0 = + ( + KRML_CLITERAL(core_option_Option_81){ + .tag = core_option_Some, + .f0 = commitment_hash_candidate + } + ); + signer_response0 = + (KRML_CLITERAL(core_option_Option_1e){ .tag = core_option_Some, .f0 = mask }); + hint0 = + ( + KRML_CLITERAL(core_option_Option_05){ + .tag = core_option_Some, + .f0 = hint_candidate + } + ); + } + } + } + } + } + core_result_Result_53 uu____5; + if (commitment_hash0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_65 commitment_hash = commitment_hash0.f0; + Eurydice_arr_65 commitment_hash1 = commitment_hash; + if (signer_response0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_5d signer_response = signer_response0.f0; + Eurydice_arr_5d signer_response1 = signer_response; + if (!(hint0.tag == core_option_None)) + { + Eurydice_arr_5d0 hint = hint0.f0; + Eurydice_arr_5d0 hint1 = hint; + libcrux_ml_dsa_encoding_signature_serialize_37(Eurydice_array_to_slice_shared_9f0(&commitment_hash1), + Eurydice_array_to_slice_shared_202(&signer_response1), + Eurydice_array_to_slice_shared_860(&hint1), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT, + Eurydice_array_to_slice_mut_6b(signature)); + return (KRML_CLITERAL(core_result_Result_53){ .tag = core_result_Ok }); + } + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + } + return uu____5; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_mut_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_internal_5a(signing_key, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_0c signature = libcrux_ml_dsa_types_zero_c5_5c(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_mut_5a(signing_key, + message, + context, + randomness, + &signature); + core_result_Result_8c uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8c){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8c){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign. +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_5a(Eurydice_array_to_slice_shared_98(signing_key), + message, + context, + randomness); +} + +/** + Sign. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_mut( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_mut_5a(Eurydice_array_to_slice_shared_98(signing_key), + message, + context, + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_pre_hashed_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_mut_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_internal_5a(signing_key, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); + } + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_0c signature = libcrux_ml_dsa_types_zero_c5_5c(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_mut_3f(signing_key, + message, + context, + pre_hash_buffer, + randomness, + &signature); + core_result_Result_8c uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8c){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8c){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign (pre-hashed). +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_pre_hashed_shake128( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_3f(Eurydice_array_to_slice_shared_98(signing_key), + message, + context, + pre_hash_buffer, + randomness); +} + +/** + The internal verification API. + + If no `domain_separation_context` is supplied, it is assumed that + `message` already contains the domain separation. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.verify_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_internal_5a( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + const Eurydice_arr_0c *signature_serialized +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_37(verification_key), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 t1_serialized = uu____0.snd; + Eurydice_arr_dc1 t1; + Eurydice_arr_a3 repeat_expression0[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression0, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_verification_key_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_VERIFICATION_KEY_SIZE, + t1_serialized, + Eurydice_array_to_slice_mut_205(&t1)); + Eurydice_arr_65 deserialized_commitment_hash = { .data = { 0U } }; + Eurydice_arr_5d deserialized_signer_response; + Eurydice_arr_a3 repeat_expression1[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(deserialized_signer_response.data, + repeat_expression1, + (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_5d0 + deserialized_hint = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } } + } + }; + core_result_Result_41 + uu____1 = + libcrux_ml_dsa_encoding_signature_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_SIGNATURE_SIZE, + Eurydice_array_to_slice_shared_6b(signature_serialized), + Eurydice_array_to_slice_mut_9f(&deserialized_commitment_hash), + Eurydice_array_to_slice_mut_204(&deserialized_signer_response), + Eurydice_array_to_slice_mut_860(&deserialized_hint)); + core_result_Result_41 uu____2; + if (uu____1.tag == core_result_Ok) + { + if + ( + libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_202(&deserialized_signer_response), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA) + ) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError + } + ); + } + else + { + Eurydice_arr_5a matrix; + Eurydice_arr_a3 repeat_expression[30U]; + for (size_t i = (size_t)0U; i < (size_t)30U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression, (size_t)30U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_203(&matrix)); + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(Eurydice_array_to_slice_shared_37(verification_key), + &verification_key_hash); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(Eurydice_array_to_slice_shared_17(&verification_key_hash), + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_9f0(&deserialized_commitment_hash), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&deserialized_signer_response.data[i0]); + } + libcrux_ml_dsa_matrix_compute_w_approx_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_205(&matrix), + Eurydice_array_to_slice_shared_202(&deserialized_signer_response), + &verifier_challenge, + Eurydice_array_to_slice_mut_205(&t1)); + Eurydice_arr_65 recomputed_commitment_hash = { .data = { 0U } }; + libcrux_ml_dsa_arithmetic_use_hint_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2, + Eurydice_array_to_slice_shared_860(&deserialized_hint), + Eurydice_array_to_slice_mut_205(&t1)); + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_204(&t1), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_9f(&recomputed_commitment_hash)); + if + ( + Eurydice_array_eq((size_t)48U, + &deserialized_commitment_hash, + &recomputed_commitment_hash, + uint8_t) + ) + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + else + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError + } + ); + } + } + } + else + { + libcrux_ml_dsa_types_VerificationError e = uu____1.f0; + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Err, .f0 = e }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.verify +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_5a( + const Eurydice_arr_29 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature_serialized +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_internal_5a(verification_key_serialized, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_5a(verification_key, + message, + context, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.verify_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_pre_hashed_3f( + const Eurydice_arr_29 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_0c *signature_serialized +) +{ + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_internal_5a(verification_key_serialized, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify (pre-hashed with SHAKE-128). +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify_pre_hashed_shake128( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_pre_hashed_3f(verification_key, + message, + context, + pre_hash_buffer, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.generate_key_pair +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_generate_key_pair_5a( + Eurydice_arr_ec randomness, + Eurydice_mut_borrow_slice_u8 signing_key, + Eurydice_mut_borrow_slice_u8 verification_key +) +{ + Eurydice_arr_89 seed_expanded0 = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_01(&randomness)); + /* original Rust expression is not an lvalue in C */ + Eurydice_array_u8x2 + lvalue = + { + .data = { + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_82(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_78(&seed_expanded0)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_78(&seed_expanded0), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 seed_expanded = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(seed_expanded, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_error_vectors = uu____1.fst; + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.snd; + Eurydice_arr_92 s1_s2; + Eurydice_arr_a3 repeat_expression0[15U]; + for (size_t i = (size_t)0U; i < (size_t)15U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_s2.data, repeat_expression0, (size_t)15U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_sample_s1_and_s2_29(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + seed_for_error_vectors, + Eurydice_array_to_slice_mut_206(&s1_s2)); + Eurydice_arr_8f t0; + Eurydice_arr_a3 repeat_expression1[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0.data, repeat_expression1, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_0f a_as_ntt; + Eurydice_arr_a3 repeat_expression2[56U]; + for (size_t i = (size_t)0U; i < (size_t)56U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_as_ntt.data, repeat_expression2, (size_t)56U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_207(&a_as_ntt)); + Eurydice_arr_bb s1_ntt; + Eurydice_arr_a3 repeat_expression3[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_ntt.data, repeat_expression3, (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_208(&s1_ntt), + Eurydice_array_to_subslice_shared_251(&s1_s2, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A + } + )), + Eurydice_arr_a3); + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&s1_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_as1_plus_s2_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_207(&a_as_ntt), + Eurydice_array_to_slice_shared_206(&s1_ntt), + Eurydice_array_to_slice_shared_207(&s1_s2), + Eurydice_array_to_slice_mut_20(&t0)); + Eurydice_arr_8f t1; + Eurydice_arr_a3 repeat_expression[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_arithmetic_power2round_vector_37(Eurydice_array_to_slice_mut_20(&t0), + Eurydice_array_to_slice_mut_20(&t1)); + libcrux_ml_dsa_encoding_verification_key_generate_serialized_37(seed_for_a, + Eurydice_array_to_slice_shared_200(&t1), + verification_key); + libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE, + seed_for_a, + seed_for_signing, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = verification_key.ptr, + .meta = verification_key.meta + } + ), + Eurydice_array_to_slice_shared_207(&s1_s2), + Eurydice_array_to_slice_shared_200(&t0), + signing_key); +} + +/** + Generate key pair. +*/ +static inline void +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_generate_key_pair( + Eurydice_arr_ec randomness, + Eurydice_arr_e2 *signing_key, + Eurydice_arr_43 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_generate_key_pair_5a(randomness, + Eurydice_array_to_slice_mut_f7(signing_key), + Eurydice_array_to_slice_mut_fc(verification_key)); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_internal_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(signing_key, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 remaining_serialized0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(remaining_serialized0, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.fst; + Eurydice_borrow_slice_u8 remaining_serialized1 = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(remaining_serialized1, + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 verification_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 remaining_serialized2 = uu____2.snd; + Eurydice_borrow_slice_u8_x2 + uu____3 = + Eurydice_slice_split_at(remaining_serialized2, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s1_serialized = uu____3.fst; + Eurydice_borrow_slice_u8 remaining_serialized = uu____3.snd; + Eurydice_borrow_slice_u8_x2 + uu____4 = + Eurydice_slice_split_at(remaining_serialized, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s2_serialized = uu____4.fst; + Eurydice_borrow_slice_u8 t0_serialized = uu____4.snd; + Eurydice_arr_bb s1_as_ntt; + Eurydice_arr_a3 repeat_expression0[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_as_ntt.data, repeat_expression0, (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f s2_as_ntt; + Eurydice_arr_a3 repeat_expression1[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s2_as_ntt.data, repeat_expression1, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f t0_as_ntt; + Eurydice_arr_a3 repeat_expression2[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0_as_ntt.data, repeat_expression2, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE, + s1_serialized, + Eurydice_array_to_slice_mut_208(&s1_as_ntt)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE, + s2_serialized, + Eurydice_array_to_slice_mut_20(&s2_as_ntt)); + libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37(t0_serialized, + Eurydice_array_to_slice_mut_20(&t0_as_ntt)); + Eurydice_arr_0f matrix; + Eurydice_arr_a3 repeat_expression3[56U]; + for (size_t i = (size_t)0U; i < (size_t)56U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression3, (size_t)56U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_207(&matrix)); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(verification_key_hash, + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_c7 mask_seed = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake0 = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, seed_for_signing); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, + Eurydice_array_to_slice_shared_01(&randomness)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake0, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake0, + Eurydice_array_to_slice_mut_17(&mask_seed)); + uint16_t domain_separator_for_mask = 0U; + size_t attempt = (size_t)0U; + core_option_Option_b2 commitment_hash0 = { .tag = core_option_None }; + core_option_Option_2d signer_response0 = { .tag = core_option_None }; + core_option_Option_45 hint0 = { .tag = core_option_None }; + while (attempt < LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN) + { + attempt++; + Eurydice_arr_bb mask; + Eurydice_arr_a3 repeat_expression4[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression4[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(mask.data, repeat_expression4, (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f w0; + Eurydice_arr_a3 repeat_expression5[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression5[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(w0.data, repeat_expression5, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f commitment; + Eurydice_arr_a3 repeat_expression6[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression6[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(commitment.data, repeat_expression6, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_sample_sample_mask_vector_67(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT, + &mask_seed, + &domain_separator_for_mask, + Eurydice_array_to_slice_mut_208(&mask)); + Eurydice_arr_8f a_x_mask; + Eurydice_arr_a3 repeat_expression[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_x_mask.data, repeat_expression, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_bb + mask_ntt = + core_array__core__clone__Clone_for__T__N___clone((size_t)7U, + &mask, + Eurydice_arr_a3, + Eurydice_arr_bb); + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&mask_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_matrix_x_mask_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_208(&matrix), + Eurydice_array_to_slice_shared_206(&mask_ntt), + Eurydice_array_to_slice_mut_20(&a_x_mask)); + libcrux_ml_dsa_arithmetic_decompose_vector_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2, + Eurydice_array_to_slice_shared_200(&a_x_mask), + Eurydice_array_to_slice_mut_20(&w0), + Eurydice_array_to_slice_mut_20(&commitment)); + Eurydice_arr_c7 commitment_hash_candidate = { .data = { 0U } }; + Eurydice_arr_1b commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_200(&commitment), + Eurydice_array_to_slice_mut_68(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_68(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_17(&commitment_hash_candidate)); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_17(&commitment_hash_candidate), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + Eurydice_arr_bb + challenge_times_s1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)7U, + &s1_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_bb); + Eurydice_arr_8f + challenge_times_s2 = + core_array__core__clone__Clone_for__T__N___clone((size_t)8U, + &s2_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_8f); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_208(&challenge_times_s1), + &verifier_challenge); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_20(&challenge_times_s2), + &verifier_challenge); + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_208(&mask), + Eurydice_array_to_slice_shared_206(&challenge_times_s1)); + libcrux_ml_dsa_matrix_subtract_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + Eurydice_array_to_slice_mut_20(&w0), + Eurydice_array_to_slice_shared_200(&challenge_times_s2)); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_206(&mask), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA) + ) + { + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_200(&w0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2 - LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA) + ) + { + Eurydice_arr_8f + challenge_times_t0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)8U, + &t0_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_8f); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_20(&challenge_times_t0), + &verifier_challenge); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_200(&challenge_times_t0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2) + ) + { + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + Eurydice_array_to_slice_mut_20(&w0), + Eurydice_array_to_slice_shared_200(&challenge_times_t0)); + Eurydice_arr_81 + hint_candidate = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } + } + }; + size_t + ones_in_hint = + libcrux_ml_dsa_arithmetic_make_hint_37(Eurydice_array_to_slice_shared_200(&w0), + Eurydice_array_to_slice_shared_200(&commitment), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2, + Eurydice_array_to_slice_mut_861(&hint_candidate)); + if (!(ones_in_hint > LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT)) + { + attempt = LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN; + commitment_hash0 = + ( + KRML_CLITERAL(core_option_Option_b2){ + .tag = core_option_Some, + .f0 = commitment_hash_candidate + } + ); + signer_response0 = + (KRML_CLITERAL(core_option_Option_2d){ .tag = core_option_Some, .f0 = mask }); + hint0 = + ( + KRML_CLITERAL(core_option_Option_45){ + .tag = core_option_Some, + .f0 = hint_candidate + } + ); + } + } + } + } + } + core_result_Result_53 uu____5; + if (commitment_hash0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_c7 commitment_hash = commitment_hash0.f0; + Eurydice_arr_c7 commitment_hash1 = commitment_hash; + if (signer_response0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_bb signer_response = signer_response0.f0; + Eurydice_arr_bb signer_response1 = signer_response; + if (!(hint0.tag == core_option_None)) + { + Eurydice_arr_81 hint = hint0.f0; + Eurydice_arr_81 hint1 = hint; + libcrux_ml_dsa_encoding_signature_serialize_37(Eurydice_array_to_slice_shared_17(&commitment_hash1), + Eurydice_array_to_slice_shared_206(&signer_response1), + Eurydice_array_to_slice_shared_861(&hint1), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT, + Eurydice_array_to_slice_mut_11(signature)); + return (KRML_CLITERAL(core_result_Result_53){ .tag = core_result_Ok }); + } + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + } + return uu____5; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_mut_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_internal_5a(signing_key, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_93 signature = libcrux_ml_dsa_types_zero_c5_f1(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_mut_5a(signing_key, + message, + context, + randomness, + &signature); + core_result_Result_8b uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8b){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8b){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign. +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_5a(Eurydice_array_to_slice_shared_f7(signing_key), + message, + context, + randomness); +} + +/** + Sign. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_mut( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_mut_5a(Eurydice_array_to_slice_shared_f7(signing_key), + message, + context, + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_pre_hashed_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_mut_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_internal_5a(signing_key, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); + } + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_93 signature = libcrux_ml_dsa_types_zero_c5_f1(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_mut_3f(signing_key, + message, + context, + pre_hash_buffer, + randomness, + &signature); + core_result_Result_8b uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8b){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8b){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign (pre-hashed). +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_pre_hashed_shake128( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_3f(Eurydice_array_to_slice_shared_f7(signing_key), + message, + context, + pre_hash_buffer, + randomness); +} + +/** + The internal verification API. + + If no `domain_separation_context` is supplied, it is assumed that + `message` already contains the domain separation. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.verify_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_internal_5a( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + const Eurydice_arr_93 *signature_serialized +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_fc(verification_key), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 t1_serialized = uu____0.snd; + Eurydice_arr_8f t1; + Eurydice_arr_a3 repeat_expression0[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression0, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_verification_key_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_VERIFICATION_KEY_SIZE, + t1_serialized, + Eurydice_array_to_slice_mut_20(&t1)); + Eurydice_arr_c7 deserialized_commitment_hash = { .data = { 0U } }; + Eurydice_arr_bb deserialized_signer_response; + Eurydice_arr_a3 repeat_expression1[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(deserialized_signer_response.data, + repeat_expression1, + (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_81 + deserialized_hint = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } + } + }; + core_result_Result_41 + uu____1 = + libcrux_ml_dsa_encoding_signature_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_SIGNATURE_SIZE, + Eurydice_array_to_slice_shared_11(signature_serialized), + Eurydice_array_to_slice_mut_17(&deserialized_commitment_hash), + Eurydice_array_to_slice_mut_208(&deserialized_signer_response), + Eurydice_array_to_slice_mut_861(&deserialized_hint)); + core_result_Result_41 uu____2; + if (uu____1.tag == core_result_Ok) + { + if + ( + libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_206(&deserialized_signer_response), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA) + ) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError + } + ); + } + else + { + Eurydice_arr_0f matrix; + Eurydice_arr_a3 repeat_expression[56U]; + for (size_t i = (size_t)0U; i < (size_t)56U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression, (size_t)56U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_207(&matrix)); + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(Eurydice_array_to_slice_shared_fc(verification_key), + &verification_key_hash); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(Eurydice_array_to_slice_shared_17(&verification_key_hash), + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_17(&deserialized_commitment_hash), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&deserialized_signer_response.data[i0]); + } + libcrux_ml_dsa_matrix_compute_w_approx_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_208(&matrix), + Eurydice_array_to_slice_shared_206(&deserialized_signer_response), + &verifier_challenge, + Eurydice_array_to_slice_mut_20(&t1)); + Eurydice_arr_c7 recomputed_commitment_hash = { .data = { 0U } }; + libcrux_ml_dsa_arithmetic_use_hint_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2, + Eurydice_array_to_slice_shared_861(&deserialized_hint), + Eurydice_array_to_slice_mut_20(&t1)); + Eurydice_arr_1b commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_200(&t1), + Eurydice_array_to_slice_mut_68(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_68(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_17(&recomputed_commitment_hash)); + if + ( + Eurydice_array_eq((size_t)64U, + &deserialized_commitment_hash, + &recomputed_commitment_hash, + uint8_t) + ) + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + else + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError + } + ); + } + } + } + else + { + libcrux_ml_dsa_types_VerificationError e = uu____1.f0; + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Err, .f0 = e }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.verify +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_5a( + const Eurydice_arr_43 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature_serialized +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_internal_5a(verification_key_serialized, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_5a(verification_key, + message, + context, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.verify_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_pre_hashed_3f( + const Eurydice_arr_43 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_93 *signature_serialized +) +{ + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_internal_5a(verification_key_serialized, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify (pre-hashed with SHAKE-128). +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify_pre_hashed_shake128( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_pre_hashed_3f(verification_key, + message, + context, + pre_hash_buffer, + signature); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa_portable_H_DEFINED +#endif /* libcrux_mldsa_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa44_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa44_portable_H +#define libcrux_mldsa44_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Generate an ML-DSA-44 Key Pair +*/ +static inline libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair +libcrux_ml_dsa_ml_dsa_44_portable_generate_key_pair(Eurydice_arr_ec randomness) +{ + Eurydice_arr_10 signing_key = { .data = { 0U } }; + Eurydice_arr_02 verification_key = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_generate_key_pair(randomness, + &signing_key, + &verification_key); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair){ + .signing_key = libcrux_ml_dsa_types_new_9b_ab(signing_key), + .verification_key = libcrux_ml_dsa_types_new_7f_7d(verification_key) + } + ); +} + +/** + Generate an ML-DSA-44 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_44_portable_sign( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign(libcrux_ml_dsa_types_as_ref_9b_ab(signing_key), + message, + context, + randomness); +} + +/** + Generate an ML-DSA-44 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_44_portable_sign_mut( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_mut(libcrux_ml_dsa_types_as_ref_9b_ab(signing_key), + message, + context, + randomness, + signature); +} + +/** + Generate a HashML-DSA-44 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_44_portable_sign_pre_hashed_shake128( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_10 *uu____0 = libcrux_ml_dsa_types_as_ref_9b_ab(signing_key); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_pre_hashed_shake128(uu____0, + message, + context, + Eurydice_array_to_slice_mut_01(&pre_hash_buffer), + randomness); +} + +/** + Verify an ML-DSA-44 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_44_portable_verify( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify(libcrux_ml_dsa_types_as_ref_7f_7d(verification_key), + message, + context, + libcrux_ml_dsa_types_as_ref_c5_37(signature)); +} + +/** + Verify a HashML-DSA-44 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_44_portable_verify_pre_hashed_shake128( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_02 *uu____0 = libcrux_ml_dsa_types_as_ref_7f_7d(verification_key); + Eurydice_borrow_slice_u8 uu____1 = message; + Eurydice_borrow_slice_u8 uu____2 = context; + Eurydice_mut_borrow_slice_u8 uu____3 = Eurydice_array_to_slice_mut_01(&pre_hash_buffer); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify_pre_hashed_shake128(uu____0, + uu____1, + uu____2, + uu____3, + libcrux_ml_dsa_types_as_ref_c5_37(signature)); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa44_portable_H_DEFINED +#endif /* libcrux_mldsa44_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa65_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa65_portable_H +#define libcrux_mldsa65_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Generate an ML-DSA-65 Key Pair +*/ +static inline libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair +libcrux_ml_dsa_ml_dsa_65_portable_generate_key_pair(Eurydice_arr_ec randomness) +{ + Eurydice_arr_24 signing_key = { .data = { 0U } }; + Eurydice_arr_29 verification_key = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_generate_key_pair(randomness, + &signing_key, + &verification_key); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair){ + .signing_key = libcrux_ml_dsa_types_new_9b_e5(signing_key), + .verification_key = libcrux_ml_dsa_types_new_7f_a2(verification_key) + } + ); +} + +/** + Generate an ML-DSA-65 Key Pair +*/ +static inline void +libcrux_ml_dsa_ml_dsa_65_portable_generate_key_pair_mut( + Eurydice_arr_ec randomness, + Eurydice_arr_24 *signing_key, + Eurydice_arr_29 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_generate_key_pair(randomness, + signing_key, + verification_key); +} + +/** + Generate an ML-DSA-65 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_65_portable_sign( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign(libcrux_ml_dsa_types_as_ref_9b_e5(signing_key), + message, + context, + randomness); +} + +/** + Generate an ML-DSA-65 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_65_portable_sign_mut( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_mut(signing_key, + message, + context, + randomness, + signature); +} + +/** + Generate a HashML-DSA-65 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_65_portable_sign_pre_hashed_shake128( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_24 *uu____0 = libcrux_ml_dsa_types_as_ref_9b_e5(signing_key); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_pre_hashed_shake128(uu____0, + message, + context, + Eurydice_array_to_slice_mut_01(&pre_hash_buffer), + randomness); +} + +/** + Verify an ML-DSA-65 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_65_portable_verify( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify(libcrux_ml_dsa_types_as_ref_7f_a2(verification_key), + message, + context, + libcrux_ml_dsa_types_as_ref_c5_5c(signature)); +} + +/** + Verify a HashML-DSA-65 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_65_portable_verify_pre_hashed_shake128( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_29 *uu____0 = libcrux_ml_dsa_types_as_ref_7f_a2(verification_key); + Eurydice_borrow_slice_u8 uu____1 = message; + Eurydice_borrow_slice_u8 uu____2 = context; + Eurydice_mut_borrow_slice_u8 uu____3 = Eurydice_array_to_slice_mut_01(&pre_hash_buffer); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify_pre_hashed_shake128(uu____0, + uu____1, + uu____2, + uu____3, + libcrux_ml_dsa_types_as_ref_c5_5c(signature)); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa65_portable_H_DEFINED +#endif /* libcrux_mldsa65_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa87_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa87_portable_H +#define libcrux_mldsa87_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Generate an ML-DSA-87 Key Pair +*/ +static inline libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair +libcrux_ml_dsa_ml_dsa_87_portable_generate_key_pair(Eurydice_arr_ec randomness) +{ + Eurydice_arr_e2 signing_key = { .data = { 0U } }; + Eurydice_arr_43 verification_key = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_generate_key_pair(randomness, + &signing_key, + &verification_key); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair){ + .signing_key = libcrux_ml_dsa_types_new_9b_72(signing_key), + .verification_key = libcrux_ml_dsa_types_new_7f_c6(verification_key) + } + ); +} + +/** + Generate an ML-DSA-87 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_87_portable_sign( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign(libcrux_ml_dsa_types_as_ref_9b_72(signing_key), + message, + context, + randomness); +} + +/** + Generate an ML-DSA-87 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_87_portable_sign_mut( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_mut(libcrux_ml_dsa_types_as_ref_9b_72(signing_key), + message, + context, + randomness, + signature); +} + +/** + Generate a HashML-DSA-87 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_87_portable_sign_pre_hashed_shake128( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_e2 *uu____0 = libcrux_ml_dsa_types_as_ref_9b_72(signing_key); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_pre_hashed_shake128(uu____0, + message, + context, + Eurydice_array_to_slice_mut_01(&pre_hash_buffer), + randomness); +} + +/** + Verify an ML-DSA-87 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_87_portable_verify( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify(libcrux_ml_dsa_types_as_ref_7f_c6(verification_key), + message, + context, + libcrux_ml_dsa_types_as_ref_c5_f1(signature)); +} + +/** + Verify a HashML-DSA-87 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_87_portable_verify_pre_hashed_shake128( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_43 *uu____0 = libcrux_ml_dsa_types_as_ref_7f_c6(verification_key); + Eurydice_borrow_slice_u8 uu____1 = message; + Eurydice_borrow_slice_u8 uu____2 = context; + Eurydice_mut_borrow_slice_u8 uu____3 = Eurydice_array_to_slice_mut_01(&pre_hash_buffer); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify_pre_hashed_shake128(uu____0, + uu____1, + uu____2, + uu____3, + libcrux_ml_dsa_types_as_ref_c5_f1(signature)); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa87_portable_H_DEFINED +#endif /* libcrux_mldsa87_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mlkem768_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mlkem768_portable_H +#define libcrux_mlkem768_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +static inline Eurydice_arr_c7 +libcrux_ml_kem_hash_functions_portable_G(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_c7 digest = { .data = { 0U } }; + libcrux_sha3_portable_sha512(Eurydice_array_to_slice_mut_17(&digest), input); + return digest; +} + +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_H(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_ec digest = { .data = { 0U } }; + libcrux_sha3_portable_sha256(Eurydice_array_to_slice_mut_01(&digest), input); + return digest; +} + +#define LIBCRUX_ML_KEM_POLYNOMIAL_ZETAS_TIMES_MONTGOMERY_R ((KRML_CLITERAL(Eurydice_arr_34){ .data = { -1044, -758, -359, -1517, 1493, 1422, 287, 202, -171, 622, 1577, 182, 962, -1202, -1474, 1468, 573, -1325, 264, 383, -829, 1458, -1602, -130, -681, 1017, 732, 608, -1542, 411, -205, -1571, 1223, 652, -552, 1015, -1293, 1491, -282, -1544, 516, -8, -320, -666, -1618, -1162, 126, 1469, -853, -90, -271, 830, 107, -1421, -247, -951, -398, 961, -1508, -725, 448, -1065, 677, -1275, -1103, 430, 555, 843, -1251, 871, 1550, 105, 422, 587, 177, -235, -291, -460, 1574, 1653, -246, 778, 1159, -147, -777, 1483, -602, 1119, -1590, 644, -872, 349, 418, 329, -156, -75, 817, 1097, 603, 610, 1322, -1285, -1465, 384, -1215, -136, 1218, -1335, -874, 220, -1187, -1659, -1185, -1530, -1278, 794, -1510, -854, -870, 478, -108, -308, 996, 991, 958, -1460, 1522, 1628 } })) + +static KRML_MUSTINLINE int16_t libcrux_ml_kem_polynomial_zeta(size_t i) +{ + return LIBCRUX_ML_KEM_POLYNOMIAL_ZETAS_TIMES_MONTGOMERY_R.data[i]; +} + +#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT ((size_t)16U) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS (1353) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS (3329) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R (62209U) + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_vector_type_from_i16_array(Eurydice_borrow_slice_i16 array) +{ + Eurydice_arr_d6 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_a6(array, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)16U })).ptr, + (size_t)16U * sizeof (int16_t)); + return + core_result_unwrap_26_d3(( + KRML_CLITERAL(core_result_Result_ec){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_borrow_slice_i16 array) +{ + return + libcrux_ml_kem_vector_portable_vector_type_from_i16_array(libcrux_secrets_int_classify_public_classify_ref_6d_39(array)); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 libcrux_ml_kem_vector_portable_vector_type_zero(void) +{ + return + libcrux_secrets_int_public_integers_classify_27_4b(( + KRML_CLITERAL(Eurydice_arr_d6){ .data = { 0U } } + )); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_ZERO_b8(void) +{ + return libcrux_ml_kem_vector_portable_vector_type_zero(); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_add(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs.data[uu____0] += rhs->data[i0]; + } + return lhs; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_add_b8(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_sub(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs.data[uu____0] -= rhs->data[i0]; + } + return lhs; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_sub_b8(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(Eurydice_arr_d6 vec, int16_t c) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + vec.data[uu____0] *= c; + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_multiply_by_constant_b8(Eurydice_arr_d6 vec, int16_t c) +{ + return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(vec, c); +} + +/** + Note: This function is not secret independent + Only use with public values. +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(Eurydice_arr_d6 vec) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + if (libcrux_secrets_int_public_integers_declassify_d8_39(vec.data[i0]) >= 3329) + { + size_t uu____0 = i0; + vec.data[uu____0] -= 3329; + } + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(Eurydice_arr_d6 v) +{ + return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v); +} + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER (20159) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT (26) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R ((int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT)) + +/** + Signed Barrett Reduction + + Given an input `value`, `barrett_reduce` outputs a representative `result` + such that: + + - result ≡ value (mod FIELD_MODULUS) + - the absolute value of `result` is bound as follows: + + `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1) + + Note: The input bound is 28296 to prevent overflow in the multiplication of quotient by FIELD_MODULUS + +*/ +static inline int16_t +libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(int16_t value) +{ + int32_t + t = + libcrux_secrets_int_as_i32_f5(value) * + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER + + (LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R >> 1U); + int16_t + quotient = + libcrux_secrets_int_as_i16_36(t >> (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT); + return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(Eurydice_arr_d6 vec) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int16_t vi = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(vec.data[i0]); + vec.data[i0] = vi; + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_barrett_reduce_b8(Eurydice_arr_d6 vector) +{ + return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(vector); +} + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U) + +/** + Signed Montgomery Reduction + + Given an input `value`, `montgomery_reduce` outputs a representative `o` + such that: + + - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS) + - the absolute value of `o` is bound as follows: + + `|result| ≤ ceil(|value| / MONTGOMERY_R) + 1665 + + In particular, if `|value| ≤ FIELD_MODULUS-1 * FIELD_MODULUS-1`, then `|o| <= FIELD_MODULUS-1`. + And, if `|value| ≤ pow2 16 * FIELD_MODULUS-1`, then `|o| <= FIELD_MODULUS + 1664 + +*/ +static inline int16_t +libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(int32_t value) +{ + int32_t + k = + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(value)) * + libcrux_secrets_int_as_i32_b8(libcrux_secrets_int_public_integers_classify_27_df(LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R)); + int32_t + k_times_modulus = + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(k)) * + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_public_integers_classify_27_39(LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); + int16_t + c = + libcrux_secrets_int_as_i16_36(k_times_modulus >> + (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + int16_t + value_high = + libcrux_secrets_int_as_i16_36(value >> + (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + return value_high - c; +} + +/** + If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to + `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to + `x · y`, as follows: + + `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)` + + `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a representative + `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod FIELD_MODULUS)`. +*/ +static KRML_MUSTINLINE int16_t +libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( + int16_t fe, + int16_t fer +) +{ + int32_t product = libcrux_secrets_int_as_i32_f5(fe) * libcrux_secrets_int_as_i32_f5(fer); + return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(product); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( + Eurydice_arr_d6 vec, + int16_t c +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + vec.data[i0] = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(vec.data[i0], + c); + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( + Eurydice_arr_d6 vector, + int16_t constant +) +{ + return + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(vector, + libcrux_secrets_int_public_integers_classify_27_39(constant)); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( + Eurydice_arr_d6 vec, + int16_t c +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + vec.data[uu____0] &= c; + } + return vec; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right +with const generics +- SHIFT_BY= 15 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(Eurydice_arr_d6 vec) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + vec.data[i0] >>= (uint32_t)15; + } + return vec; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(Eurydice_arr_d6 a) +{ + Eurydice_arr_d6 t = libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(a); + Eurydice_arr_d6 + fm = + libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(t, + LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS); + return libcrux_ml_kem_vector_portable_arithmetic_add(a, &fm); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(a); +} + +/** + The `compress_*` functions implement the `Compress` function specified in the NIST FIPS + 203 standard (Page 18, Expression 4.5), which is defined as: + + ```plaintext + Compress_d: ℤq -> ℤ_{2ᵈ} + Compress_d(x) = ⌈(2ᵈ/q)·x⌋ + ``` + + Since `⌈x⌋ = ⌊x + 1/2⌋` we have: + + ```plaintext + Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋ + = ⌊(2^{d+1}·x + q) / 2q⌋ + ``` + + For further information about the function implementations, consult the + `implementation_notes.pdf` document in this directory. + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +static inline uint8_t +libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(uint16_t fe) +{ + int16_t + shifted = + libcrux_secrets_int_public_integers_classify_27_39(1664) - libcrux_secrets_int_as_i16_ca(fe); + int16_t mask = shifted >> 15U; + int16_t shifted_to_positive = mask ^ shifted; + int16_t shifted_positive_in_range = shifted_to_positive - 832; + int16_t r0 = shifted_positive_in_range >> 15U; + int16_t r1 = r0 & 1; + return libcrux_secrets_int_as_u8_f5(r1); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_compress_1(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + a.data[i0] = + libcrux_secrets_int_as_i16_59(libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(libcrux_secrets_int_as_u16_f5(a.data[i0]))); + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_compress_1_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_compress_1(a); +} + +static KRML_MUSTINLINE uint32_t +libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( + uint8_t n, + uint32_t value +) +{ + return value & ((1U << (uint32_t)n) - 1U); +} + +static inline int16_t +libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + uint8_t coefficient_bits, + uint16_t fe +) +{ + uint64_t compressed = libcrux_secrets_int_as_u64_ca(fe) << (uint32_t)coefficient_bits; + compressed += 1664ULL; + compressed *= 10321340ULL; + compressed >>= 35U; + return + libcrux_secrets_int_as_i16_b8(libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(coefficient_bits, + libcrux_secrets_int_as_u32_a3(compressed))); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_decompress_1(Eurydice_arr_d6 a) +{ + Eurydice_arr_d6 z = libcrux_ml_kem_vector_portable_vector_type_zero(); + Eurydice_arr_d6 s = libcrux_ml_kem_vector_portable_arithmetic_sub(z, &a); + Eurydice_arr_d6 + res = libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(s, 1665); + return res; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_decompress_1_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_decompress_1(a); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_ntt_step( + Eurydice_arr_d6 *vec, + int16_t zeta, + size_t i, + size_t j +) +{ + int16_t + t = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(vec->data[j], + libcrux_secrets_int_public_integers_classify_27_39(zeta)); + int16_t a_minus_t = vec->data[i] - t; + int16_t a_plus_t = vec->data[i] + t; + vec->data[j] = a_minus_t; + vec->data[i] = a_plus_t; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, (size_t)2U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, (size_t)3U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)4U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)5U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)8U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)9U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)12U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)13U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1 +) +{ + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, (size_t)4U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, (size_t)5U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)2U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)3U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)8U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)9U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)10U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)11U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1 +) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(Eurydice_arr_d6 vec, int16_t zeta) +{ + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)0U, (size_t)8U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)1U, (size_t)9U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)2U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)3U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)4U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)5U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)6U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)7U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(Eurydice_arr_d6 a, int16_t zeta) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_inv_ntt_step( + Eurydice_arr_d6 *vec, + int16_t zeta, + size_t i, + size_t j +) +{ + int16_t a_minus_b = vec->data[j] - vec->data[i]; + int16_t a_plus_b = vec->data[j] + vec->data[i]; + int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(a_plus_b); + int16_t + o1 = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(a_minus_b, + libcrux_secrets_int_public_integers_classify_27_39(zeta)); + vec->data[i] = o0; + vec->data[j] = o1; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, (size_t)2U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, (size_t)3U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)4U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)5U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)8U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)9U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)12U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)13U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(a, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1 +) +{ + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, (size_t)4U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, (size_t)5U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)2U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)3U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)8U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)9U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)10U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)11U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1 +) +{ + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0, zeta1); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(Eurydice_arr_d6 vec, int16_t zeta) +{ + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)0U, (size_t)8U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)1U, (size_t)9U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)2U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)3U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)4U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)5U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)6U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)7U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(Eurydice_arr_d6 a, int16_t zeta) +{ + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta); +} + +/** + Compute the product of two Kyber binomials with respect to the + modulus `X² - zeta`. + + This function almost implements <strong>Algorithm 11</strong> of the + NIST FIPS 203 standard, which is reproduced below: + + ```plaintext + Input: a₀, a₁, b₀, b₁ ∈ ℤq. + Input: γ ∈ ℤq. + Output: c₀, c₁ ∈ ℤq. + + c₀ ← a₀·b₀ + a₁·b₁·γ + c₁ ← a₀·b₁ + a₁·b₀ + return c₀, c₁ + ``` + We say "almost" because the coefficients output by this function are in + the Montgomery domain (unlike in the specification). + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + const Eurydice_arr_d6 *a, + const Eurydice_arr_d6 *b, + int16_t zeta, + size_t i, + Eurydice_arr_d6 *out +) +{ + int16_t ai = a->data[(size_t)2U * i]; + int16_t bi = b->data[(size_t)2U * i]; + int16_t aj = a->data[(size_t)2U * i + (size_t)1U]; + int16_t bj = b->data[(size_t)2U * i + (size_t)1U]; + int32_t ai_bi = libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bi); + int32_t aj_bj_ = libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bj); + int16_t aj_bj = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(aj_bj_); + int32_t + aj_bj_zeta = libcrux_secrets_int_as_i32_f5(aj_bj) * libcrux_secrets_int_as_i32_f5(zeta); + int32_t ai_bi_aj_bj = ai_bi + aj_bj_zeta; + int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(ai_bi_aj_bj); + int32_t ai_bj = libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bj); + int32_t aj_bi = libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bi); + int32_t ai_bj_aj_bi = ai_bj + aj_bi; + int16_t o1 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(ai_bj_aj_bi); + out->data[(size_t)2U * i] = o0; + out->data[(size_t)2U * i + (size_t)1U] = o1; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_multiply( + const Eurydice_arr_d6 *lhs, + const Eurydice_arr_d6 *rhs, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + int16_t nzeta0 = -zeta0; + int16_t nzeta1 = -zeta1; + int16_t nzeta2 = -zeta2; + int16_t nzeta3 = -zeta3; + Eurydice_arr_d6 out = libcrux_ml_kem_vector_portable_vector_type_zero(); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta0), + (size_t)0U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta0), + (size_t)1U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta1), + (size_t)2U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta1), + (size_t)3U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta2), + (size_t)4U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta2), + (size_t)5U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta3), + (size_t)6U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta3), + (size_t)7U, + &out); + return out; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_multiply_b8( + const Eurydice_arr_d6 *lhs, + const Eurydice_arr_d6 *rhs, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE Eurydice_array_u8x2 +libcrux_ml_kem_vector_portable_serialize_serialize_1(Eurydice_arr_d6 v) +{ + uint8_t + result0 = + (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.data[0U]) | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[1U]) << 1U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[2U]) << 2U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[3U]) << 3U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[4U]) << 4U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[5U]) << 5U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[6U]) << 6U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[7U]) << 7U; + uint8_t + result1 = + (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.data[8U]) | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[9U]) << 1U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[10U]) << 2U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[11U]) << 3U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[12U]) << 4U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[13U]) << 5U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[14U]) << 6U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[15U]) << 7U; + return (KRML_CLITERAL(Eurydice_array_u8x2){ .data = { result0, result1 } }); +} + +static inline Eurydice_array_u8x2 libcrux_ml_kem_vector_portable_serialize_1(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_75(libcrux_ml_kem_vector_portable_serialize_serialize_1(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_array_u8x2 +libcrux_ml_kem_vector_portable_serialize_1_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_1(a); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_borrow_slice_u8 v) +{ + int16_t result0 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] & 1U); + int16_t result1 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 1U & 1U); + int16_t result2 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 2U & 1U); + int16_t result3 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 3U & 1U); + int16_t result4 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 4U & 1U); + int16_t result5 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 5U & 1U); + int16_t result6 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 6U & 1U); + int16_t result7 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 7U & 1U); + int16_t result8 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] & 1U); + int16_t result9 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 1U & 1U); + int16_t result10 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 2U & 1U); + int16_t result11 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 3U & 1U); + int16_t result12 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 4U & 1U); + int16_t result13 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 5U & 1U); + int16_t result14 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 6U & 1U); + int16_t result15 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 7U & 1U); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, + result10, result11, result12, result13, result14, result15 + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_1(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_1(a); +} + +static KRML_MUSTINLINE uint8_t_x4 +libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_borrow_slice_i16 v) +{ + uint8_t + result0 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[1U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[0U]); + uint8_t + result1 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[3U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[2U]); + uint8_t + result2 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[5U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[4U]); + uint8_t + result3 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[7U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[6U]); + return + (KRML_CLITERAL(uint8_t_x4){ .fst = result0, .snd = result1, .thd = result2, .f3 = result3 }); +} + +static KRML_MUSTINLINE Eurydice_array_u8x8 +libcrux_ml_kem_vector_portable_serialize_serialize_4(Eurydice_arr_d6 v) +{ + uint8_t_x4 + result0_3 = + libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)8U }))); + uint8_t_x4 + result4_7 = + libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)8U, .end = (size_t)16U }))); + return + ( + KRML_CLITERAL(Eurydice_array_u8x8){ + .data = { + result0_3.fst, result0_3.snd, result0_3.thd, result0_3.f3, result4_7.fst, result4_7.snd, + result4_7.thd, result4_7.f3 + } + } + ); +} + +static inline Eurydice_array_u8x8 libcrux_ml_kem_vector_portable_serialize_4(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_52(libcrux_ml_kem_vector_portable_serialize_serialize_4(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_array_u8x8 +libcrux_ml_kem_vector_portable_serialize_4_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_4(a); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_borrow_slice_u8 bytes) +{ + int16_t v0 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[0U] & 15U); + int16_t v1 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[0U] >> 4U & 15U); + int16_t v2 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[1U] & 15U); + int16_t v3 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[1U] >> 4U & 15U); + int16_t v4 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[2U] & 15U); + int16_t v5 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[2U] >> 4U & 15U); + int16_t v6 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[3U] & 15U); + int16_t v7 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[3U] >> 4U & 15U); + return + ( + KRML_CLITERAL(int16_t_x8){ + .fst = v0, + .snd = v1, + .thd = v2, + .f3 = v3, + .f4 = v4, + .f5 = v5, + .f6 = v6, + .f7 = v7 + } + ); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_borrow_slice_u8 bytes) +{ + int16_t_x8 + v0_7 = + libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)4U }))); + int16_t_x8 + v8_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)4U, .end = (size_t)8U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, v0_7.f6, v0_7.f7, v8_15.fst, + v8_15.snd, v8_15.thd, v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7 + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_4(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_4(a); +} + +static KRML_MUSTINLINE uint8_t_x5 +libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_borrow_slice_i16 v) +{ + uint8_t r0 = libcrux_secrets_int_as_u8_f5(v.ptr[0U] & 255); + uint8_t + r1 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[1U] & 63) << 2U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[0U] >> 8U & 3); + uint8_t + r2 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[2U] & 15) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[1U] >> 6U & 15); + uint8_t + r3 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[3U] & 3) << 6U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[2U] >> 4U & 63); + uint8_t r4 = libcrux_secrets_int_as_u8_f5(v.ptr[3U] >> 2U & 255); + return (KRML_CLITERAL(uint8_t_x5){ .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4 }); +} + +static KRML_MUSTINLINE Eurydice_arr_fc +libcrux_ml_kem_vector_portable_serialize_serialize_10(Eurydice_arr_d6 v) +{ + uint8_t_x5 + r0_4 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)4U }))); + uint8_t_x5 + r5_9 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)4U, .end = (size_t)8U }))); + uint8_t_x5 + r10_14 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)8U, .end = (size_t)12U }))); + uint8_t_x5 + r15_19 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)12U, .end = (size_t)16U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_fc){ + .data = { + r0_4.fst, r0_4.snd, r0_4.thd, r0_4.f3, r0_4.f4, r5_9.fst, r5_9.snd, r5_9.thd, r5_9.f3, + r5_9.f4, r10_14.fst, r10_14.snd, r10_14.thd, r10_14.f3, r10_14.f4, r15_19.fst, r15_19.snd, + r15_19.thd, r15_19.f3, r15_19.f4 + } + } + ); +} + +static inline Eurydice_arr_fc libcrux_ml_kem_vector_portable_serialize_10(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_2b(libcrux_ml_kem_vector_portable_serialize_serialize_10(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_fc libcrux_ml_kem_vector_portable_serialize_10_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_10(a); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_borrow_slice_u8 bytes) +{ + int16_t + r0 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[1U]) + & 3) + << 8U) + | (libcrux_secrets_int_as_i16_59(bytes.ptr[0U]) & 255)); + int16_t + r1 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[2U]) + & 15) + << 6U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[1U]) >> 2U); + int16_t + r2 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[3U]) + & 63) + << 4U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[2U]) >> 4U); + int16_t + r3 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)libcrux_secrets_int_as_i16_59(bytes.ptr[4U]) + << 2U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[3U]) >> 6U); + int16_t + r4 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[6U]) + & 3) + << 8U) + | (libcrux_secrets_int_as_i16_59(bytes.ptr[5U]) & 255)); + int16_t + r5 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[7U]) + & 15) + << 6U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[6U]) >> 2U); + int16_t + r6 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[8U]) + & 63) + << 4U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[7U]) >> 4U); + int16_t + r7 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)libcrux_secrets_int_as_i16_59(bytes.ptr[9U]) + << 2U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[8U]) >> 6U); + return + ( + KRML_CLITERAL(int16_t_x8){ + .fst = r0, + .snd = r1, + .thd = r2, + .f3 = r3, + .f4 = r4, + .f5 = r5, + .f6 = r6, + .f7 = r7 + } + ); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_borrow_slice_u8 bytes) +{ + int16_t_x8 + v0_7 = + libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)10U }))); + int16_t_x8 + v8_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)10U, .end = (size_t)20U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, v0_7.f6, v0_7.f7, v8_15.fst, + v8_15.snd, v8_15.thd, v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7 + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_10(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_10(a); +} + +static KRML_MUSTINLINE uint8_t_x3 +libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_borrow_slice_i16 v) +{ + uint8_t r0 = libcrux_secrets_int_as_u8_f5(v.ptr[0U] & 255); + uint8_t + r1 = + libcrux_secrets_int_as_u8_f5(v.ptr[0U] >> 8U | (int16_t)((uint32_t)(v.ptr[1U] & 15) << 4U)); + uint8_t r2 = libcrux_secrets_int_as_u8_f5(v.ptr[1U] >> 4U & 255); + return (KRML_CLITERAL(uint8_t_x3){ .fst = r0, .snd = r1, .thd = r2 }); +} + +static KRML_MUSTINLINE Eurydice_arr_94 +libcrux_ml_kem_vector_portable_serialize_serialize_12(Eurydice_arr_d6 v) +{ + uint8_t_x3 + r0_2 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)2U }))); + uint8_t_x3 + r3_5 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)2U, .end = (size_t)4U }))); + uint8_t_x3 + r6_8 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)4U, .end = (size_t)6U }))); + uint8_t_x3 + r9_11 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)6U, .end = (size_t)8U }))); + uint8_t_x3 + r12_14 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)8U, .end = (size_t)10U }))); + uint8_t_x3 + r15_17 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)10U, .end = (size_t)12U }))); + uint8_t_x3 + r18_20 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)12U, .end = (size_t)14U }))); + uint8_t_x3 + r21_23 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)14U, .end = (size_t)16U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_94){ + .data = { + r0_2.fst, r0_2.snd, r0_2.thd, r3_5.fst, r3_5.snd, r3_5.thd, r6_8.fst, r6_8.snd, r6_8.thd, + r9_11.fst, r9_11.snd, r9_11.thd, r12_14.fst, r12_14.snd, r12_14.thd, r15_17.fst, + r15_17.snd, r15_17.thd, r18_20.fst, r18_20.snd, r18_20.thd, r21_23.fst, r21_23.snd, + r21_23.thd + } + } + ); +} + +static inline Eurydice_arr_94 libcrux_ml_kem_vector_portable_serialize_12(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_40(libcrux_ml_kem_vector_portable_serialize_serialize_12(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_94 libcrux_ml_kem_vector_portable_serialize_12_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_12(a); +} + +static KRML_MUSTINLINE int16_t_x2 +libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_borrow_slice_u8 bytes) +{ + int16_t byte0 = libcrux_secrets_int_as_i16_59(bytes.ptr[0U]); + int16_t byte1 = libcrux_secrets_int_as_i16_59(bytes.ptr[1U]); + int16_t byte2 = libcrux_secrets_int_as_i16_59(bytes.ptr[2U]); + int16_t r0 = (int16_t)((uint32_t)(byte1 & 15) << 8U) | (byte0 & 255); + int16_t r1 = (int16_t)((uint32_t)byte2 << 4U) | (byte1 >> 4U & 15); + return (KRML_CLITERAL(int16_t_x2){ .fst = r0, .snd = r1 }); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_borrow_slice_u8 bytes) +{ + int16_t_x2 + v0_1 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)3U }))); + int16_t_x2 + v2_3 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)3U, .end = (size_t)6U }))); + int16_t_x2 + v4_5 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)6U, .end = (size_t)9U }))); + int16_t_x2 + v6_7 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)9U, .end = (size_t)12U }))); + int16_t_x2 + v8_9 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)12U, .end = (size_t)15U }))); + int16_t_x2 + v10_11 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)15U, .end = (size_t)18U }))); + int16_t_x2 + v12_13 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)18U, .end = (size_t)21U }))); + int16_t_x2 + v14_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)21U, .end = (size_t)24U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + v0_1.fst, v0_1.snd, v2_3.fst, v2_3.snd, v4_5.fst, v4_5.snd, v6_7.fst, v6_7.snd, v8_9.fst, + v8_9.snd, v10_11.fst, v10_11.snd, v12_13.fst, v12_13.snd, v14_15.fst, v14_15.snd + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_12(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_12(a); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_kem_vector_portable_sampling_rej_sample( + Eurydice_borrow_slice_u8 a, + Eurydice_mut_borrow_slice_i16 result +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < a.meta / (size_t)3U; i++) + { + size_t i0 = i; + int16_t b1 = (int16_t)(uint32_t)a.ptr[i0 * (size_t)3U + (size_t)0U]; + int16_t b2 = (int16_t)(uint32_t)a.ptr[i0 * (size_t)3U + (size_t)1U]; + int16_t b3 = (int16_t)(uint32_t)a.ptr[i0 * (size_t)3U + (size_t)2U]; + int16_t d1 = (int16_t)((uint32_t)(b2 & 15) << 8U) | b1; + int16_t d2 = (int16_t)((uint32_t)b3 << 4U) | b2 >> 4U; + if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) + { + if (sampled < (size_t)16U) + { + result.ptr[sampled] = d1; + sampled++; + } + } + if (d2 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) + { + if (sampled < (size_t)16U) + { + result.ptr[sampled] = d2; + sampled++; + } + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline size_t +libcrux_ml_kem_vector_portable_rej_sample_b8( + Eurydice_borrow_slice_u8 a, + Eurydice_mut_borrow_slice_i16 out +) +{ + return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out); +} + +#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR ((size_t)10U) + +#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_RANK ((size_t)3U) + +#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE * LIBCRUX_ML_KEM_MLKEM768_RANK) + +#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR ((size_t)4U) + +#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE) + +#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE (LIBCRUX_ML_KEM_MLKEM768_RANK * LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE + (size_t)32U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE (LIBCRUX_ML_KEM_MLKEM768_RANK * LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U) + +#define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE) + +typedef Eurydice_arr_7d libcrux_ml_kem_mlkem768_MlKem768PrivateKey; + +typedef Eurydice_arr_5f libcrux_ml_kem_mlkem768_MlKem768PublicKey; + +#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT (LIBCRUX_ML_KEM_MLKEM768_RANK * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE + LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_9e_s { Eurydice_arr_d6 data[16U]; } Eurydice_arr_9e; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_kem_polynomial_PolynomialRingElement_1d +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_bb0_s { Eurydice_arr_9e data[3U]; } Eurydice_arr_bb0; + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline Eurydice_arr_9e libcrux_ml_kem_polynomial_ZERO_d6_ea(void) +{ + Eurydice_arr_9e lit; + Eurydice_arr_d6 repeat_expression[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); + } + memcpy(lit.data, repeat_expression, (size_t)16U * sizeof (Eurydice_arr_d6)); + return lit; +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::ind_cpa::decrypt::closure<Vector, K, CIPHERTEXT_SIZE, VECTOR_U_ENCODED_SIZE, U_COMPRESSION_FACTOR, V_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt.call_mut_0b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_01(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea( + Eurydice_borrow_slice_u8 serialized +) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)24U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)24U, + .end = i0 * (size_t)24U + (size_t)24U + } + )); + Eurydice_arr_d6 uu____0 = libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); + re.data[i0] = uu____0; + } + return re; +} + +/** + Call [`deserialize_to_uncompressed_ring_element`] for each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_vector +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_deserialize_vector_68( + Eurydice_borrow_slice_u8 secret_key, + Eurydice_arr_bb0 *secret_as_ntt +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + uu____0 = + libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(Eurydice_slice_subslice_shared_c8(secret_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + } + ))); + secret_as_ntt->data[i0] = uu____0; + } +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::ind_cpa::deserialize_then_decompress_u::closure<Vector, K, CIPHERTEXT_SIZE, U_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.call_mut_35 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- U_COMPRESSION_FACTOR= 10 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_30( + void **_, + size_t tupled_args +) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient +with const generics +- COEFFICIENT_BITS= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int32_t + decompressed = + libcrux_secrets_int_as_i32_f5(a.data[i0]) * + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_public_integers_classify_27_39(LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); + decompressed = (int32_t)((uint32_t)decompressed << 1U) + (int32_t)((uint32_t)1 << (uint32_t)10); + decompressed >>= (uint32_t)(10 + 1); + a.data[i0] = libcrux_secrets_int_as_i16_36(decompressed); + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 +with const generics +- COEFFICIENT_BITS= 10 +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_10 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(Eurydice_borrow_slice_u8 serialized) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)20U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)20U, + .end = i0 * (size_t)20U + (size_t)20U + } + )); + Eurydice_arr_d6 coefficient = libcrux_ml_kem_vector_portable_deserialize_10_b8(bytes); + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(coefficient); + re.data[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_f7( + Eurydice_borrow_slice_u8 serialized +) +{ + return libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(serialized); +} + +typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s +{ + Eurydice_arr_d6 fst; + Eurydice_arr_d6 snd; +} +libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2; + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 +libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea( + Eurydice_arr_d6 a, + Eurydice_arr_d6 b, + int16_t zeta_r +) +{ + Eurydice_arr_d6 + t = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b, zeta_r); + b = libcrux_ml_kem_vector_portable_sub_b8(a, &t); + a = libcrux_ml_kem_vector_portable_add_b8(a, &t); + return + ( + KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){ + .fst = a, + .snd = b + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t layer, + size_t _initial_coefficient_bound +) +{ + size_t step = (size_t)1U << (uint32_t)layer; + for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) + { + size_t round = i0; + zeta_i[0U]++; + size_t offset = round * step * (size_t)2U; + size_t offset_vec = offset / (size_t)16U; + size_t step_vec = step / (size_t)16U; + for (size_t i = offset_vec; i < offset_vec + step_vec; i++) + { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 + uu____0 = + libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(re->data[j], + re->data[j + step_vec], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + Eurydice_arr_d6 x = uu____0.fst; + Eurydice_arr_d6 y = uu____0.snd; + re->data[j] = x; + re->data[j + step_vec] = y; + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_3_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t _initial_coefficient_bound +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]++; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + re->data[round] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_2_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t _initial_coefficient_bound +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]++; + re->data[round] = + libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U)); + zeta_i[0U]++; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_1_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t _initial_coefficient_bound +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]++; + re->data[round] = + libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)2U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)3U)); + zeta_i[0U] += (size_t)3U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(Eurydice_arr_9e *myself) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 uu____0 = libcrux_ml_kem_vector_portable_barrett_reduce_b8(myself->data[i0]); + myself->data[i0] = uu____0; + } +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(Eurydice_arr_9e *self) +{ + libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(self); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- VECTOR_U_COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_f7(Eurydice_arr_9e *re) +{ + size_t zeta_i = (size_t)0U; + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U, (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, (size_t)2U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U, (size_t)3U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U, (size_t)4U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)5U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)6U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)7U * (size_t)3328U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); +} + +/** + Call [`deserialize_then_decompress_ring_element_u`] on each ring element + in the `ciphertext`. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- U_COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_30(const Eurydice_arr_2b *ciphertext) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_30(&lvalue, + i); + } + Eurydice_arr_bb0 u_as_ntt = arr_struct; + for + (size_t + i = (size_t)0U; + i < + (size_t)1088U / + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U); + i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + u_bytes = + Eurydice_array_to_subslice_shared_d44(ciphertext, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U), + .end = i0 * + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U) + + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U + } + )); + u_as_ntt.data[i0] = + libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_f7(u_bytes); + libcrux_ml_kem_ntt_ntt_vector_u_f7(&u_as_ntt.data[i0]); + } + return u_as_ntt; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient +with const generics +- COEFFICIENT_BITS= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int32_t + decompressed = + libcrux_secrets_int_as_i32_f5(a.data[i0]) * + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_public_integers_classify_27_39(LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); + decompressed = (int32_t)((uint32_t)decompressed << 1U) + (int32_t)((uint32_t)1 << (uint32_t)4); + decompressed >>= (uint32_t)(4 + 1); + a.data[i0] = libcrux_secrets_int_as_i16_36(decompressed); + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 +with const generics +- COEFFICIENT_BITS= 4 +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(Eurydice_borrow_slice_u8 serialized) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)8U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)8U, + .end = i0 * (size_t)8U + (size_t)8U + } + )); + Eurydice_arr_d6 coefficient = libcrux_ml_kem_vector_portable_deserialize_4_b8(bytes); + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(coefficient); + re.data[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_b6( + Eurydice_borrow_slice_u8 serialized +) +{ + return libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(serialized); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ZERO +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline Eurydice_arr_9e libcrux_ml_kem_polynomial_ZERO_ea(void) +{ + Eurydice_arr_9e lit; + Eurydice_arr_d6 repeat_expression[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); + } + memcpy(lit.data, repeat_expression, (size_t)16U * sizeof (Eurydice_arr_d6)); + return lit; +} + +/** + Given two `KyberPolynomialRingElement`s in their NTT representations, + compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`, + the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation: + + ```plaintext + ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X² - ζ^(2·BitRev₇(i) + 1)) + ``` + + This function almost implements <strong>Algorithm 10</strong> of the + NIST FIPS 203 standard, which is reproduced below: + + ```plaintext + Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆. + Output: An array ĥ ∈ ℤq. + + for(i ← 0; i < 128; i++) + (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1], ζ^(2·BitRev₇(i) + 1)) + end for + return ĥ + ``` + We say "almost" because the coefficients of the ring element output by + this function are in the Montgomery domain. + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_ntt_multiply_ea( + const Eurydice_arr_9e *myself, + const Eurydice_arr_9e *rhs +) +{ + Eurydice_arr_9e out = libcrux_ml_kem_polynomial_ZERO_ea(); + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_ntt_multiply_b8(&myself->data[i0], + &rhs->data[i0], + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0), + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + (size_t)1U), + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + (size_t)2U), + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + (size_t)3U)); + out.data[i0] = uu____0; + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_ntt_multiply_d6_ea( + const Eurydice_arr_9e *self, + const Eurydice_arr_9e *rhs +) +{ + return libcrux_ml_kem_polynomial_ntt_multiply_ea(self, rhs); +} + +/** + Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise + sum of their constituent coefficients. +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_to_ring_element_68( + Eurydice_arr_9e *myself, + const Eurydice_arr_9e *rhs +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_add_b8(myself->data[i0], &rhs->data[i0]); + myself->data[i0] = uu____0; + } +} + +/** + Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise + sum of their constituent coefficients. +*/ +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_to_ring_element_d6_68( + Eurydice_arr_9e *self, + const Eurydice_arr_9e *rhs +) +{ + libcrux_ml_kem_polynomial_add_to_ring_element_68(self, rhs); +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(size_t *zeta_i, Eurydice_arr_9e *re) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]--; + re->data[round] = + libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)2U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)3U)); + zeta_i[0U] -= (size_t)3U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(size_t *zeta_i, Eurydice_arr_9e *re) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]--; + re->data[round] = + libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U)); + zeta_i[0U]--; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(size_t *zeta_i, Eurydice_arr_9e *re) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]--; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + re->data[round] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 +libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea( + Eurydice_arr_d6 a, + Eurydice_arr_d6 b, + int16_t zeta_r +) +{ + Eurydice_arr_d6 a_minus_b = libcrux_ml_kem_vector_portable_sub_b8(b, &a); + a = + libcrux_ml_kem_vector_portable_barrett_reduce_b8(libcrux_ml_kem_vector_portable_add_b8(a, &b)); + b = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(a_minus_b, zeta_r); + return + ( + KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){ + .fst = a, + .snd = b + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t layer +) +{ + size_t step = (size_t)1U << (uint32_t)layer; + for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) + { + size_t round = i0; + zeta_i[0U]--; + size_t offset = round * step * (size_t)2U; + size_t offset_vec = offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; + size_t step_vec = step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; + for (size_t i = offset_vec; i < offset_vec + step_vec; i++) + { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 + uu____0 = + libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(re->data[j], + re->data[j + step_vec], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + Eurydice_arr_d6 x = uu____0.fst; + Eurydice_arr_d6 y = uu____0.snd; + re->data[j] = x; + re->data[j + step_vec] = y; + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(Eurydice_arr_9e *re) +{ + size_t zeta_i = LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U; + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(&zeta_i, re); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(&zeta_i, re); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(&zeta_i, re); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_subtract_reduce_ea(const Eurydice_arr_9e *myself, Eurydice_arr_9e b) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b.data[i0], + 1441); + Eurydice_arr_d6 + diff = libcrux_ml_kem_vector_portable_sub_b8(myself->data[i0], &coefficient_normal_form); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(diff); + b.data[i0] = red; + } + return b; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(const Eurydice_arr_9e *self, Eurydice_arr_9e b) +{ + return libcrux_ml_kem_polynomial_subtract_reduce_ea(self, b); +} + +/** + The following functions compute various expressions involving + vectors and matrices. The computation of these expressions has been + abstracted away into these functions in order to save on loop iterations. + Compute v − InverseNTT(sᵀ ◦ NTT(u)) +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_matrix_compute_message_68( + const Eurydice_arr_9e *v, + const Eurydice_arr_bb0 *secret_as_ntt, + const Eurydice_arr_bb0 *u_as_ntt +) +{ + Eurydice_arr_9e result = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + product = + libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&secret_as_ntt->data[i0], + &u_as_ntt->data[i0]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&result, &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(&result); + return libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(v, result); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.to_unsigned_field_modulus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_serialize_compress_then_serialize_message_ea(Eurydice_arr_9e re) +{ + Eurydice_arr_ec serialized = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re.data[i0]); + Eurydice_arr_d6 + coefficient_compressed = libcrux_ml_kem_vector_portable_compress_1_b8(coefficient); + Eurydice_array_u8x2 + bytes = libcrux_ml_kem_vector_portable_serialize_1_b8(coefficient_compressed); + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d46(&serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)2U * i0, + .end = (size_t)2U * i0 + (size_t)2U + } + )), + Eurydice_array_to_slice_shared_82(&bytes), + uint8_t); + } + return serialized; +} + +/** + This function implements <strong>Algorithm 14</strong> of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm. + + Algorithm 14 is reproduced below: + + ```plaintext + Input: decryption key dkₚₖₑ ∈ 𝔹^{384k}. + Input: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. + Output: message m ∈ 𝔹^{32}. + + c₁ ← c[0 : 32dᵤk] + c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)] + u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁)) + v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂)) + ŝ ← ByteDecode₁₂(dkₚₖₑ) + w ← v - NTT-¹(ŝᵀ ◦ NTT(u)) + m ← ByteEncode₁(Compress₁(w)) + return m + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cpa_decrypt_unpacked_01( + const Eurydice_arr_bb0 *secret_key, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_arr_bb0 + u_as_ntt = libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_30(ciphertext); + Eurydice_arr_9e + v = + libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_b6(Eurydice_array_to_subslice_from_shared_5f0(ciphertext, + (size_t)960U)); + Eurydice_arr_9e message = libcrux_ml_kem_matrix_compute_message_68(&v, secret_key, &u_as_ntt); + return libcrux_ml_kem_serialize_compress_then_serialize_message_ea(message); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cpa_decrypt_01( + Eurydice_borrow_slice_u8 secret_key, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_01(&lvalue, i); + } + Eurydice_arr_bb0 secret_key_unpacked = arr_struct; + libcrux_ml_kem_ind_cpa_deserialize_vector_68(secret_key, &secret_key_unpacked); + return libcrux_ml_kem_ind_cpa_decrypt_unpacked_01(&secret_key_unpacked, ciphertext); +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_c7 +libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_G(input); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF +with const generics +- LEN= 32 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_PRF_ce(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_ec digest = { .data = { 0U } }; + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_01(&digest), input); + return digest; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a +with const generics +- K= 3 +- LEN= 32 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_PRF_4a_3b(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_PRF_ce(input); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_bb0 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_c10_s { Eurydice_arr_bb0 data[3U]; } Eurydice_arr_c10; + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.IndCpaPublicKeyUnpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51_s +{ + Eurydice_arr_bb0 t_as_ntt; + Eurydice_arr_ec seed_for_A; + Eurydice_arr_c10 A; +} +libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51; + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_8b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(void) +{ + Eurydice_arr_bb0 uu____0; + Eurydice_arr_9e repeat_expression0[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression0[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + } + memcpy(uu____0.data, repeat_expression0, (size_t)3U * sizeof (Eurydice_arr_9e)); + Eurydice_arr_ec uu____1 = { .data = { 0U } }; + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 lit0; + lit0.t_as_ntt = uu____0; + lit0.seed_for_A = uu____1; + Eurydice_arr_bb0 repeat_expression1[3U]; + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + Eurydice_arr_bb0 lit; + Eurydice_arr_9e repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + } + memcpy(lit.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_9e)); + repeat_expression1[i0] = lit; + } + memcpy(lit0.A.data, repeat_expression1, (size_t)3U * sizeof (Eurydice_arr_bb0)); + return lit0; +} + +/** + Only use with public values. + + This MUST NOT be used with secret inputs, like its caller `deserialize_ring_elements_reduced`. +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea( + Eurydice_borrow_slice_u8 serialized +) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)24U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)24U, + .end = i0 * (size_t)24U + (size_t)24U + } + )); + Eurydice_arr_d6 coefficient = libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); + Eurydice_arr_d6 uu____0 = libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(coefficient); + re.data[i0] = uu____0; + } + return re; +} + +/** + See [deserialize_ring_elements_reduced_out]. +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_ring_elements_reduced +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68( + Eurydice_borrow_slice_u8 public_key, + Eurydice_arr_bb0 *deserialized_pk +) +{ + for + (size_t + i = (size_t)0U; + i < public_key.meta / LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; + i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + ring_element = + Eurydice_slice_subslice_shared_c8(public_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + .end = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + } + )); + Eurydice_arr_9e + uu____0 = libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(ring_element); + deserialized_pk->data[i0] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final +with const generics +- K= 3 +*/ +static inline Eurydice_arr_1b0 +libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_78( + const Eurydice_arr_810 *input +) +{ + Eurydice_arr_1b0 shake128_state; + Eurydice_arr_7c repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = libcrux_sha3_portable_incremental_shake128_init(); + } + memcpy(shake128_state.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_7c)); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_absorb_final(&shake128_state.data[i0], + Eurydice_array_to_slice_shared_e9(&input->data[i0])); + } + return shake128_state; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_1b0 +libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_78( + const Eurydice_arr_810 *input +) +{ + return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_78(input); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks +with const generics +- K= 3 +*/ +static inline Eurydice_arr_7e +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_78( + Eurydice_arr_1b0 *st +) +{ + Eurydice_arr_7e + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(&st->data[i0], + Eurydice_array_to_slice_mut_48(&out.data[i0])); + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_7e +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_78( + Eurydice_arr_1b0 *self +) +{ + return libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_78(self); +} + +/** + If `bytes` contains a set of uniformly random bytes, this function + uniformly samples a ring element `â` that is treated as being the NTT representation + of the corresponding polynomial `a`. + + Since rejection sampling is used, it is possible the supplied bytes are + not enough to sample the element, in which case an `Err` is returned and the + caller must try again with a fresh set of bytes. + + This function <strong>partially</strong> implements <strong>Algorithm 6</strong> of the NIST FIPS 203 standard, + We say "partially" because this implementation only accepts a finite set of + bytes as input and returns an error if the set is not enough; Algorithm 6 of + the FIPS 203 standard on the other hand samples from an infinite stream of bytes + until the ring element is filled. Algorithm 6 is reproduced below: + + ```plaintext + Input: byte stream B ∈ 𝔹*. + Output: array â ∈ ℤ₂₅₆. + + i ← 0 + j ← 0 + while j < 256 do + d₁ ← B[i] + 256·(B[i+1] mod 16) + d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] + if d₁ < q then + â[j] ← d₁ + j ← j + 1 + end if + if d₂ < q and j < 256 then + â[j] ← d₂ + j ← j + 1 + end if + i ← i + 3 + end while + return â + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_uniform_distribution_next +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- N= 504 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b6( + const Eurydice_arr_7e *randomness, + Eurydice_arr_eb *sampled_coefficients, + Eurydice_arr_b1 *out +) +{ + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) + { + size_t r = i; + if (sampled_coefficients->data[i1] < LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + size_t + sampled = + libcrux_ml_kem_vector_portable_rej_sample_b8(Eurydice_array_to_subslice_shared_d45(&randomness->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = r * (size_t)24U, + .end = r * (size_t)24U + (size_t)24U + } + )), + Eurydice_array_to_subslice_mut_e7(&out->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = sampled_coefficients->data[i1], + .end = sampled_coefficients->data[i1] + (size_t)16U + } + ))); + size_t uu____0 = i1; + sampled_coefficients->data[uu____0] += sampled; + } + } + } + bool done = true; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + if (sampled_coefficients->data[i0] >= LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + sampled_coefficients->data[i0] = LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; + } + else + { + done = false; + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block +with const generics +- K= 3 +*/ +static inline Eurydice_arr_2c +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_78(Eurydice_arr_1b0 *st) +{ + Eurydice_arr_2c + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&st->data[i0], + Eurydice_array_to_slice_mut_2c(&out.data[i0])); + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_2c +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_78( + Eurydice_arr_1b0 *self +) +{ + return libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_78(self); +} + +/** + If `bytes` contains a set of uniformly random bytes, this function + uniformly samples a ring element `â` that is treated as being the NTT representation + of the corresponding polynomial `a`. + + Since rejection sampling is used, it is possible the supplied bytes are + not enough to sample the element, in which case an `Err` is returned and the + caller must try again with a fresh set of bytes. + + This function <strong>partially</strong> implements <strong>Algorithm 6</strong> of the NIST FIPS 203 standard, + We say "partially" because this implementation only accepts a finite set of + bytes as input and returns an error if the set is not enough; Algorithm 6 of + the FIPS 203 standard on the other hand samples from an infinite stream of bytes + until the ring element is filled. Algorithm 6 is reproduced below: + + ```plaintext + Input: byte stream B ∈ 𝔹*. + Output: array â ∈ ℤ₂₅₆. + + i ← 0 + j ← 0 + while j < 256 do + d₁ ← B[i] + 256·(B[i+1] mod 16) + d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] + if d₁ < q then + â[j] ← d₁ + j ← j + 1 + end if + if d₂ < q and j < 256 then + â[j] ← d₂ + j ← j + 1 + end if + i ← i + 3 + end while + return â + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_uniform_distribution_next +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- N= 168 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b60( + const Eurydice_arr_2c *randomness, + Eurydice_arr_eb *sampled_coefficients, + Eurydice_arr_b1 *out +) +{ + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) + { + size_t r = i; + if (sampled_coefficients->data[i1] < LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + size_t + sampled = + libcrux_ml_kem_vector_portable_rej_sample_b8(Eurydice_array_to_subslice_shared_d46(&randomness->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = r * (size_t)24U, + .end = r * (size_t)24U + (size_t)24U + } + )), + Eurydice_array_to_subslice_mut_e7(&out->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = sampled_coefficients->data[i1], + .end = sampled_coefficients->data[i1] + (size_t)16U + } + ))); + size_t uu____0 = i1; + sampled_coefficients->data[uu____0] += sampled; + } + } + } + bool done = true; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + if (sampled_coefficients->data[i0] >= LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + sampled_coefficients->data[i0] = LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; + } + else + { + done = false; + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_borrow_slice_i16 a) +{ + Eurydice_arr_9e result = libcrux_ml_kem_polynomial_ZERO_ea(); + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice_subslice_shared_a6(a, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)16U, + .end = (i0 + (size_t)1U) * (size_t)16U + } + ))); + result.data[i0] = uu____0; + } + return result; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_borrow_slice_i16 a) +{ + return libcrux_ml_kem_polynomial_from_i16_array_ea(a); +} + +/** +This function found in impl {core::ops::function::FnMut<([i16; 272usize]), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@2]> for libcrux_ml_kem::sampling::sample_from_xof::closure<Vector, Hasher, K>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.call_mut_0a +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_sampling_sample_from_xof_call_mut_0a_91(void **_, Eurydice_arr_5b tupled_args) +{ + Eurydice_arr_5b s = tupled_args; + return + libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_array_to_subslice_shared_e70(&s, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)256U }))); +} + +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_sampling_sample_from_xof_91(const Eurydice_arr_810 *seeds) +{ + Eurydice_arr_eb sampled_coefficients = { .data = { 0U } }; + Eurydice_arr_b1 + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + Eurydice_arr_1b0 + xof_state = libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_78(seeds); + Eurydice_arr_7e + randomness0 = + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_78(&xof_state); + bool + done = + libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b6(&randomness0, + &sampled_coefficients, + &out); + while (true) + { + if (done) + { + break; + } + else + { + Eurydice_arr_2c + randomness = + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_78(&xof_state); + done = + libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b60(&randomness, + &sampled_coefficients, + &out); + } + } + Eurydice_arr_bb0 arr_mapped_str; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_mapped_str.data[i] = + libcrux_ml_kem_sampling_sample_from_xof_call_mut_0a_91(&lvalue, + out.data[i]); + } + return arr_mapped_str; +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_matrix_sample_matrix_A_91( + Eurydice_arr_c10 *A_transpose, + const Eurydice_arr_31 *seed, + bool transpose +) +{ + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + Eurydice_arr_810 seeds; + Eurydice_arr_31 repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = + core_array__core__clone__Clone_for__T__N___clone((size_t)34U, + seed, + uint8_t, + Eurydice_arr_31); + } + memcpy(seeds.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_31)); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + seeds.data[j].data[32U] = (uint8_t)i1; + seeds.data[j].data[33U] = (uint8_t)j; + } + Eurydice_arr_bb0 sampled = libcrux_ml_kem_sampling_sample_from_xof_91(&seeds); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + Eurydice_arr_9e sample = sampled.data[j]; + if (transpose) + { + A_transpose->data[j].data[i1] = sample; + } + else + { + A_transpose->data[i1].data[j] = sample; + } + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key_mut +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_05( + Eurydice_borrow_slice_u8 public_key, + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *unpacked_public_key +) +{ + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68(Eurydice_slice_subslice_to_shared_72(public_key, + (size_t)1152U), + &unpacked_public_key->t_as_ntt); + Eurydice_borrow_slice_u8 + seed = Eurydice_slice_subslice_from_shared_6d(public_key, (size_t)1152U); + Eurydice_arr_c10 *uu____0 = &unpacked_public_key->A; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_31 lvalue = libcrux_ml_kem_utils_into_padded_array_de(seed); + libcrux_ml_kem_matrix_sample_matrix_A_91(uu____0, &lvalue, false); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cpa_build_unpacked_public_key_05(Eurydice_borrow_slice_u8 public_key) +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + unpacked_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(); + libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_05(public_key, &unpacked_public_key); + return unpacked_public_key; +} + +/** +A monomorphic instance of n-tuple +with types Eurydice_arr_bb0, libcrux_ml_kem_polynomial_PolynomialRingElement_1d + +*/ +typedef struct tuple_c6_s +{ + Eurydice_arr_bb0 fst; + Eurydice_arr_9e snd; +} +tuple_c6; + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure<Vector, Hasher, K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE, ETA2, ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_f1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- C1_LEN= 960 +- U_COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_87(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN +with const generics +- K= 3 +- LEN= 128 +*/ +static inline Eurydice_arr_58 +libcrux_ml_kem_hash_functions_portable_PRFxN_3b(const Eurydice_arr_fd *input) +{ + Eurydice_arr_58 + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_78(&out.data[i0]), + Eurydice_array_to_slice_shared_b5(&input->data[i0])); + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_4a +with const generics +- K= 3 +- LEN= 128 +*/ +static inline Eurydice_arr_58 +libcrux_ml_kem_hash_functions_portable_PRFxN_4a_3b(const Eurydice_arr_fd *input) +{ + return libcrux_ml_kem_hash_functions_portable_PRFxN_3b(input); +} + +/** + Given a series of uniformly random bytes in `randomness`, for some number `eta`, + the `sample_from_binomial_distribution_{eta}` functions sample + a ring element from a binomial distribution centered at 0 that uses two sets + of `eta` coin flips. If, for example, + `eta = ETA`, each ring coefficient is a value `v` such + such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and: + + ```plaintext + - If v < 0, Pr[v] = Pr[-v] + - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA) + ``` + + The values `v < 0` are mapped to the appropriate `KyberFieldElement`. + + The expected value is: + + ```plaintext + E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1] + (ETA)Pr[ETA] + = 0 since Pr[-v] = Pr[v] when v < 0. + ``` + + And the variance is: + + ```plaintext + Var(X) = E[(X - E[X])^2] + = E[X^2] + = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2^(2 * ETA)) + = ETA / 2 + ``` + + This function implements <strong>Algorithm 7</strong> of the NIST FIPS 203 standard, which is + reproduced below: + + ```plaintext + Input: byte array B ∈ 𝔹^{64η}. + Output: array f ∈ ℤ₂₅₆. + + b ← BytesToBits(B) + for (i ← 0; i < 256; i++) + x ← ∑(j=0 to η - 1) b[2iη + j] + y ← ∑(j=0 to η - 1) b[2iη + η + j] + f[i] ← x−y mod q + end for + return f + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea( + Eurydice_borrow_slice_u8 randomness +) +{ + Eurydice_arr_04 sampled_i16s = { .data = { 0U } }; + for (size_t i0 = (size_t)0U; i0 < randomness.meta / (size_t)4U; i0++) + { + size_t chunk_number = i0; + Eurydice_borrow_slice_u8 + byte_chunk = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = chunk_number * (size_t)4U, + .end = chunk_number * (size_t)4U + (size_t)4U + } + )); + uint32_t + random_bits_as_u32 = + (((uint32_t)byte_chunk.ptr[0U] | (uint32_t)byte_chunk.ptr[1U] << 8U) | + (uint32_t)byte_chunk.ptr[2U] << 16U) + | (uint32_t)byte_chunk.ptr[3U] << 24U; + uint32_t even_bits = random_bits_as_u32 & 1431655765U; + uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U; + uint32_t coin_toss_outcomes = even_bits + odd_bits; + for (uint32_t i = 0U; i < 32U / 4U; i++) + { + uint32_t outcome_set = i; + uint32_t outcome_set0 = outcome_set * 4U; + int16_t outcome_1 = (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U); + int16_t outcome_2 = (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U); + size_t offset = (size_t)(outcome_set0 >> 2U); + sampled_i16s.data[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2; + } + } + return + libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_array_to_slice_shared_99(&sampled_i16s)); +} + +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_binomial_distribution +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- ETA= 2 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_sampling_sample_from_binomial_distribution_66( + Eurydice_borrow_slice_u8 randomness +) +{ + return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(randomness); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_ea(Eurydice_arr_9e *re) +{ + size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U; + for (size_t i = (size_t)0U; i < step; i++) + { + size_t j = i; + Eurydice_arr_d6 + t = libcrux_ml_kem_vector_portable_multiply_by_constant_b8(re->data[j + step], -1600); + re->data[j + step] = libcrux_ml_kem_vector_portable_sub_b8(re->data[j], &t); + Eurydice_arr_d6 uu____1 = libcrux_ml_kem_vector_portable_add_b8(re->data[j], &t); + re->data[j] = uu____1; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(Eurydice_arr_9e *re) +{ + libcrux_ml_kem_ntt_ntt_at_layer_7_ea(re); + size_t zeta_i = (size_t)1U; + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, (size_t)11207U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, + re, + (size_t)5U, + (size_t)11207U + (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, + re, + (size_t)4U, + (size_t)11207U + (size_t)2U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)11207U + (size_t)3U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)11207U + (size_t)4U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)11207U + (size_t)5U * (size_t)3328U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); +} + +/** + Sample a vector of ring elements from a centered binomial distribution and + convert them into their NTT representations. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- ETA= 2 +- ETA_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE uint8_t +libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf( + Eurydice_arr_bb0 *re_as_ntt, + const Eurydice_arr_fa0 *prf_input, + uint8_t domain_separator +) +{ + Eurydice_arr_fd prf_inputs; + Eurydice_arr_fa0 repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = + core_array__core__clone__Clone_for__T__N___clone((size_t)33U, + prf_input, + uint8_t, + Eurydice_arr_fa0); + } + memcpy(prf_inputs.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_fa0)); + domain_separator = libcrux_ml_kem_utils_prf_input_inc_78(&prf_inputs, domain_separator); + Eurydice_arr_58 prf_outputs = libcrux_ml_kem_hash_functions_portable_PRFxN_4a_3b(&prf_inputs); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + uu____0 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_66(Eurydice_array_to_slice_shared_78(&prf_outputs.data[i0])); + re_as_ntt->data[i0] = uu____0; + libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(&re_as_ntt->data[i0]); + } + return domain_separator; +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure#1<Vector, Hasher, K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE, ETA2, ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_dd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- C1_LEN= 960 +- U_COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_87(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** + Sample a vector of ring elements from a centered binomial distribution. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- ETA2_RANDOMNESS_SIZE= 128 +- ETA2= 2 +*/ +static KRML_MUSTINLINE uint8_t +libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_bf( + const Eurydice_arr_fa0 *prf_input, + uint8_t domain_separator, + Eurydice_arr_bb0 *error_1 +) +{ + Eurydice_arr_fd prf_inputs; + Eurydice_arr_fa0 repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = + core_array__core__clone__Clone_for__T__N___clone((size_t)33U, + prf_input, + uint8_t, + Eurydice_arr_fa0); + } + memcpy(prf_inputs.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_fa0)); + domain_separator = libcrux_ml_kem_utils_prf_input_inc_78(&prf_inputs, domain_separator); + Eurydice_arr_58 prf_outputs = libcrux_ml_kem_hash_functions_portable_PRFxN_4a_3b(&prf_inputs); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + uu____0 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_66(Eurydice_array_to_slice_shared_78(&prf_outputs.data[i0])); + error_1->data[i0] = uu____0; + } + return domain_separator; +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF +with const generics +- LEN= 128 +*/ +static inline Eurydice_arr_89 +libcrux_ml_kem_hash_functions_portable_PRF_ec(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_89 digest = { .data = { 0U } }; + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_78(&digest), input); + return digest; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a +with const generics +- K= 3 +- LEN= 128 +*/ +static inline Eurydice_arr_89 +libcrux_ml_kem_hash_functions_portable_PRF_4a_3b0(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_PRF_ec(input); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::matrix::compute_vector_u::closure<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.call_mut_a8 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_68(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_error_reduce_ea( + Eurydice_arr_9e *myself, + const Eurydice_arr_9e *error +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t j = i; + Eurydice_arr_d6 + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(myself->data[j], + 1441); + Eurydice_arr_d6 + sum = libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &error->data[j]); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); + myself->data[j] = red; + } +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_error_reduce_d6_ea( + Eurydice_arr_9e *self, + const Eurydice_arr_9e *error +) +{ + libcrux_ml_kem_polynomial_add_error_reduce_ea(self, error); +} + +/** + Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁ +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_matrix_compute_vector_u_68( + const Eurydice_arr_c10 *a_as_ntt, + const Eurydice_arr_bb0 *r_as_ntt, + const Eurydice_arr_bb0 *error_1 +) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_68(&lvalue, i); + } + Eurydice_arr_bb0 result = arr_struct; + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + const Eurydice_arr_bb0 *row = &a_as_ntt->data[i1]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + const Eurydice_arr_9e *a_element = &row->data[j]; + Eurydice_arr_9e + product = libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(a_element, &r_as_ntt->data[j]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&result.data[i1], &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(&result.data[i1]); + libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(&result.data[i1], &error_1->data[i1]); + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_compress_ef(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int16_t + uu____0 = + libcrux_secrets_int_as_i16_f5(libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient((uint8_t)10, + libcrux_secrets_int_as_u16_f5(a.data[i0]))); + a.data[i0] = uu____0; + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 +with const generics +- COEFFICIENT_BITS= 10 +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_compress_b8_ef(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_compress_ef(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE Eurydice_arr_b0 +libcrux_ml_kem_serialize_compress_then_serialize_10_e1(const Eurydice_arr_9e *re) +{ + Eurydice_arr_b0 serialized = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = + libcrux_ml_kem_vector_portable_compress_b8_ef(libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re->data[i0])); + Eurydice_arr_fc bytes = libcrux_ml_kem_vector_portable_serialize_10_b8(coefficient); + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d413(&serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)20U * i0, + .end = (size_t)20U * i0 + (size_t)20U + } + )), + Eurydice_array_to_slice_shared_8f(&bytes), + uint8_t); + } + return serialized; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- COMPRESSION_FACTOR= 10 +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE Eurydice_arr_b0 +libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_f7(const Eurydice_arr_9e *re) +{ + return libcrux_ml_kem_serialize_compress_then_serialize_10_e1(re); +} + +/** + Call [`compress_then_serialize_ring_element_u`] on each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- OUT_LEN= 960 +- COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_compress_then_serialize_u_21( + Eurydice_arr_bb0 input, + Eurydice_mut_borrow_slice_u8 out +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e re = input.data[i0]; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * ((size_t)960U / (size_t)3U), + .end = (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U) + } + )); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_b0 + lvalue = libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_f7(&re); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_56(&lvalue), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- C1_LEN= 960 +- U_COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_c6 +libcrux_ml_kem_ind_cpa_encrypt_c1_87( + Eurydice_borrow_slice_u8 randomness, + const Eurydice_arr_c10 *matrix, + Eurydice_mut_borrow_slice_u8 ciphertext +) +{ + Eurydice_arr_fa0 prf_input = libcrux_ml_kem_utils_into_padded_array_29(randomness); + Eurydice_arr_bb0 arr_struct0; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct0.data[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_87(&lvalue, i); + } + Eurydice_arr_bb0 r_as_ntt = arr_struct0; + uint8_t + domain_separator0 = + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf(&r_as_ntt, + &prf_input, + 0U); + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_87(&lvalue, i); + } + Eurydice_arr_bb0 error_1 = arr_struct; + uint8_t + domain_separator = + libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_bf(&prf_input, + domain_separator0, + &error_1); + prf_input.data[32U] = domain_separator; + Eurydice_arr_89 + prf_output = + libcrux_ml_kem_hash_functions_portable_PRF_4a_3b0(Eurydice_array_to_slice_shared_b5(&prf_input)); + Eurydice_arr_9e + error_2 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_66(Eurydice_array_to_slice_shared_78(&prf_output)); + Eurydice_arr_bb0 u = libcrux_ml_kem_matrix_compute_vector_u_68(matrix, &r_as_ntt, &error_1); + libcrux_ml_kem_ind_cpa_compress_then_serialize_u_21(u, ciphertext); + return (KRML_CLITERAL(tuple_c6){ .fst = r_as_ntt, .snd = error_2 }); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea( + const Eurydice_arr_ec *serialized +) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient_compressed = + libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_array_to_subslice_shared_d4(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)2U * i0, + .end = (size_t)2U * i0 + (size_t)2U + } + ))); + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_decompress_1_b8(coefficient_compressed); + re.data[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_add_message_error_reduce_ea( + const Eurydice_arr_9e *myself, + const Eurydice_arr_9e *message, + Eurydice_arr_9e result +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(result.data[i0], + 1441); + Eurydice_arr_d6 + sum1 = libcrux_ml_kem_vector_portable_add_b8(myself->data[i0], &message->data[i0]); + Eurydice_arr_d6 sum2 = libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &sum1); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum2); + result.data[i0] = red; + } + return result; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea( + const Eurydice_arr_9e *self, + const Eurydice_arr_9e *message, + Eurydice_arr_9e result +) +{ + return libcrux_ml_kem_polynomial_add_message_error_reduce_ea(self, message, result); +} + +/** + Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_matrix_compute_ring_element_v_68( + const Eurydice_arr_bb0 *t_as_ntt, + const Eurydice_arr_bb0 *r_as_ntt, + const Eurydice_arr_9e *error_2, + const Eurydice_arr_9e *message +) +{ + Eurydice_arr_9e result = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + product = + libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&t_as_ntt->data[i0], + &r_as_ntt->data[i0]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&result, &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(&result); + return libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(error_2, message, result); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_compress_d1(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int16_t + uu____0 = + libcrux_secrets_int_as_i16_f5(libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient((uint8_t)4, + libcrux_secrets_int_as_u16_f5(a.data[i0]))); + a.data[i0] = uu____0; + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 +with const generics +- COEFFICIENT_BITS= 4 +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_compress_b8_d1(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_compress_d1(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_4_ea( + Eurydice_arr_9e re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = + libcrux_ml_kem_vector_portable_compress_b8_d1(libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re.data[i0])); + Eurydice_array_u8x8 bytes = libcrux_ml_kem_vector_portable_serialize_4_b8(coefficient); + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)8U * i0, + .end = (size_t)8U * i0 + (size_t)8U + } + )), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- COMPRESSION_FACTOR= 4 +- OUT_LEN= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_30( + Eurydice_arr_9e re, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_kem_serialize_compress_then_serialize_4_ea(re, out); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- V_COMPRESSION_FACTOR= 4 +- C2_LEN= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_encrypt_c2_30( + const Eurydice_arr_bb0 *t_as_ntt, + const Eurydice_arr_bb0 *r_as_ntt, + const Eurydice_arr_9e *error_2, + const Eurydice_arr_ec *message, + Eurydice_mut_borrow_slice_u8 ciphertext +) +{ + Eurydice_arr_9e + message_as_ring_element = + libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(message); + Eurydice_arr_9e + v = + libcrux_ml_kem_matrix_compute_ring_element_v_68(t_as_ntt, + r_as_ntt, + error_2, + &message_as_ring_element); + libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_30(v, ciphertext); +} + +/** + This function implements <strong>Algorithm 13</strong> of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE encryption algorithm. + + Algorithm 13 is reproduced below: + + ```plaintext + Input: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. + Input: message m ∈ 𝔹^{32}. + Input: encryption randomness r ∈ 𝔹^{32}. + Output: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. + + N ← 0 + t̂ ← ByteDecode₁₂(ekₚₖₑ[0:384k]) + ρ ← ekₚₖₑ[384k: 384k + 32] + for (i ← 0; i < k; i++) + for(j ← 0; j < k; j++) + Â[i,j] ← SampleNTT(XOF(ρ, i, j)) + end for + end for + for(i ← 0; i < k; i++) + r[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(r,N)) + N ← N + 1 + end for + for(i ← 0; i < k; i++) + e₁[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) + N ← N + 1 + end for + e₂ ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) + r̂ ← NTT(r) + u ← NTT-¹(Âᵀ ◦ r̂) + e₁ + μ ← Decompress₁(ByteDecode₁(m))) + v ← NTT-¹(t̂ᵀ ◦ rˆ) + e₂ + μ + c₁ ← ByteEncode_{dᵤ}(Compress_{dᵤ}(u)) + c₂ ← ByteEncode_{dᵥ}(Compress_{dᵥ}(v)) + return c ← (c₁ ‖ c₂) + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_LEN= 960 +- C2_LEN= 128 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE Eurydice_arr_2b +libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5( + const libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_ec *message, + Eurydice_borrow_slice_u8 randomness +) +{ + Eurydice_arr_2b ciphertext = { .data = { 0U } }; + tuple_c6 + uu____0 = + libcrux_ml_kem_ind_cpa_encrypt_c1_87(randomness, + &public_key->A, + Eurydice_array_to_subslice_mut_d414(&ciphertext, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)960U }))); + Eurydice_arr_bb0 r_as_ntt = uu____0.fst; + Eurydice_arr_9e error_2 = uu____0.snd; + libcrux_ml_kem_ind_cpa_encrypt_c2_30(&public_key->t_as_ntt, + &r_as_ntt, + &error_2, + message, + Eurydice_array_to_subslice_from_mut_5f3(&ciphertext, (size_t)960U)); + return ciphertext; +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_LEN= 960 +- C2_LEN= 128 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE Eurydice_arr_2b +libcrux_ml_kem_ind_cpa_encrypt_d5( + Eurydice_borrow_slice_u8 public_key, + const Eurydice_arr_ec *message, + Eurydice_borrow_slice_u8 randomness +) +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + unpacked_public_key = libcrux_ml_kem_ind_cpa_build_unpacked_public_key_05(public_key); + return libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5(&unpacked_public_key, message, randomness); +} + +/** +This function found in impl {libcrux_ml_kem::variant::Variant for libcrux_ml_kem::variant::MlKem} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.kdf_39 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_variant_kdf_39_52( + Eurydice_borrow_slice_u8 shared_secret, + const Eurydice_arr_2b *_ +) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&out), shared_secret, uint8_t); + return out; +} + +/** + This code verifies on some machines, runs out of memory on others +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cca_decapsulate_fd( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_borrow_slice_u8_x4 + uu____0 = + libcrux_ml_kem_types_unpack_private_key_64(Eurydice_array_to_slice_shared_51(private_key)); + Eurydice_borrow_slice_u8 ind_cpa_secret_key = uu____0.fst; + Eurydice_borrow_slice_u8 ind_cpa_public_key = uu____0.snd; + Eurydice_borrow_slice_u8 ind_cpa_public_key_hash = uu____0.thd; + Eurydice_borrow_slice_u8 implicit_rejection_value = uu____0.f3; + Eurydice_arr_ec decrypted = libcrux_ml_kem_ind_cpa_decrypt_01(ind_cpa_secret_key, ciphertext); + Eurydice_arr_c7 + to_hash0 = + libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_array_to_slice_shared_01(&decrypted)); + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f1(&to_hash0, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE), + ind_cpa_public_key_hash, + uint8_t); + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash0)); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret0 = uu____1.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____1.snd; + Eurydice_arr_af to_hash = libcrux_ml_kem_utils_into_padded_array_66(implicit_rejection_value); + Eurydice_mut_borrow_slice_u8 + uu____2 = + Eurydice_array_to_subslice_from_mut_5f2(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE); + Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_c1_52(ciphertext), uint8_t); + Eurydice_arr_ec + implicit_rejection_shared_secret = + libcrux_ml_kem_hash_functions_portable_PRF_4a_3b(Eurydice_array_to_slice_shared_81(&to_hash)); + Eurydice_arr_2b + expected_ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_d5(ind_cpa_public_key, + &decrypted, + pseudorandomness); + Eurydice_borrow_slice_u8 + uu____3 = Eurydice_array_to_slice_shared_01(&implicit_rejection_shared_secret); + Eurydice_arr_ec + implicit_rejection_shared_secret0 = + libcrux_ml_kem_variant_kdf_39_52(uu____3, + libcrux_ml_kem_types_as_slice_a9_52(ciphertext)); + Eurydice_arr_ec + shared_secret = + libcrux_ml_kem_variant_kdf_39_52(shared_secret0, + libcrux_ml_kem_types_as_slice_a9_52(ciphertext)); + Eurydice_borrow_slice_u8 uu____4 = libcrux_ml_kem_types_as_ref_c1_52(ciphertext); + return + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(uu____4, + Eurydice_array_to_slice_shared_06(&expected_ciphertext), + Eurydice_array_to_slice_shared_01(&shared_secret), + Eurydice_array_to_slice_shared_01(&implicit_rejection_shared_secret0)); +} + +/** + Portable decapsulate +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_19( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_decapsulate_fd(private_key, ciphertext); +} + +/** + Decapsulate ML-KEM 768 + + Generates an [`MlKemSharedSecret`]. + The input is a reference to an [`MlKem768PrivateKey`] and an [`MlKem768Ciphertext`]. +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_mlkem768_portable_decapsulate( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_19(private_key, ciphertext); +} + +/** +This function found in impl {libcrux_ml_kem::variant::Variant for libcrux_ml_kem::variant::MlKem} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_39 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_variant_entropy_preprocess_39_13(Eurydice_borrow_slice_u8 randomness) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&out), randomness, uint8_t); + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for libcrux_ml_kem::hash_functions::portable::PortableHash<K>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_H(input); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_f4 +libcrux_ml_kem_ind_cca_encapsulate_99( + const Eurydice_arr_5f *public_key, + const Eurydice_arr_ec *randomness +) +{ + Eurydice_arr_ec + randomness0 = + libcrux_ml_kem_variant_entropy_preprocess_39_13(Eurydice_array_to_slice_shared_01(randomness)); + Eurydice_arr_c7 + to_hash = + libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_array_to_slice_shared_01(&randomness0)); + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_array_to_subslice_from_mut_5f1(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_ec + lvalue = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_slice_shared_ff(libcrux_ml_kem_types_as_slice_e6_3d(public_key))); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_01(&lvalue), uint8_t); + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash)); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret = uu____1.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____1.snd; + Eurydice_arr_2b + ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_d5(Eurydice_array_to_slice_shared_ff(libcrux_ml_kem_types_as_slice_e6_3d(public_key)), + &randomness0, + pseudorandomness); + Eurydice_arr_2b uu____2 = libcrux_ml_kem_types_from_19_52(ciphertext); + return + ( + KRML_CLITERAL(tuple_f4){ + .fst = uu____2, + .snd = libcrux_ml_kem_variant_kdf_39_52(shared_secret, &ciphertext) + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline tuple_f4 +libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_26( + const Eurydice_arr_5f *public_key, + const Eurydice_arr_ec *randomness +) +{ + return libcrux_ml_kem_ind_cca_encapsulate_99(public_key, randomness); +} + +/** + Encapsulate ML-KEM 768 + + Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. + The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`] + bytes of `randomness`. +*/ +static inline tuple_f4 +libcrux_ml_kem_mlkem768_portable_encapsulate( + const Eurydice_arr_5f *public_key, + Eurydice_arr_ec randomness +) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_26(public_key, &randomness); +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cpa::unpacked::IndCpaPrivateKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_70 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_bb0 libcrux_ml_kem_ind_cpa_unpacked_default_70_68(void) +{ + Eurydice_arr_bb0 lit; + Eurydice_arr_9e repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + } + memcpy(lit.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_9e)); + return lit; +} + +/** +This function found in impl {libcrux_ml_kem::variant::Variant for libcrux_ml_kem::variant::MlKem} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_39 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_c7 +libcrux_ml_kem_variant_cpa_keygen_seed_39_13(Eurydice_borrow_slice_u8 key_generation_seed) +{ + Eurydice_arr_fa0 seed = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d412(&seed, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + } + )), + key_generation_seed, + uint8_t); + seed.data[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] = (uint8_t)(size_t)3U; + return + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_b5(&seed)); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@3]> for libcrux_ml_kem::ind_cpa::generate_keypair_unpacked::closure<Vector, Hasher, Scheme, K, ETA1, ETA1_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3, TraitClause@4, TraitClause@5]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked.call_mut_73 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_39(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.to_standard_domain +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_polynomial_to_standard_domain_ea(Eurydice_arr_d6 vector) +{ + return + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(vector, + LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_standard_error_reduce_ea( + Eurydice_arr_9e *myself, + const Eurydice_arr_9e *error +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t j = i; + Eurydice_arr_d6 + coefficient_normal_form = libcrux_ml_kem_polynomial_to_standard_domain_ea(myself->data[j]); + Eurydice_arr_d6 + sum = libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &error->data[j]); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); + myself->data[j] = red; + } +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea( + Eurydice_arr_9e *self, + const Eurydice_arr_9e *error +) +{ + libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(self, error); +} + +/** + Compute  ◦ ŝ + ê +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_matrix_compute_As_plus_e_68( + Eurydice_arr_bb0 *t_as_ntt, + const Eurydice_arr_c10 *matrix_A, + const Eurydice_arr_bb0 *s_as_ntt, + const Eurydice_arr_bb0 *error_as_ntt +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + const Eurydice_arr_bb0 *row = &matrix_A->data[i0]; + Eurydice_arr_9e uu____0 = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + t_as_ntt->data[i0] = uu____0; + for (size_t i1 = (size_t)0U; i1 < (size_t)3U; i1++) + { + size_t j = i1; + const Eurydice_arr_9e *matrix_element = &row->data[j]; + Eurydice_arr_9e + product = libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(matrix_element, &s_as_ntt->data[j]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&t_as_ntt->data[i0], &product); + } + libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(&t_as_ntt->data[i0], + &error_as_ntt->data[i0]); + } +} + +/** + This function implements most of <strong>Algorithm 12</strong> of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE key generation algorithm. + + We say "most of" since Algorithm 12 samples the required randomness within + the function itself, whereas this implementation expects it to be provided + through the `key_generation_seed` parameter. + + Algorithm 12 is reproduced below: + + ```plaintext + Output: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. + Output: decryption key dkₚₖₑ ∈ 𝔹^{384k}. + + d ←$ B + (ρ,σ) ← G(d) + N ← 0 + for (i ← 0; i < k; i++) + for(j ← 0; j < k; j++) + Â[i,j] ← SampleNTT(XOF(ρ, i, j)) + end for + end for + for(i ← 0; i < k; i++) + s[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(σ,N)) + N ← N + 1 + end for + for(i ← 0; i < k; i++) + e[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(σ,N)) + N ← N + 1 + end for + ŝ ← NTT(s) + ê ← NTT(e) + t̂ ← Â◦ŝ + ê + ekₚₖₑ ← ByteEncode₁₂(t̂) ‖ ρ + dkₚₖₑ ← ByteEncode₁₂(ŝ) + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_39( + Eurydice_borrow_slice_u8 key_generation_seed, + Eurydice_arr_bb0 *private_key, + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *public_key +) +{ + Eurydice_arr_c7 hashed = libcrux_ml_kem_variant_cpa_keygen_seed_39_13(key_generation_seed); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + (size_t)32U, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_A = uu____0.fst; + Eurydice_borrow_slice_u8 seed_for_secret_and_error = uu____0.snd; + Eurydice_arr_c10 *uu____1 = &public_key->A; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_31 lvalue0 = libcrux_ml_kem_utils_into_padded_array_de(seed_for_A); + libcrux_ml_kem_matrix_sample_matrix_A_91(uu____1, &lvalue0, true); + Eurydice_arr_fa0 + prf_input = libcrux_ml_kem_utils_into_padded_array_29(seed_for_secret_and_error); + uint8_t + domain_separator = + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf(private_key, + &prf_input, + 0U); + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_39(&lvalue, + i); + } + Eurydice_arr_bb0 error_as_ntt = arr_struct; + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf(&error_as_ntt, + &prf_input, + domain_separator); + libcrux_ml_kem_matrix_compute_As_plus_e_68(&public_key->t_as_ntt, + &public_key->A, + &private_key[0U], + &error_as_ntt); + Eurydice_arr_ec arr; + memcpy(arr.data, seed_for_A.ptr, (size_t)32U * sizeof (uint8_t)); + Eurydice_arr_ec + uu____2 = + core_result_unwrap_26_39(( + KRML_CLITERAL(core_result_Result_07){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + public_key->seed_for_A = uu____2; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.serialize_uncompressed_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_b20 +libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(const Eurydice_arr_9e *re) +{ + Eurydice_arr_b20 serialized = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re->data[i0]); + Eurydice_arr_94 bytes = libcrux_ml_kem_vector_portable_serialize_12_b8(coefficient); + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d415(&serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)24U * i0, + .end = (size_t)24U * i0 + (size_t)24U + } + )), + Eurydice_array_to_slice_shared_ed(&bytes), + uint8_t); + } + return serialized; +} + +/** + Call [`serialize_uncompressed_ring_element`] for each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_vector +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_serialize_vector_68( + const Eurydice_arr_bb0 *key, + Eurydice_mut_borrow_slice_u8 out +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e re = key->data[i0]; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + } + )); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_b20 lvalue = libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(&re); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_a9(&lvalue), uint8_t); + } +} + +/** + Concatenate `t` and `ρ` into the public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key_mut +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_serialize_public_key_mut_b6( + const Eurydice_arr_bb0 *t_as_ntt, + Eurydice_borrow_slice_u8 seed_for_a, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cpa_serialize_vector_68(t_as_ntt, + Eurydice_array_to_subslice_mut_d416(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U) + } + ))); + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f4(serialized, + libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U)), + seed_for_a, + uint8_t); +} + +/** + Concatenate `t` and `ρ` into the public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_5f +libcrux_ml_kem_ind_cpa_serialize_public_key_b6( + const Eurydice_arr_bb0 *t_as_ntt, + Eurydice_borrow_slice_u8 seed_for_a +) +{ + Eurydice_arr_5f public_key_serialized = { .data = { 0U } }; + libcrux_ml_kem_ind_cpa_serialize_public_key_mut_b6(t_as_ntt, + seed_for_a, + &public_key_serialized); + return public_key_serialized; +} + +/** + Serialize the secret key from the unpacked key pair generation. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_unpacked_secret_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PRIVATE_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline libcrux_ml_kem_utils_extraction_helper_Keypair768 +libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_30( + const libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_bb0 *private_key +) +{ + Eurydice_arr_5f + public_key_serialized = + libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&public_key->t_as_ntt, + Eurydice_array_to_slice_shared_01(&public_key->seed_for_A)); + Eurydice_arr_0e secret_key_serialized = { .data = { 0U } }; + libcrux_ml_kem_ind_cpa_serialize_vector_68(private_key, + Eurydice_array_to_slice_mut_f4(&secret_key_serialized)); + return + ( + KRML_CLITERAL(libcrux_ml_kem_utils_extraction_helper_Keypair768){ + .fst = secret_key_serialized, + .snd = public_key_serialized + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- PRIVATE_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_utils_extraction_helper_Keypair768 +libcrux_ml_kem_ind_cpa_generate_keypair_30(Eurydice_borrow_slice_u8 key_generation_seed) +{ + Eurydice_arr_bb0 private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_68(); + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(); + libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_39(key_generation_seed, + &private_key, + &public_key); + return libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_30(&public_key, &private_key); +} + +/** + Serialize the secret key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key_mut +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SERIALIZED_KEY_LEN= 2400 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_52( + Eurydice_borrow_slice_u8 private_key, + Eurydice_borrow_slice_u8 public_key, + Eurydice_borrow_slice_u8 implicit_rejection_value, + Eurydice_arr_7d *serialized +) +{ + size_t pointer = (size_t)0U; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d417(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = pointer, + .end = pointer + private_key.meta + } + )), + private_key, + uint8_t); + pointer += private_key.meta; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d417(serialized, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = pointer, .end = pointer + public_key.meta })), + public_key, + uint8_t); + pointer += public_key.meta; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_array_to_subslice_mut_d417(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = pointer, + .end = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + } + )); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_ec lvalue = libcrux_ml_kem_hash_functions_portable_H_4a_78(public_key); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_01(&lvalue), uint8_t); + pointer += LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d417(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = pointer, + .end = pointer + implicit_rejection_value.meta + } + )), + implicit_rejection_value, + uint8_t); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SERIALIZED_KEY_LEN= 2400 +*/ +static KRML_MUSTINLINE Eurydice_arr_7d +libcrux_ml_kem_ind_cca_serialize_kem_secret_key_52( + Eurydice_borrow_slice_u8 private_key, + Eurydice_borrow_slice_u8 public_key, + Eurydice_borrow_slice_u8 implicit_rejection_value +) +{ + Eurydice_arr_7d out = { .data = { 0U } }; + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_52(private_key, + public_key, + implicit_rejection_value, + &out); + return out; +} + +/** + Packed API + + Generate a key pair. + + Depending on the `Vector` and `Hasher` used, this requires different hardware + features +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_generate_keypair_b8(const Eurydice_arr_c7 *randomness) +{ + Eurydice_borrow_slice_u8 + ind_cpa_keypair_randomness = + Eurydice_array_to_subslice_shared_d47(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + } + )); + Eurydice_borrow_slice_u8 + implicit_rejection_value = + Eurydice_array_to_subslice_from_shared_5f1(randomness, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE); + libcrux_ml_kem_utils_extraction_helper_Keypair768 + uu____0 = libcrux_ml_kem_ind_cpa_generate_keypair_30(ind_cpa_keypair_randomness); + Eurydice_arr_0e ind_cpa_private_key = uu____0.fst; + Eurydice_arr_5f public_key = uu____0.snd; + Eurydice_arr_7d + secret_key_serialized = + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_52(Eurydice_array_to_slice_shared_f4(&ind_cpa_private_key), + Eurydice_array_to_slice_shared_ff(&public_key), + implicit_rejection_value); + Eurydice_arr_7d private_key = libcrux_ml_kem_types_from_b2_79(secret_key_serialized); + return + libcrux_ml_kem_types_from_17_bc(private_key, + libcrux_ml_kem_types_from_51_3d(public_key)); +} + +/** + Portable generate key pair. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_e9( + const Eurydice_arr_c7 *randomness +) +{ + return libcrux_ml_kem_ind_cca_generate_keypair_b8(randomness); +} + +/** + Generate ML-KEM 768 Key Pair +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_mlkem768_portable_generate_key_pair(Eurydice_arr_c7 randomness) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_e9(&randomness); +} + +/** + Validate an ML-KEM private key. + + This implements the Hash check in 7.3 3. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key_only +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_validate_private_key_only_52(const Eurydice_arr_7d *private_key) +{ + Eurydice_arr_ec + t = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_subslice_shared_d48(private_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)384U * (size_t)3U, + .end = (size_t)768U * (size_t)3U + (size_t)32U + } + ))); + Eurydice_borrow_slice_u8 + expected = + Eurydice_array_to_subslice_shared_d48(private_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)768U * (size_t)3U + (size_t)32U, + .end = (size_t)768U * (size_t)3U + (size_t)64U + } + )); + return Eurydice_array_eq_slice_shared((size_t)32U, &t, &expected, uint8_t, bool); +} + +/** + Validate an ML-KEM private key. + + This implements the Hash check in 7.3 3. + Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE` + and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_validate_private_key_ba( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *_ciphertext +) +{ + return libcrux_ml_kem_ind_cca_validate_private_key_only_52(private_key); +} + +/** + Private key validation +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_d3( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_validate_private_key_ba(private_key, ciphertext); +} + +/** + Validate a private key. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool +libcrux_ml_kem_mlkem768_portable_validate_private_key( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_d3(private_key, + ciphertext); +} + +/** + Private key validation +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key_only +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_3b( + const Eurydice_arr_7d *private_key +) +{ + return libcrux_ml_kem_ind_cca_validate_private_key_only_52(private_key); +} + +/** + Validate the private key only. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool +libcrux_ml_kem_mlkem768_portable_validate_private_key_only(const Eurydice_arr_7d *private_key) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_3b(private_key); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::serialize::deserialize_ring_elements_reduced_out::closure<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out.call_mut_0b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_68( + void **_, + size_t tupled_args +) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** + This function deserializes ring elements and reduces the result by the field + modulus. + + This function MUST NOT be used on secret inputs. +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_68( + Eurydice_borrow_slice_u8 public_key +) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_68(&lvalue, + i); + } + Eurydice_arr_bb0 deserialized_pk = arr_struct; + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68(public_key, &deserialized_pk); + return deserialized_pk; +} + +/** + Validate an ML-KEM public key. + + This implements the Modulus check in 7.2 2. + Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the + `public_key` type. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_validate_public_key_b6(const Eurydice_arr_5f *public_key) +{ + Eurydice_arr_bb0 + deserialized_pk = + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_68(Eurydice_array_to_subslice_to_shared_210(public_key, + libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U))); + Eurydice_arr_5f + public_key_serialized = + libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&deserialized_pk, + Eurydice_array_to_subslice_from_shared_5f2(public_key, + libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U))); + return Eurydice_array_eq((size_t)1184U, public_key, &public_key_serialized, uint8_t); +} + +/** + Public key validation +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_3b( + const Eurydice_arr_5f *public_key +) +{ + return libcrux_ml_kem_ind_cca_validate_public_key_b6(public_key); +} + +/** + Validate a public key. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool +libcrux_ml_kem_mlkem768_portable_validate_public_key(const Eurydice_arr_5f *public_key) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_3b(public_key); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPublicKeyUnpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51_s +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 ind_cpa_public_key; + Eurydice_arr_ec public_key_hash; +} +libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51; + +typedef libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768PublicKeyUnpacked; + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPrivateKeyUnpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51_s +{ + Eurydice_arr_bb0 ind_cpa_private_key; + Eurydice_arr_ec implicit_rejection_value; +} +libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51; + +typedef struct libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked_s +{ + libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51 private_key; + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 public_key; +} +libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked; + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.decapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cca_unpacked_decapsulate_0c( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_arr_ec + decrypted = + libcrux_ml_kem_ind_cpa_decrypt_unpacked_01(&key_pair->private_key.ind_cpa_private_key, + ciphertext); + Eurydice_arr_c7 + to_hash0 = + libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_array_to_slice_shared_01(&decrypted)); + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_array_to_subslice_from_mut_5f1(&to_hash0, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_slice_shared_01(&key_pair->public_key.public_key_hash), + uint8_t); + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash0)); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret = uu____1.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____1.snd; + Eurydice_arr_af + to_hash = + libcrux_ml_kem_utils_into_padded_array_66(Eurydice_array_to_slice_shared_01(&key_pair->private_key.implicit_rejection_value)); + Eurydice_mut_borrow_slice_u8 + uu____2 = + Eurydice_array_to_subslice_from_mut_5f2(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE); + Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_c1_52(ciphertext), uint8_t); + Eurydice_arr_ec + implicit_rejection_shared_secret = + libcrux_ml_kem_hash_functions_portable_PRF_4a_3b(Eurydice_array_to_slice_shared_81(&to_hash)); + Eurydice_arr_2b + expected_ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5(&key_pair->public_key.ind_cpa_public_key, + &decrypted, + pseudorandomness); + Eurydice_borrow_slice_u8 uu____3 = libcrux_ml_kem_types_as_ref_c1_52(ciphertext); + uint8_t + selector = + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(uu____3, + Eurydice_array_to_slice_shared_06(&expected_ciphertext)); + return + libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(shared_secret, + Eurydice_array_to_slice_shared_01(&implicit_rejection_shared_secret), + selector); +} + +/** + Unpacked decapsulate +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.decapsulate +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_19( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_unpacked_decapsulate_0c(key_pair, ciphertext); +} + +/** + Decapsulate ML-KEM 768 (unpacked) + + Generates an [`MlKemSharedSecret`]. + The input is a reference to an unpacked key pair of type [`MlKem768KeyPairUnpacked`] + and an [`MlKem768Ciphertext`]. +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_19(private_key, + ciphertext); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encaps_prepare +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static inline Eurydice_arr_c7 +libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_13( + Eurydice_borrow_slice_u8 randomness, + Eurydice_borrow_slice_u8 pk_hash +) +{ + Eurydice_arr_c7 to_hash = libcrux_ml_kem_utils_into_padded_array_c9(randomness); + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f1(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE), + pk_hash, + uint8_t); + return + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash)); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_f4 +libcrux_ml_kem_ind_cca_unpacked_encapsulate_a7( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_ec *randomness +) +{ + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_13(Eurydice_array_to_slice_shared_01(randomness), + Eurydice_array_to_slice_shared_01(&public_key->public_key_hash)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret = uu____0.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____0.snd; + Eurydice_arr_2b + ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5(&public_key->ind_cpa_public_key, + randomness, + pseudorandomness); + Eurydice_arr_ec shared_secret_array = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&shared_secret_array), + shared_secret, + uint8_t); + return + ( + KRML_CLITERAL(tuple_f4){ + .fst = libcrux_ml_kem_types_from_19_52(ciphertext), + .snd = shared_secret_array + } + ); +} + +/** + Unpacked encapsulate +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.encapsulate +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_f4 +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_26( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_ec *randomness +) +{ + return libcrux_ml_kem_ind_cca_unpacked_encapsulate_a7(public_key, randomness); +} + +/** + Encapsulate ML-KEM 768 (unpacked) + + Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. + The input is a reference to an unpacked public key of type [`MlKem768PublicKeyUnpacked`], + the SHA3-256 hash of this public key, and [`SHARED_SECRET_SIZE`] bytes of `randomness`. +*/ +static inline tuple_f4 +libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_26(public_key, + &randomness); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure::closure<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a.closure.call_mut_b4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_68( + void **_, + size_t tupled_args +) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), [libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@1]; K]> for libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a.call_mut_22 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_bb0 +libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_22_68(void **_, size_t tupled_args) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_68(&lvalue, + i); + } + return arr_struct; +} + +/** +This function found in impl {core::clone::Clone for libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, TraitClause@2]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.clone_c1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_polynomial_clone_c1_ea(const Eurydice_arr_9e *self) +{ + return + core_array__core__clone__Clone_for__T__N___clone((size_t)16U, + self, + Eurydice_arr_d6, + Eurydice_arr_9e); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_c10 +libcrux_ml_kem_ind_cca_unpacked_transpose_a_68(Eurydice_arr_c10 ind_cpa_a) +{ + Eurydice_arr_c10 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_22_68(&lvalue, i); + } + Eurydice_arr_c10 A = arr_struct; + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + Eurydice_arr_9e uu____0 = libcrux_ml_kem_polynomial_clone_c1_ea(&ind_cpa_a.data[j].data[i1]); + A.data[i1].data[j] = uu____0; + } + } + return A; +} + +/** + Generate Unpacked Keys +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_generate_keypair_b8( + Eurydice_arr_c7 randomness, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out +) +{ + Eurydice_borrow_slice_u8 + ind_cpa_keypair_randomness = + Eurydice_array_to_subslice_shared_d47(&randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + } + )); + Eurydice_borrow_slice_u8 + implicit_rejection_value = + Eurydice_array_to_subslice_from_shared_5f1(&randomness, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE); + libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_39(ind_cpa_keypair_randomness, + &out->private_key.ind_cpa_private_key, + &out->public_key.ind_cpa_public_key); + Eurydice_arr_c10 + A = libcrux_ml_kem_ind_cca_unpacked_transpose_a_68(out->public_key.ind_cpa_public_key.A); + out->public_key.ind_cpa_public_key.A = A; + Eurydice_arr_5f + pk_serialized = + libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&out->public_key.ind_cpa_public_key.t_as_ntt, + Eurydice_array_to_slice_shared_01(&out->public_key.ind_cpa_public_key.seed_for_A)); + Eurydice_arr_ec + uu____0 = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_slice_shared_ff(&pk_serialized)); + out->public_key.public_key_hash = uu____0; + Eurydice_arr_ec arr; + memcpy(arr.data, implicit_rejection_value.ptr, (size_t)32U * sizeof (uint8_t)); + Eurydice_arr_ec + uu____1 = + core_result_unwrap_26_39(( + KRML_CLITERAL(core_result_Result_07){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + out->private_key.implicit_rejection_value = uu____1; +} + +/** + Generate a key pair +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.generate_keypair +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_e9( + Eurydice_arr_c7 randomness, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out +) +{ + libcrux_ml_kem_ind_cca_unpacked_generate_keypair_b8(randomness, out); +} + +/** + Generate ML-KEM 768 Key Pair in "unpacked" form. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut( + Eurydice_arr_c7 randomness, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_e9(randomness, + key_pair); +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_30 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cca_unpacked_default_30_68(void) +{ + return + ( + KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51){ + .ind_cpa_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(), + .public_key_hash = { .data = { 0U } } + } + ); +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_7b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked +libcrux_ml_kem_ind_cca_unpacked_default_7b_68(void) +{ + libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51 + uu____0 = + { + .ind_cpa_private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_68(), + .implicit_rejection_value = { .data = { 0U } } + }; + return + ( + KRML_CLITERAL(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked){ + .private_key = uu____0, + .public_key = libcrux_ml_kem_ind_cca_unpacked_default_30_68() + } + ); +} + +/** + Generate ML-KEM 768 Key Pair in "unpacked" form. +*/ +static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked +libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair(Eurydice_arr_c7 randomness) +{ + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked + key_pair = libcrux_ml_kem_ind_cca_unpacked_default_7b_68(); + libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(randomness, &key_pair); + return key_pair; +} + +/** + Create a new, empty unpacked key. +*/ +static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked +libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void) +{ + return libcrux_ml_kem_ind_cca_unpacked_default_7b_68(); +} + +/** + Create a new, empty unpacked public key. +*/ +static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void) +{ + return libcrux_ml_kem_ind_cca_unpacked_default_30_68(); +} + +/** + Take a serialized private key and generate an unpacked key pair from it. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.keys_from_private_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_01( + const Eurydice_arr_7d *private_key, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + Eurydice_borrow_slice_u8_x4 + uu____0 = + libcrux_ml_kem_types_unpack_private_key_64(Eurydice_array_to_slice_shared_51(private_key)); + Eurydice_borrow_slice_u8 ind_cpa_secret_key = uu____0.fst; + Eurydice_borrow_slice_u8 ind_cpa_public_key = uu____0.snd; + Eurydice_borrow_slice_u8 ind_cpa_public_key_hash = uu____0.thd; + Eurydice_borrow_slice_u8 implicit_rejection_value = uu____0.f3; + libcrux_ml_kem_ind_cpa_deserialize_vector_68(ind_cpa_secret_key, + &key_pair->private_key.ind_cpa_private_key); + libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_05(ind_cpa_public_key, + &key_pair->public_key.ind_cpa_public_key); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&key_pair->public_key.public_key_hash), + ind_cpa_public_key_hash, + uint8_t); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&key_pair->private_key.implicit_rejection_value), + implicit_rejection_value, + uint8_t); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&key_pair->public_key.ind_cpa_public_key.seed_for_A), + Eurydice_slice_subslice_from_shared_6d(ind_cpa_public_key, (size_t)1152U), + uint8_t); +} + +/** + Take a serialized private key and generate an unpacked key pair from it. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.keypair_from_private_key +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_71( + const Eurydice_arr_7d *private_key, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_01(private_key, key_pair); +} + +/** + Get an unpacked key from a private key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut( + const Eurydice_arr_7d *private_key, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_71(private_key, + key_pair); +} + +/** + Get the serialized private key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_mut_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_21( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, + Eurydice_arr_7d *serialized +) +{ + libcrux_ml_kem_utils_extraction_helper_Keypair768 + uu____0 = + libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_30(&self->public_key.ind_cpa_public_key, + &self->private_key.ind_cpa_private_key); + Eurydice_arr_0e ind_cpa_private_key = uu____0.fst; + Eurydice_arr_5f ind_cpa_public_key = uu____0.snd; + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_52(Eurydice_array_to_slice_shared_f4(&ind_cpa_private_key), + Eurydice_array_to_slice_shared_ff(&ind_cpa_public_key), + Eurydice_array_to_slice_shared_01(&self->private_key.implicit_rejection_value), + serialized); +} + +/** + Get the serialized private key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_7d +libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_21( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self +) +{ + Eurydice_arr_7d sk = libcrux_ml_kem_types_default_d3_79(); + libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_21(self, &sk); + return sk; +} + +/** + Get the serialized private key. +*/ +static inline Eurydice_arr_7d +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + return libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_21(key_pair); +} + +/** + Get the serialized private key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + Eurydice_arr_7d *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_21(key_pair, serialized); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_dd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_5f +libcrux_ml_kem_ind_cca_unpacked_serialized_dd_b6( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *self +) +{ + return + libcrux_ml_kem_types_from_51_3d(libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&self->ind_cpa_public_key.t_as_ntt, + Eurydice_array_to_slice_shared_01(&self->ind_cpa_public_key.seed_for_A))); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_5f +libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_b6( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self +) +{ + return libcrux_ml_kem_ind_cca_unpacked_serialized_dd_b6(&self->public_key); +} + +/** + Get the serialized public key. +*/ +static inline Eurydice_arr_5f +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + return libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_b6(key_pair); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_mut_dd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_b6( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *self, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cpa_serialize_public_key_mut_b6(&self->ind_cpa_public_key.t_as_ntt, + Eurydice_array_to_slice_shared_01(&self->ind_cpa_public_key.seed_for_A), + serialized); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_mut_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_b6( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_b6(&self->public_key, serialized); +} + +/** + Get the serialized public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_b6(key_pair, serialized); +} + +/** +This function found in impl {core::clone::Clone for libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@2]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.clone_91 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cpa_unpacked_clone_91_68( + const libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *self +) +{ + Eurydice_arr_bb0 + uu____0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)3U, + &self->t_as_ntt, + Eurydice_arr_9e, + Eurydice_arr_bb0); + Eurydice_arr_ec + uu____1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)32U, + &self->seed_for_A, + uint8_t, + Eurydice_arr_ec); + return + ( + KRML_CLITERAL(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51){ + .t_as_ntt = uu____0, + .seed_for_A = uu____1, + .A = core_array__core__clone__Clone_for__T__N___clone((size_t)3U, + &self->A, + Eurydice_arr_bb0, + Eurydice_arr_c10) + } + ); +} + +/** +This function found in impl {core::clone::Clone for libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, K>[TraitClause@0, TraitClause@2]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.clone_d7 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cca_unpacked_clone_d7_68( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *self +) +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + uu____0 = libcrux_ml_kem_ind_cpa_unpacked_clone_91_68(&self->ind_cpa_public_key); + return + ( + KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51){ + .ind_cpa_public_key = uu____0, + .public_key_hash = core_array__core__clone__Clone_for__T__N___clone((size_t)32U, + &self->public_key_hash, + uint8_t, + Eurydice_arr_ec) + } + ); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, K>[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.public_key_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE const +libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +*libcrux_ml_kem_ind_cca_unpacked_public_key_11_68( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self +) +{ + return &self->public_key; +} + +/** + Get the unpacked public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_public_key( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *pk +) +{ + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 + uu____0 = + libcrux_ml_kem_ind_cca_unpacked_clone_d7_68(libcrux_ml_kem_ind_cca_unpacked_public_key_11_68(key_pair)); + pk[0U] = uu____0; +} + +/** + Get the serialized public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_b6(public_key, serialized); +} + +/** + Generate an unpacked key from a serialized key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.unpack_public_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_22( + const Eurydice_arr_5f *public_key, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *unpacked_public_key +) +{ + Eurydice_borrow_slice_u8 + uu____0 = Eurydice_array_to_subslice_to_shared_210(public_key, (size_t)1152U); + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68(uu____0, + &unpacked_public_key->ind_cpa_public_key.t_as_ntt); + unpacked_public_key->ind_cpa_public_key.seed_for_A = + libcrux_ml_kem_utils_into_padded_array_ce(Eurydice_array_to_subslice_from_shared_5f2(public_key, + (size_t)1152U)); + Eurydice_arr_c10 *uu____2 = &unpacked_public_key->ind_cpa_public_key.A; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_31 + lvalue = + libcrux_ml_kem_utils_into_padded_array_de(Eurydice_array_to_subslice_from_shared_5f2(public_key, + (size_t)1152U)); + libcrux_ml_kem_matrix_sample_matrix_A_91(uu____2, &lvalue, false); + Eurydice_arr_ec + uu____3 = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_slice_shared_ff(libcrux_ml_kem_types_as_slice_e6_3d(public_key))); + unpacked_public_key->public_key_hash = uu____3; +} + +/** + Get the unpacked public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.unpack_public_key +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_d3( + const Eurydice_arr_5f *public_key, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *unpacked_public_key +) +{ + libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_22(public_key, unpacked_public_key); +} + +/** + Get the unpacked public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key( + const Eurydice_arr_5f *public_key, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *unpacked_public_key +) +{ + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_d3(public_key, + unpacked_public_key); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mlkem768_portable_H_DEFINED +#endif /* libcrux_mlkem768_portable_H */ + + +/* rename some types to be a bit more ergonomic */ + +/* ML-KEM 768 */ +typedef Eurydice_arr_c7 libcrux_mlkem768_keypair_rnd; +typedef Eurydice_arr_ec libcrux_mlkem768_enc_rnd; +typedef libcrux_ml_kem_mlkem768_MlKem768KeyPair libcrux_mlkem768_keypair; +typedef Eurydice_arr_5f libcrux_mlkem768_pk; +typedef Eurydice_arr_7d libcrux_mlkem768_sk; +typedef Eurydice_arr_2b libcrux_mlkem768_ciphertext; +typedef tuple_f4 libcrux_mlkem768_enc_result; +typedef Eurydice_arr_ec libcrux_mlkem768_dec_result; +/* ML-DSA 44 */ +typedef Eurydice_arr_ec libcrux_mldsa44_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair + libcrux_mldsa44_keypair; +typedef Eurydice_arr_10 libcrux_mldsa44_sk; +typedef Eurydice_arr_02 libcrux_mldsa44_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa44_message; +typedef Eurydice_arr_ec libcrux_mldsa44_sign_rnd; +typedef core_result_Result_48 libcrux_mldsa44_sign_result; +typedef core_result_Result_41 libcrux_mldsa44_verify_result; +typedef Eurydice_arr_85 libcrux_mldsa44_signature; +/* ML-DSA 65 */ +typedef Eurydice_arr_ec libcrux_mldsa65_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair + libcrux_mldsa65_keypair; +typedef Eurydice_arr_24 libcrux_mldsa65_sk; +typedef Eurydice_arr_29 libcrux_mldsa65_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa65_message; +typedef Eurydice_arr_ec libcrux_mldsa65_sign_rnd; +typedef core_result_Result_8c libcrux_mldsa65_sign_result; +typedef core_result_Result_41 libcrux_mldsa65_verify_result; +typedef Eurydice_arr_0c libcrux_mldsa65_signature; +/* ML-DSA 87 */ +typedef Eurydice_arr_ec libcrux_mldsa87_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair + libcrux_mldsa87_keypair; +typedef Eurydice_arr_e2 libcrux_mldsa87_sk; +typedef Eurydice_arr_43 libcrux_mldsa87_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa87_message; +typedef Eurydice_arr_ec libcrux_mldsa87_sign_rnd; +typedef core_result_Result_8b libcrux_mldsa87_sign_result; +typedef core_result_Result_41 libcrux_mldsa87_verify_result; +typedef Eurydice_arr_93 libcrux_mldsa87_signature; + +#define LIBCRUX_RESULT_OK core_result_Ok + diff --git a/libcrux_mlkem768_sha3.h b/libcrux_mlkem768_sha3.h deleted file mode 100644 index 1e3dc45744d2..000000000000 --- a/libcrux_mlkem768_sha3.h +++ /dev/null @@ -1,11752 +0,0 @@ -/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.4 2025/11/13 05:13:06 djm Exp $ */ - -/* Extracted from libcrux revision 026a87ab6d88ad3626b9fbbf3710d1e0483c1849 */ - -/* - * MIT License - * - * Copyright (c) 2024 Cryspen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#if !defined(__GNUC__) || (__GNUC__ < 2) -# define __attribute__(x) -#endif -#define KRML_MUSTINLINE inline -#define KRML_NOINLINE __attribute__((noinline, unused)) -#define KRML_HOST_EPRINTF(...) -#define KRML_HOST_EXIT(x) fatal_f("internal error") - -static inline void -store64_le(uint8_t dst[8], uint64_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; - dst[4] = (src >> 32) & 0xff; - dst[5] = (src >> 40) & 0xff; - dst[6] = (src >> 48) & 0xff; - dst[7] = (src >> 56) & 0xff; -} - -static inline void -store32_le(uint8_t dst[4], uint32_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; -} - -static inline void -store32_be(uint8_t dst[4], uint32_t src) -{ - dst[0] = (src >> 24) & 0xff; - dst[1] = (src >> 16) & 0xff; - dst[2] = (src >> 8) & 0xff; - dst[3] = src & 0xff; -} - -static inline uint64_t -load64_le(uint8_t src[8]) -{ - return (uint64_t)(src[0]) | - ((uint64_t)(src[1]) << 8) | - ((uint64_t)(src[2]) << 16) | - ((uint64_t)(src[3]) << 24) | - ((uint64_t)(src[4]) << 32) | - ((uint64_t)(src[5]) << 40) | - ((uint64_t)(src[6]) << 48) | - ((uint64_t)(src[7]) << 56); -} - -static inline uint32_t -load32_le(uint8_t src[4]) -{ - return (uint32_t)(src[0]) | - ((uint32_t)(src[1]) << 8) | - ((uint32_t)(src[2]) << 16) | - ((uint32_t)(src[3]) << 24); -} - -#ifdef MISSING_BUILTIN_POPCOUNT -static inline unsigned int -__builtin_popcount(unsigned int num) -{ - const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; - return v[num & 0xf] + v[(num >> 4) & 0xf]; -} -#endif - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/eurydice_glue.h */ -#pragma once - - -#ifdef _MSC_VER -// For __popcnt -#endif - - -// C++ HELPERS - -#if defined(__cplusplus) - -#ifndef KRML_HOST_EPRINTF -#define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__) -#endif - - -#ifndef __cpp_lib_type_identity -template <class T> -struct type_identity { - using type = T; -}; - -template <class T> -using type_identity_t = typename type_identity<T>::type; -#else -using std::type_identity_t; -#endif - -#define KRML_UNION_CONSTRUCTOR(T) \ - template <typename V> \ - constexpr T(int t, V U::*m, type_identity_t<V> v) : tag(t) { \ - val.*m = std::move(v); \ - } \ - T() = default; - -#endif - -// GENERAL-PURPOSE STUFF - -#define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e) - -#define EURYDICE_ASSERT(test, msg) \ - do { \ - if (!(test)) { \ - fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \ - __FILE__, __LINE__); \ - exit(255); \ - } \ - } while (0) - -// SLICES, ARRAYS, ETC. - -// We represent a slice as a pair of an (untyped) pointer, along with the length -// of the slice, i.e. the number of elements in the slice (this is NOT the -// number of bytes). This design choice has two important consequences. -// - if you need to use `ptr`, you MUST cast it to a proper type *before* -// performing pointer arithmetic on it (remember that C desugars pointer -// arithmetic based on the type of the address) -// - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you -// need to multiply it by sizeof t, where t is the type of the elements. -// -// Empty slices have `len == 0` and `ptr` always needs to be a valid pointer -// that is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL -// + start`). -typedef struct { - void *ptr; - size_t len; -} Eurydice_slice; - -#if defined(__cplusplus) -#define KRML_CLITERAL(type) type -#else -#define KRML_CLITERAL(type) (type) -#endif - -#if defined(__cplusplus) && defined(__cpp_designated_initializers) || \ - !(defined(__cplusplus)) -#define EURYDICE_CFIELD(X) X -#else -#define EURYDICE_CFIELD(X) -#endif - -// Helper macro to create a slice out of a pointer x, a start index in x -// (included), and an end index in x (excluded). The argument x must be suitably -// cast to something that can decay (see remark above about how pointer -// arithmetic works in C), meaning either pointer or array type. -#define EURYDICE_SLICE(x, start, end) \ - (KRML_CLITERAL(Eurydice_slice){(void *)(x + start), end - start}) - -// Slice length -#define EURYDICE_SLICE_LEN(s, _) (s).len -#define Eurydice_slice_len(s, _) (s).len - -// This macro is a pain because in case the dereferenced element type is an -// array, you cannot simply write `t x` as it would yield `int[4] x` instead, -// which is NOT correct C syntax, so we add a dedicated phase in Eurydice that -// adds an extra argument to this macro at the last minute so that we have the -// correct type of *pointers* to elements. -#define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i]) - -// The following functions get sub slices from a slice. - -#define Eurydice_slice_subslice(s, r, t, _0, _1) \ - EURYDICE_SLICE((t *)s.ptr, r.start, r.end) - -// Variant for when the start and end indices are statically known (i.e., the -// range argument `r` is a literal). -#define Eurydice_slice_subslice2(s, start, end, t) \ - EURYDICE_SLICE((t *)s.ptr, (start), (end)) - -// Previous version above does not work when t is an array type (as usual). Will -// be deprecated soon. -#define Eurydice_slice_subslice3(s, start, end, t_ptr) \ - EURYDICE_SLICE((t_ptr)s.ptr, (start), (end)) - -#define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _0, _1) \ - EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos) - -#define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _0, _1) \ - EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len) - -#define Eurydice_array_to_slice(end, x, t) \ - EURYDICE_SLICE(x, 0, \ - end) /* x is already at an array type, no need for cast */ -#define Eurydice_array_to_subslice(_arraylen, x, r, t, _0, _1) \ - EURYDICE_SLICE((t *)x, r.start, r.end) - -// Same as above, variant for when start and end are statically known -#define Eurydice_array_to_subslice2(x, start, end, t) \ - EURYDICE_SLICE((t *)x, (start), (end)) - -// Same as above, variant for when start and end are statically known -#define Eurydice_array_to_subslice3(x, start, end, t_ptr) \ - EURYDICE_SLICE((t_ptr)x, (start), (end)) - -#define Eurydice_array_repeat(dst, len, init, t) \ - ERROR "should've been desugared" - -// The following functions convert an array into a slice. - -#define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t, _0) \ - EURYDICE_SLICE((t *)x, 0, r) -#define Eurydice_array_to_subslice_from(size, x, r, t, _range_t, _0) \ - EURYDICE_SLICE((t *)x, r, size) - -// Copy a slice with memcopy -#define Eurydice_slice_copy(dst, src, t) \ - memcpy(dst.ptr, src.ptr, dst.len * sizeof(t)) - -#define core_array___Array_T__N___as_slice(len_, ptr_, t, _ret_t) \ - KRML_CLITERAL(Eurydice_slice) { ptr_, len_ } - -#define core_array__core__clone__Clone_for__Array_T__N___clone( \ - len, src, dst, elem_type, _ret_t) \ - (memcpy(dst, src, len * sizeof(elem_type))) -#define TryFromSliceError uint8_t -#define core_array_TryFromSliceError uint8_t - -#define Eurydice_array_eq(sz, a1, a2, t) (memcmp(a1, a2, sz * sizeof(t)) == 0) - -// core::cmp::PartialEq<&0 (@Slice<U>)> for @Array<T, N> -#define Eurydice_array_eq_slice(sz, a1, s2, t, _) \ - (memcmp(a1, (s2)->ptr, sz * sizeof(t)) == 0) - -#define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \ - sz, a1, a2, t, _, _ret_t) \ - Eurydice_array_eq(sz, a1, a2, t, _) -#define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \ - sz, a1, a2, t, _, _ret_t) \ - Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _) - -#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \ - KRML_CLITERAL(ret_t) { \ - EURYDICE_CFIELD(.fst =) \ - EURYDICE_SLICE((element_type *)(slice).ptr, 0, mid), \ - EURYDICE_CFIELD(.snd =) \ - EURYDICE_SLICE((element_type *)(slice).ptr, mid, (slice).len) \ - } - -#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \ - KRML_CLITERAL(ret_t) { \ - EURYDICE_CFIELD(.fst =) \ - KRML_CLITERAL(Eurydice_slice){EURYDICE_CFIELD(.ptr =)(slice.ptr), \ - EURYDICE_CFIELD(.len =) mid}, \ - EURYDICE_CFIELD(.snd =) KRML_CLITERAL(Eurydice_slice) { \ - EURYDICE_CFIELD(.ptr =) \ - ((char *)slice.ptr + mid * sizeof(element_type)), \ - EURYDICE_CFIELD(.len =)(slice.len - mid) \ - } \ - } - -// Conversion of slice to an array, rewritten (by Eurydice) to name the -// destination array, since arrays are not values in C. -// N.B.: see note in karamel/lib/Inlining.ml if you change this. -#define Eurydice_slice_to_array2(dst, src, _0, t_arr, _1) \ - Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \ - sizeof(t_arr)) - -static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok, - Eurydice_slice src, size_t sz) { - *dst_tag = 0; - memcpy(dst_ok, src.ptr, sz); -} - -// SUPPORT FOR DSTs (Dynamically-Sized Types) - -// A DST is a fat pointer that keeps tracks of the size of it flexible array -// member. Slices are a specific case of DSTs, where [T; N] implements -// Unsize<[T]>, meaning an array of statically known size can be converted to a -// fat pointer, i.e. a slice. -// -// Unlike slices, DSTs have a built-in definition that gets monomorphized, of -// the form: -// -// typedef struct { -// T *ptr; -// size_t len; // number of elements -// } Eurydice_dst; -// -// Furthermore, T = T0<[U0]> where `struct T0<U: ?Sized>`, where the `U` is the -// last field. This means that there are two monomorphizations of T0 in the -// program. One is `T0<[V; N]>` -// -- this is directly converted to a Eurydice_dst via suitable codegen (no -// macro). The other is `T = T0<[U]>`, where `[U]` gets emitted to -// `Eurydice_derefed_slice`, a type that only appears in that precise situation -// and is thus defined to give rise to a flexible array member. - -typedef char Eurydice_derefed_slice[]; - -#define Eurydice_slice_of_dst(fam_ptr, len_, t, _) \ - ((Eurydice_slice){.ptr = (void *)(fam_ptr), .len = len_}) - -#define Eurydice_slice_of_boxed_array(ptr_, len_, t, _) \ - ((Eurydice_slice){.ptr = (void *)(ptr_), .len = len_}) - -// CORE STUFF (conversions, endianness, ...) - -// We slap extern "C" on declarations that intend to implement a prototype -// generated by Eurydice, because Eurydice prototypes are always emitted within -// an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must -// pass -DKRML_CXX17_COMPAT="" to your C++ compiler. -#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) -extern "C" { -#endif - -static inline void core_num__u32__to_be_bytes(uint32_t src, uint8_t dst[4]) { - store32_be(dst, src); -} - -static inline void core_num__u32__to_le_bytes(uint32_t src, uint8_t dst[4]) { - store32_le(dst, src); -} - -static inline uint32_t core_num__u32__from_le_bytes(uint8_t buf[4]) { - return load32_le(buf); -} - -static inline void core_num__u64__to_le_bytes(uint64_t v, uint8_t buf[8]) { - store64_le(buf, v); -} - -static inline uint64_t core_num__u64__from_le_bytes(uint8_t buf[8]) { - return load64_le(buf); -} - -static inline int64_t core_convert_num___core__convert__From_i32__for_i64__from( - int32_t x) { - return x; -} - -static inline uint64_t core_convert_num___core__convert__From_u8__for_u64__from( - uint8_t x) { - return x; -} - -static inline uint64_t -core_convert_num___core__convert__From_u16__for_u64__from(uint16_t x) { - return x; -} - -static inline size_t -core_convert_num___core__convert__From_u16__for_usize__from(uint16_t x) { - return x; -} - -static inline uint32_t core_num__u8__count_ones(uint8_t x0) { -#ifdef _MSC_VER - return __popcnt(x0); -#else - return __builtin_popcount(x0); -#endif -} - -static inline uint32_t core_num__i32__count_ones(int32_t x0) { -#ifdef _MSC_VER - return __popcnt(x0); -#else - return __builtin_popcount(x0); -#endif -} - -static inline size_t core_cmp_impls___core__cmp__Ord_for_usize__min(size_t a, - size_t b) { - if (a <= b) - return a; - else - return b; -} - -// unsigned overflow wraparound semantics in C -static inline uint16_t core_num__u16__wrapping_add(uint16_t x, uint16_t y) { - return x + y; -} -static inline uint8_t core_num__u8__wrapping_sub(uint8_t x, uint8_t y) { - return x - y; -} -static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1) { - return (x0 << x1 | x0 >> (64 - x1)); -} - -static inline void core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1) { - *x0 = *x0 + *x1; -} - -static inline uint8_t Eurydice_bitand_pv_u8(uint8_t *p, uint8_t v) { - return (*p) & v; -} -static inline uint8_t Eurydice_shr_pv_u8(uint8_t *p, int32_t v) { - return (*p) >> v; -} -static inline uint32_t Eurydice_min_u32(uint32_t x, uint32_t y) { - return x < y ? x : y; -} - -static inline uint8_t -core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand( - uint8_t *x0, uint8_t x1) { - return Eurydice_bitand_pv_u8(x0, x1); -} - -static inline uint8_t -core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr(uint8_t *x0, - int32_t x1) { - return Eurydice_shr_pv_u8(x0, x1); -} - -#define core_num_nonzero_private_NonZeroUsizeInner size_t -static inline core_num_nonzero_private_NonZeroUsizeInner -core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone( - core_num_nonzero_private_NonZeroUsizeInner *x0) { - return *x0; -} - -#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) -} -#endif - -// ITERATORS - -#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \ - (((iter_ptr)->start >= (iter_ptr)->end) \ - ? (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 0, \ - EURYDICE_CFIELD(.f0 =) 0}) \ - : (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 1, \ - EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++})) - -#define core_iter_range___core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___6__next \ - Eurydice_range_iter_next - -// See note in karamel/lib/Inlining.ml if you change this -#define Eurydice_into_iter(x, t, _ret_t, _) (x) -#define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__1__into_iter \ - Eurydice_into_iter - -typedef struct { - Eurydice_slice slice; - size_t chunk_size; -} Eurydice_chunks; - -// Can't use macros Eurydice_slice_subslice_{to,from} because they require a -// type, and this static inline function cannot receive a type as an argument. -// Instead, we receive the element size and use it to peform manual offset -// computations rather than going through the macros. -static inline Eurydice_slice chunk_next(Eurydice_chunks *chunks, - size_t element_size) { - size_t chunk_size = chunks->slice.len >= chunks->chunk_size - ? chunks->chunk_size - : chunks->slice.len; - Eurydice_slice curr_chunk; - curr_chunk.ptr = chunks->slice.ptr; - curr_chunk.len = chunk_size; - chunks->slice.ptr = (char *)(chunks->slice.ptr) + chunk_size * element_size; - chunks->slice.len = chunks->slice.len - chunk_size; - return curr_chunk; -} - -#define core_slice___Slice_T___chunks(slice_, sz_, t, _ret_t) \ - ((Eurydice_chunks){.slice = slice_, .chunk_size = sz_}) -#define core_slice___Slice_T___chunks_exact(slice_, sz_, t, _ret_t) \ - ((Eurydice_chunks){ \ - .slice = {.ptr = slice_.ptr, .len = slice_.len - (slice_.len % sz_)}, \ - .chunk_size = sz_}) -#define core_slice_iter_Chunks Eurydice_chunks -#define core_slice_iter_ChunksExact Eurydice_chunks -#define Eurydice_chunks_next(iter, t, ret_t) \ - (((iter)->slice.len == 0) ? ((ret_t){.tag = core_option_None}) \ - : ((ret_t){.tag = core_option_Some, \ - .f0 = chunk_next(iter, sizeof(t))})) -#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___70__next \ - Eurydice_chunks_next -// This name changed on 20240627 -#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___71__next \ - Eurydice_chunks_next -#define core_slice_iter__core__slice__iter__ChunksExact__a__T__89__next( \ - iter, t, _ret_t) \ - core_slice_iter__core__slice__iter__Chunks__a__T__70__next(iter, t) - -typedef struct { - Eurydice_slice s; - size_t index; -} Eurydice_slice_iterator; - -#define core_slice___Slice_T___iter(x, t, _ret_t) \ - ((Eurydice_slice_iterator){.s = x, .index = 0}) -#define core_slice_iter_Iter Eurydice_slice_iterator -#define core_slice_iter__core__slice__iter__Iter__a__T__181__next(iter, t, \ - ret_t) \ - (((iter)->index == (iter)->s.len) \ - ? (KRML_CLITERAL(ret_t){.tag = core_option_None}) \ - : (KRML_CLITERAL(ret_t){ \ - .tag = core_option_Some, \ - .f0 = ((iter)->index++, \ - &((t *)((iter)->s.ptr))[(iter)->index - 1])})) -#define core_option__core__option__Option_T__TraitClause_0___is_some(X, _0, \ - _1) \ - ((X)->tag == 1) -// STRINGS - -typedef const char *Prims_string; - -// MISC (UNTESTED) - -typedef void *core_fmt_Formatter; -typedef void *core_fmt_Arguments; -typedef void *core_fmt_rt_Argument; -#define core_fmt_rt__core__fmt__rt__Argument__a__1__new_display(x1, x2, x3, \ - x4) \ - NULL - -// BOXES - -// Crimes. -static inline char *malloc_and_init(size_t sz, char *init) { - char *ptr = (char *)malloc(sz); - memcpy(ptr, init, sz); - return ptr; -} - -#define Eurydice_box_new(init, t, t_dst) \ - ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init)))) - -#define Eurydice_box_new_array(len, ptr, t, t_dst) \ - ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr)))) - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem_core.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_mlkem_core_H -#define libcrux_mlkem_core_H - - -#if defined(__cplusplus) -extern "C" { -#endif - -/** -A monomorphic instance of core.ops.range.Range -with types size_t - -*/ -typedef struct core_ops_range_Range_08_s { - size_t start; - size_t end; -} core_ops_range_Range_08; - -static inline uint16_t core_num__u16__wrapping_add(uint16_t x0, uint16_t x1); - -static inline uint64_t core_num__u64__from_le_bytes(uint8_t x0[8U]); - -static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1); - -static inline void core_num__u64__to_le_bytes(uint64_t x0, uint8_t x1[8U]); - -static inline uint32_t core_num__u8__count_ones(uint8_t x0); - -static inline uint8_t core_num__u8__wrapping_sub(uint8_t x0, uint8_t x1); - -#define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U) - -#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U) - -#define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) - -#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT \ - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U) - -#define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT \ - (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U) - -#define LIBCRUX_ML_KEM_CONSTANTS_G_DIGEST_SIZE ((size_t)64U) - -#define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U) - -/** - K * BITS_PER_RING_ELEMENT / 8 - - [eurydice] Note that we can't use const generics here because that breaks - C extraction with eurydice. -*/ -static inline size_t libcrux_ml_kem_constants_ranked_bytes_per_ring_element( - size_t rank) { - return rank * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U; -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint8_t - -*/ -static KRML_MUSTINLINE uint8_t -libcrux_secrets_int_public_integers_classify_27_90(uint8_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types int16_t - -*/ -static KRML_MUSTINLINE int16_t -libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE uint8_t libcrux_secrets_int_as_u8_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_90( - (uint8_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types int16_t - -*/ -static KRML_MUSTINLINE int16_t -libcrux_secrets_int_public_integers_classify_27_39(int16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t - -*/ -static KRML_MUSTINLINE uint8_t -libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u8} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_59(uint8_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_90(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types int32_t - -*/ -static KRML_MUSTINLINE int32_t -libcrux_secrets_int_public_integers_classify_27_a8(int32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_a8( - (int32_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types int32_t - -*/ -static KRML_MUSTINLINE int32_t -libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i32} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_36(int32_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_a8(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint32_t - -*/ -static KRML_MUSTINLINE uint32_t -libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u32} -*/ -static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_b8(uint32_t self) { - return libcrux_secrets_int_public_integers_classify_27_a8( - (int32_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint16_t - -*/ -static KRML_MUSTINLINE uint16_t -libcrux_secrets_int_public_integers_classify_27_de(uint16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE uint16_t libcrux_secrets_int_as_u16_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_de( - (uint16_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint16_t - -*/ -static KRML_MUSTINLINE uint16_t -libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u16} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_ca(uint16_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint64_t - -*/ -static KRML_MUSTINLINE uint64_t -libcrux_secrets_int_public_integers_classify_27_49(uint64_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u16} -*/ -static KRML_MUSTINLINE uint64_t libcrux_secrets_int_as_u64_ca(uint16_t self) { - return libcrux_secrets_int_public_integers_classify_27_49( - (uint64_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint32_t - -*/ -static KRML_MUSTINLINE uint32_t -libcrux_secrets_int_public_integers_classify_27_df(uint32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint64_t - -*/ -static KRML_MUSTINLINE uint64_t -libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u64} -*/ -static KRML_MUSTINLINE uint32_t libcrux_secrets_int_as_u32_a3(uint64_t self) { - return libcrux_secrets_int_public_integers_classify_27_df( - (uint32_t)libcrux_secrets_int_public_integers_declassify_d8_49(self)); -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u32} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_b8(uint32_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s { - uint8_t fst[1152U]; - uint8_t snd[1184U]; -} libcrux_ml_kem_utils_extraction_helper_Keypair768; - -#define Ok 0 -#define Err 1 - -typedef uint8_t Result_b2_tags; - -/** -A monomorphic instance of core.result.Result -with types uint8_t[24size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_b2_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[24U]; - TryFromSliceError case_Err; - } val; -} Result_b2; - -/** -This function found in impl {core::result::Result<T, E>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[24size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_70(Result_b2 self, uint8_t ret[24U]) { - if (self.tag == Ok) { - uint8_t f0[24U]; - memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)24U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -/** -A monomorphic instance of core.result.Result -with types uint8_t[20size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_e1_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[20U]; - TryFromSliceError case_Err; - } val; -} Result_e1; - -/** -This function found in impl {core::result::Result<T, E>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[20size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_20(Result_e1 self, uint8_t ret[20U]) { - if (self.tag == Ok) { - uint8_t f0[20U]; - memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)20U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 32 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_9e( - Eurydice_slice slice, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey -with const generics -- $2400size_t -*/ -typedef struct libcrux_ml_kem_types_MlKemPrivateKey_d9_s { - uint8_t value[2400U]; -} libcrux_ml_kem_types_MlKemPrivateKey_d9; - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::types::MlKemPrivateKey<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.default_d3 -with const generics -- SIZE= 2400 -*/ -static inline libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_types_default_d3_28(void) { - return ( - KRML_CLITERAL(libcrux_ml_kem_types_MlKemPrivateKey_d9){.value = {0U}}); -} - -/** -A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey -with const generics -- $1184size_t -*/ -typedef struct libcrux_ml_kem_types_MlKemPublicKey_30_s { - uint8_t value[1184U]; -} libcrux_ml_kem_types_MlKemPublicKey_30; - -/** -This function found in impl {core::convert::From<@Array<u8, SIZE>> for -libcrux_ml_kem::types::MlKemPublicKey<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_fd -with const generics -- SIZE= 1184 -*/ -static inline libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_types_from_fd_d0(uint8_t value[1184U]) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_value[1184U]; - memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t)); - libcrux_ml_kem_types_MlKemPublicKey_30 lit; - memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t)); - return lit; -} - -typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s { - libcrux_ml_kem_types_MlKemPrivateKey_d9 sk; - libcrux_ml_kem_types_MlKemPublicKey_30 pk; -} libcrux_ml_kem_mlkem768_MlKem768KeyPair; - -/** -This function found in impl -{libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_17 -with const generics -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_types_from_17_74(libcrux_ml_kem_types_MlKemPrivateKey_d9 sk, - libcrux_ml_kem_types_MlKemPublicKey_30 pk) { - return (KRML_CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk, - .pk = pk}); -} - -/** -This function found in impl {core::convert::From<@Array<u8, SIZE>> for -libcrux_ml_kem::types::MlKemPrivateKey<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_77 -with const generics -- SIZE= 2400 -*/ -static inline libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_types_from_77_28(uint8_t value[2400U]) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_value[2400U]; - memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t)); - libcrux_ml_kem_types_MlKemPrivateKey_d9 lit; - memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t)); - return lit; -} - -/** -A monomorphic instance of core.result.Result -with types uint8_t[32size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_fb_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[32U]; - TryFromSliceError case_Err; - } val; -} Result_fb; - -/** -This function found in impl {core::result::Result<T, E>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[32size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_b3(Result_fb self, uint8_t ret[32U]) { - if (self.tag == Ok) { - uint8_t f0[32U]; - memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)32U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s { - uint8_t value[1088U]; -} libcrux_ml_kem_mlkem768_MlKem768Ciphertext; - -/** -A monomorphic instance of K. -with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]], -uint8_t[32size_t] - -*/ -typedef struct tuple_c2_s { - libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst; - uint8_t snd[32U]; -} tuple_c2; - -/** -This function found in impl {core::convert::From<@Array<u8, SIZE>> for -libcrux_ml_kem::types::MlKemCiphertext<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_e0 -with const generics -- SIZE= 1088 -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext -libcrux_ml_kem_types_from_e0_80(uint8_t value[1088U]) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_value[1088U]; - memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t)); - libcrux_ml_kem_mlkem768_MlKem768Ciphertext lit; - memcpy(lit.value, copy_of_value, (size_t)1088U * sizeof(uint8_t)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.as_slice_e6 -with const generics -- SIZE= 1184 -*/ -static inline uint8_t *libcrux_ml_kem_types_as_slice_e6_d0( - libcrux_ml_kem_types_MlKemPublicKey_30 *self) { - return self->value; -} - -/** -This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.as_slice_a9 -with const generics -- SIZE= 1088 -*/ -static inline uint8_t *libcrux_ml_kem_types_as_slice_a9_80( - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) { - return self->value; -} - -/** -A monomorphic instance of libcrux_ml_kem.utils.prf_input_inc -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE uint8_t libcrux_ml_kem_utils_prf_input_inc_e0( - uint8_t (*prf_inputs)[33U], uint8_t domain_separator) { - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - prf_inputs[i0][32U] = domain_separator; - domain_separator = (uint32_t)domain_separator + 1U; - } - return domain_separator; -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 33 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_c8( - Eurydice_slice slice, uint8_t ret[33U]) { - uint8_t out[33U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)33U * sizeof(uint8_t)); -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 34 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_b6( - Eurydice_slice slice, uint8_t ret[34U]) { - uint8_t out[34U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)34U * sizeof(uint8_t)); -} - -/** -This function found in impl {core::convert::AsRef<@Slice<u8>> for -libcrux_ml_kem::types::MlKemCiphertext<SIZE>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.as_ref_d3 -with const generics -- SIZE= 1088 -*/ -static inline Eurydice_slice libcrux_ml_kem_types_as_ref_d3_80( - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) { - return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t); -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 1120 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_15( - Eurydice_slice slice, uint8_t ret[1120U]) { - uint8_t out[1120U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)1120U * sizeof(uint8_t)); -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 64 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_slice slice, uint8_t ret[64U]) { - uint8_t out[64U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)64U * sizeof(uint8_t)); -} - -typedef struct Eurydice_slice_uint8_t_x4_s { - Eurydice_slice fst; - Eurydice_slice snd; - Eurydice_slice thd; - Eurydice_slice f3; -} Eurydice_slice_uint8_t_x4; - -typedef struct Eurydice_slice_uint8_t_x2_s { - Eurydice_slice fst; - Eurydice_slice snd; -} Eurydice_slice_uint8_t_x2; - -/** - Unpack an incoming private key into it's different parts. - - We have this here in types to extract into a common core for C. -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.unpack_private_key -with const generics -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static inline Eurydice_slice_uint8_t_x4 -libcrux_ml_kem_types_unpack_private_key_b4(Eurydice_slice private_key) { - Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( - private_key, (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2); - Eurydice_slice ind_cpa_secret_key = uu____0.fst; - Eurydice_slice secret_key0 = uu____0.snd; - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2); - Eurydice_slice ind_cpa_public_key = uu____1.fst; - Eurydice_slice secret_key = uu____1.snd; - Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at( - secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice ind_cpa_public_key_hash = uu____2.fst; - Eurydice_slice implicit_rejection_value = uu____2.snd; - return ( - KRML_CLITERAL(Eurydice_slice_uint8_t_x4){.fst = ind_cpa_secret_key, - .snd = ind_cpa_public_key, - .thd = ind_cpa_public_key_hash, - .f3 = implicit_rejection_value}); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[24size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_d2(uint8_t self[24U], - uint8_t ret[24U]) { - memcpy(ret, self, (size_t)24U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[20size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_57(uint8_t self[20U], - uint8_t ret[20U]) { - memcpy(ret, self, (size_t)20U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[8size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_76(uint8_t self[8U], - uint8_t ret[8U]) { - memcpy(ret, self, (size_t)8U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[2size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_d4(uint8_t self[2U], - uint8_t ret[2U]) { - memcpy(ret, self, (size_t)2U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify<T> for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types int16_t[16size_t] - -*/ -static KRML_MUSTINLINE void libcrux_secrets_int_public_integers_classify_27_46( - int16_t self[16U], int16_t ret[16U]) { - memcpy(ret, self, (size_t)16U * sizeof(int16_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a -(@Slice<T>)> for &'a (@Slice<T>)} -*/ -/** -A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b -with types uint8_t - -*/ -static KRML_MUSTINLINE Eurydice_slice -libcrux_secrets_int_classify_public_classify_ref_9b_90(Eurydice_slice self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a -(@Slice<T>)> for &'a (@Slice<T>)} -*/ -/** -A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b -with types int16_t - -*/ -static KRML_MUSTINLINE Eurydice_slice -libcrux_secrets_int_classify_public_classify_ref_9b_39(Eurydice_slice self) { - return self; -} - -/** -A monomorphic instance of core.result.Result -with types int16_t[16size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_0a_s { - Result_b2_tags tag; - union { - int16_t case_Ok[16U]; - TryFromSliceError case_Err; - } val; -} Result_0a; - -/** -This function found in impl {core::result::Result<T, E>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types int16_t[16size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_00(Result_0a self, int16_t ret[16U]) { - if (self.tag == Ok) { - int16_t f0[16U]; - memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t)); - memcpy(ret, f0, (size_t)16U * sizeof(int16_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -/** -A monomorphic instance of core.result.Result -with types uint8_t[8size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_15_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[8U]; - TryFromSliceError case_Err; - } val; -} Result_15; - -/** -This function found in impl {core::result::Result<T, E>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[8size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_68(Result_15 self, uint8_t ret[8U]) { - if (self.tag == Ok) { - uint8_t f0[8U]; - memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)8U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_mlkem_core_H_DEFINED -#endif /* libcrux_mlkem_core_H */ - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_ct_ops.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_ct_ops_H -#define libcrux_ct_ops_H - - -#if defined(__cplusplus) -extern "C" { -#endif - - -/** - Return 1 if `value` is not zero and 0 otherwise. -*/ -static KRML_NOINLINE uint8_t -libcrux_ml_kem_constant_time_ops_inz(uint8_t value) { - uint16_t value0 = (uint16_t)value; - uint8_t result = - (uint8_t)((uint32_t)core_num__u16__wrapping_add(~value0, 1U) >> 8U); - return (uint32_t)result & 1U; -} - -static KRML_NOINLINE uint8_t -libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) { - return libcrux_ml_kem_constant_time_ops_inz(value); -} - -/** - Return 1 if the bytes of `lhs` and `rhs` do not exactly - match and 0 otherwise. -*/ -static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_compare( - Eurydice_slice lhs, Eurydice_slice rhs) { - uint8_t r = 0U; - for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) { - size_t i0 = i; - uint8_t nr = (uint32_t)r | - ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^ - (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *)); - r = nr; - } - return libcrux_ml_kem_constant_time_ops_is_non_zero(r); -} - -static KRML_NOINLINE uint8_t -libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( - Eurydice_slice lhs, Eurydice_slice rhs) { - return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs); -} - -/** - If `selector` is not zero, return the bytes in `rhs`; return the bytes in - `lhs` otherwise. -*/ -static KRML_NOINLINE void libcrux_ml_kem_constant_time_ops_select_ct( - Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector, - uint8_t ret[32U]) { - uint8_t mask = core_num__u8__wrapping_sub( - libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U); - uint8_t out[32U] = {0U}; - for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE; - i++) { - size_t i0 = i; - uint8_t outi = - ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) & - (uint32_t)mask) | - ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) & - (uint32_t)~mask); - out[i0] = outi; - } - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -static KRML_NOINLINE void -libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( - Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector, - uint8_t ret[32U]) { - libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret); -} - -static KRML_NOINLINE void -libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( - Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s, - Eurydice_slice rhs_s, uint8_t ret[32U]) { - uint8_t selector = - libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( - lhs_c, rhs_c); - uint8_t ret0[32U]; - libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( - lhs_s, rhs_s, selector, ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_ct_ops_H_DEFINED -#endif /* libcrux_ct_ops_H */ - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_sha3_portable.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_sha3_portable_H -#define libcrux_sha3_portable_H - - -#if defined(__cplusplus) -extern "C" { -#endif - - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_zero_d2(void) { - return 0ULL; -} - -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__veor5q_u64( - uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) { - return (((a ^ b) ^ c) ^ d) ^ e; -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor5_d2( - uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) { - return libcrux_sha3_simd_portable__veor5q_u64(a, b, c, d, e); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 1 -- RIGHT= 63 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_76(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)1); -} - -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a, uint64_t b) { - uint64_t uu____0 = a; - return uu____0 ^ libcrux_sha3_simd_portable_rotate_left_76(b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vrax1q_u64(a, b); -} - -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) { - return a ^ (b & ~c); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a, uint64_t b, uint64_t c) { - return libcrux_sha3_simd_portable__vbcaxq_u64(a, b, c); -} - -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a, uint64_t c) { - return a ^ c; -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a, uint64_t c) { - return libcrux_sha3_simd_portable__veorq_n_u64(a, c); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor_d2(uint64_t a, - uint64_t b) { - return a ^ b; -} - -static const uint64_t - libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[24U] = { - 1ULL, - 32898ULL, - 9223372036854808714ULL, - 9223372039002292224ULL, - 32907ULL, - 2147483649ULL, - 9223372039002292353ULL, - 9223372036854808585ULL, - 138ULL, - 136ULL, - 2147516425ULL, - 2147483658ULL, - 2147516555ULL, - 9223372036854775947ULL, - 9223372036854808713ULL, - 9223372036854808579ULL, - 9223372036854808578ULL, - 9223372036854775936ULL, - 32778ULL, - 9223372039002259466ULL, - 9223372039002292353ULL, - 9223372036854808704ULL, - 2147483649ULL, - 9223372039002292232ULL}; - -typedef struct size_t_x2_s { - size_t fst; - size_t snd; -} size_t_x2; - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState -with types uint64_t -with const generics -- $1size_t -*/ -typedef struct libcrux_sha3_generic_keccak_KeccakState_17_s { - uint64_t st[25U]; -} libcrux_sha3_generic_keccak_KeccakState_17; - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.new_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_generic_keccak_new_80_04(void) { - libcrux_sha3_generic_keccak_KeccakState_17 lit; - uint64_t repeat_expression[25U]; - for (size_t i = (size_t)0U; i < (size_t)25U; i++) { - repeat_expression[i] = libcrux_sha3_simd_portable_zero_d2(); - } - memcpy(lit.st, repeat_expression, (size_t)25U * sizeof(uint64_t)); - return lit; -} - -/** -A monomorphic instance of libcrux_sha3.traits.get_ij -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE uint64_t *libcrux_sha3_traits_get_ij_04(uint64_t *arr, - size_t i, - size_t j) { - return &arr[(size_t)5U * j + i]; -} - -/** -A monomorphic instance of libcrux_sha3.traits.set_ij -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_traits_set_ij_04(uint64_t *arr, - size_t i, size_t j, - uint64_t value) { - arr[(size_t)5U * j + i] = value; -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 72 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_f8( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 72 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_f8( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_f8(self->st, input[0U], start); -} - -/** -This function found in impl {core::ops::index::Index<(usize, usize), T> for -libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.index_c2 -with types uint64_t -with const generics -- N= 1 -*/ -static inline uint64_t *libcrux_sha3_generic_keccak_index_c2_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t_x2 index) { - return libcrux_sha3_traits_get_ij_04(self->st, index.fst, index.snd); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.theta_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t ret[5U]) { - uint64_t c[5U] = { - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)0U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)1U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)2U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)3U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)4U}))[0U])}; - uint64_t uu____0 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)0U + (size_t)4U) % (size_t)5U], - c[((size_t)0U + (size_t)1U) % (size_t)5U]); - uint64_t uu____1 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)1U + (size_t)4U) % (size_t)5U], - c[((size_t)1U + (size_t)1U) % (size_t)5U]); - uint64_t uu____2 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)2U + (size_t)4U) % (size_t)5U], - c[((size_t)2U + (size_t)1U) % (size_t)5U]); - uint64_t uu____3 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)3U + (size_t)4U) % (size_t)5U], - c[((size_t)3U + (size_t)1U) % (size_t)5U]); - ret[0U] = uu____0; - ret[1U] = uu____1; - ret[2U] = uu____2; - ret[3U] = uu____3; - ret[4U] = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)4U + (size_t)4U) % (size_t)5U], - c[((size_t)4U + (size_t)1U) % (size_t)5U]); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.set_80 -with types uint64_t -with const generics -- N= 1 -*/ -static inline void libcrux_sha3_generic_keccak_set_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i, size_t j, - uint64_t v) { - libcrux_sha3_traits_set_ij_04(self->st, i, j, v); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 36 -- RIGHT= 28 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_02(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)36); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 36 -- RIGHT= 28 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_02(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 36 -- RIGHT= 28 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_02(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 3 -- RIGHT= 61 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)3); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 3 -- RIGHT= 61 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_ac(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 3 -- RIGHT= 61 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_ac(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 41 -- RIGHT= 23 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_020(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)41); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 41 -- RIGHT= 23 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_020(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 41 -- RIGHT= 23 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_020(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 18 -- RIGHT= 46 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)18); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 18 -- RIGHT= 46 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_a9(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 18 -- RIGHT= 46 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_a9(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 1 -- RIGHT= 63 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_76(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 1 -- RIGHT= 63 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_76(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 44 -- RIGHT= 20 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_58(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)44); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 44 -- RIGHT= 20 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_58(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 44 -- RIGHT= 20 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_58(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 10 -- RIGHT= 54 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)10); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 10 -- RIGHT= 54 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_e0(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 10 -- RIGHT= 54 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_e0(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 45 -- RIGHT= 19 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_63(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)45); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 45 -- RIGHT= 19 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_63(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 45 -- RIGHT= 19 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_63(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 2 -- RIGHT= 62 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)2); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 2 -- RIGHT= 62 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_6a(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 2 -- RIGHT= 62 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_6a(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 62 -- RIGHT= 2 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)62); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 62 -- RIGHT= 2 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_ab(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 62 -- RIGHT= 2 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_ab(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 6 -- RIGHT= 58 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)6); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 6 -- RIGHT= 58 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_5b(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 6 -- RIGHT= 58 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_5b(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 43 -- RIGHT= 21 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)43); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 43 -- RIGHT= 21 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_6f(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 43 -- RIGHT= 21 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_6f(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 15 -- RIGHT= 49 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_62(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)15); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 15 -- RIGHT= 49 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_62(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 15 -- RIGHT= 49 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_62(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 61 -- RIGHT= 3 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_23(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)61); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 61 -- RIGHT= 3 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_23(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 61 -- RIGHT= 3 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_23(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 28 -- RIGHT= 36 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_37(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)28); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 28 -- RIGHT= 36 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_37(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 28 -- RIGHT= 36 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_37(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 55 -- RIGHT= 9 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)55); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 55 -- RIGHT= 9 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_bb(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 55 -- RIGHT= 9 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_bb(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 25 -- RIGHT= 39 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)25); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 25 -- RIGHT= 39 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_b9(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 25 -- RIGHT= 39 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_b9(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 21 -- RIGHT= 43 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_54(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)21); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 21 -- RIGHT= 43 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_54(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 21 -- RIGHT= 43 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_54(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 56 -- RIGHT= 8 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)56); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 56 -- RIGHT= 8 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_4c(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 56 -- RIGHT= 8 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_4c(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 27 -- RIGHT= 37 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)27); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 27 -- RIGHT= 37 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_ce(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 27 -- RIGHT= 37 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_ce(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 20 -- RIGHT= 44 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_77(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)20); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 20 -- RIGHT= 44 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_77(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 20 -- RIGHT= 44 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_77(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 39 -- RIGHT= 25 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_25(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)39); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 39 -- RIGHT= 25 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_25(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 39 -- RIGHT= 25 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_25(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 8 -- RIGHT= 56 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_af(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)8); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 8 -- RIGHT= 56 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_af(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 8 -- RIGHT= 56 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_af(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 14 -- RIGHT= 50 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)14); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 14 -- RIGHT= 50 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_fd(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 14 -- RIGHT= 50 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_fd(a, b); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.rho_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_rho_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t t[5U]) { - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)0U, - libcrux_sha3_simd_portable_xor_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____0, (size_t)1U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_02( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____1 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____1, (size_t)2U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_ac( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____2 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____2, (size_t)3U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_020( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____3 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____3, (size_t)4U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_a9( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____4 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____4, (size_t)0U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_76( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____5 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____5, (size_t)1U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_58( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____6 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____6, (size_t)2U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_e0( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____7 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____7, (size_t)3U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_63( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____8 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____8, (size_t)4U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_6a( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____9 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____9, (size_t)0U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_ab( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____10 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____10, (size_t)1U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_5b( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____11 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____11, (size_t)2U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_6f( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____12 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____12, (size_t)3U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_62( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____13 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____13, (size_t)4U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_23( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____14 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____14, (size_t)0U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_37( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____15 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____15, (size_t)1U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_bb( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____16 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____16, (size_t)2U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_b9( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____17 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____17, (size_t)3U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_54( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____18 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____18, (size_t)4U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_4c( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____19 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____19, (size_t)0U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_ce( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____20 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____20, (size_t)1U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_77( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____21 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____21, (size_t)2U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_25( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____22 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____22, (size_t)3U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_af( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____23 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____23, (size_t)4U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_fd( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)4U}))[0U], - t[4U])); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.pi_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U]; - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)1U}))[0U]); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.chi_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U]; - for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) { - size_t i1 = i0; - for (size_t i = (size_t)0U; i < (size_t)5U; i++) { - size_t j = i; - libcrux_sha3_generic_keccak_set_80_04( - self, i1, j, - libcrux_sha3_simd_portable_and_not_xor_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = i1, .snd = j}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - &old, - (KRML_CLITERAL(size_t_x2){ - .fst = i1, .snd = (j + (size_t)2U) % (size_t)5U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - &old, - (KRML_CLITERAL(size_t_x2){ - .fst = i1, .snd = (j + (size_t)1U) % (size_t)5U}))[0U])); - } - } -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.iota_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i) { - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)0U, - libcrux_sha3_simd_portable_xor_constant_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[i])); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - for (size_t i = (size_t)0U; i < (size_t)24U; i++) { - size_t i0 = i; - uint64_t t[5U]; - libcrux_sha3_generic_keccak_theta_80_04(self, t); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self; - uint64_t uu____1[5U]; - memcpy(uu____1, t, (size_t)5U * sizeof(uint64_t)); - libcrux_sha3_generic_keccak_rho_80_04(uu____0, uu____1); - libcrux_sha3_generic_keccak_pi_80_04(self); - libcrux_sha3_generic_keccak_chi_80_04(self); - libcrux_sha3_generic_keccak_iota_80_04(self, i0); - } -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 72 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c6( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_f8(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 72 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_96( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[72U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)72U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_f8( - state, Eurydice_array_to_slice((size_t)72U, buffer, uint8_t), (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 72 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_96( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_96(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 72 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_96(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 72 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_f8( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 72 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_f8( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_f8(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 72 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_96( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)72U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c6(&s, buf, i0 * (size_t)72U); - } - size_t rem = data_len % (size_t)72U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)72U; - size_t last = outlen - outlen % (size_t)72U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, (size_t)72U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, i0 * (size_t)72U, - (size_t)72U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 512 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_96(data, digest); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_5b( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 136 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_5b(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c60( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_5b(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 136 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[136U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)136U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_5b( - state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 136 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_ad( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_ad(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 136 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e0( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_ad(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_5b( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 136 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_5b(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 136 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U); - } - size_t rem = data_len % (size_t)136U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e0(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)136U; - size_t last = outlen - outlen % (size_t)136U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U, - (size_t)136U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 256 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_ad(data, digest); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 136 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad0( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[136U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 31U; - size_t uu____0 = (size_t)136U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_5b( - state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 136 -- DELIMITER= 31 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_ad0( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_ad0(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 136 -- DELIM= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e1( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_ad0(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 136 -- DELIM= 31 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad0( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U); - } - size_t rem = data_len % (size_t)136U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e1(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)136U; - size_t last = outlen - outlen % (size_t)136U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U, - (size_t)136U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHAKE256 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_shake256( - Eurydice_slice digest, Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_ad0(data, digest); -} - -typedef libcrux_sha3_generic_keccak_KeccakState_17 - libcrux_sha3_portable_KeccakState; - -/** - Create a new SHAKE-128 state object. -*/ -static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_portable_incremental_shake128_init(void) { - return libcrux_sha3_generic_keccak_new_80_04(); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_3a( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 168 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_c6( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[168U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 31U; - size_t uu____0 = (size_t)168U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_3a( - state, Eurydice_array_to_slice((size_t)168U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 168 -- DELIMITER= 31 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_c6( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_c6(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 168 -- DELIM= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e2( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_c6(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** - Absorb -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_absorb_final( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data0) { - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s; - Eurydice_slice uu____1[1U] = {data0}; - libcrux_sha3_generic_keccak_absorb_final_80_9e2( - uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data0, uint8_t)); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_3a( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 168 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_3a(self->st, out, start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, -1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_first_three_blocks_b4 with const -generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) { - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U, - (size_t)168U); -} - -/** - Squeeze three blocks -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) { - libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(s, - out0); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, -1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, start, (size_t)168U); -} - -/** - Squeeze another block -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_squeeze_next_block( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) { - libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(s, out0, - (size_t)0U); -} - -#define libcrux_sha3_Algorithm_Sha224 1 -#define libcrux_sha3_Algorithm_Sha256 2 -#define libcrux_sha3_Algorithm_Sha384 3 -#define libcrux_sha3_Algorithm_Sha512 4 - -typedef uint8_t libcrux_sha3_Algorithm; - -typedef uint8_t libcrux_sha3_Sha3_224Digest[28U]; - -typedef uint8_t libcrux_sha3_Sha3_256Digest[32U]; - -typedef uint8_t libcrux_sha3_Sha3_384Digest[48U]; - -typedef uint8_t libcrux_sha3_Sha3_512Digest[64U]; - -/** - Returns the output size of a digest. -*/ -static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) { - switch (mode) { - case libcrux_sha3_Algorithm_Sha224: { - break; - } - case libcrux_sha3_Algorithm_Sha256: { - return (size_t)32U; - } - case libcrux_sha3_Algorithm_Sha384: { - return (size_t)48U; - } - case libcrux_sha3_Algorithm_Sha512: { - return (size_t)64U; - } - default: { - KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, - __LINE__); - KRML_HOST_EXIT(253U); - } - } - return (size_t)28U; -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 144 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_2c( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 144 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_2c( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_2c(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 144 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c61( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_2c(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 144 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_1e( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[144U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)144U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_2c( - state, Eurydice_array_to_slice((size_t)144U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 144 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_1e( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_1e(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 144 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e3( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_1e(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 144 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_2c( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 144 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_2c( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_2c(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 144 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_1e( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)144U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c61(&s, buf, i0 * (size_t)144U); - } - size_t rem = data_len % (size_t)144U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e3(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)144U; - size_t last = outlen - outlen % (size_t)144U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, (size_t)144U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, i0 * (size_t)144U, - (size_t)144U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 224 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_1e(data, digest); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 104 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_7a( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 104 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_7a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_7a(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 104 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c62( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_7a(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 104 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_7c( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[104U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)104U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_7a( - state, Eurydice_array_to_slice((size_t)104U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 104 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_7c( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_7c(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 104 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e4( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_7c(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 104 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_7a( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 104 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_7a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_7a(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 104 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_7c( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)104U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c62(&s, buf, i0 * (size_t)104U); - } - size_t rem = data_len % (size_t)104U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e4(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)104U; - size_t last = outlen - outlen % (size_t)104U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, (size_t)104U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, i0 * (size_t)104U, - (size_t)104U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 384 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_7c(data, digest); -} - -/** - SHA3 224 - - Preconditions: - - `digest.len() == 28` -*/ -static inline void libcrux_sha3_sha224_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha224(digest, payload); -} - -/** - SHA3 224 -*/ -static inline void libcrux_sha3_sha224(Eurydice_slice data, uint8_t ret[28U]) { - uint8_t out[28U] = {0U}; - libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t), - data); - memcpy(ret, out, (size_t)28U * sizeof(uint8_t)); -} - -/** - SHA3 256 -*/ -static inline void libcrux_sha3_sha256_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha256(digest, payload); -} - -/** - SHA3 256 -*/ -static inline void libcrux_sha3_sha256(Eurydice_slice data, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t), - data); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** - SHA3 384 -*/ -static inline void libcrux_sha3_sha384_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha384(digest, payload); -} - -/** - SHA3 384 -*/ -static inline void libcrux_sha3_sha384(Eurydice_slice data, uint8_t ret[48U]) { - uint8_t out[48U] = {0U}; - libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t), - data); - memcpy(ret, out, (size_t)48U * sizeof(uint8_t)); -} - -/** - SHA3 512 -*/ -static inline void libcrux_sha3_sha512_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha512(digest, payload); -} - -/** - SHA3 512 -*/ -static inline void libcrux_sha3_sha512(Eurydice_slice data, uint8_t ret[64U]) { - uint8_t out[64U] = {0U}; - libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t), - data); - memcpy(ret, out, (size_t)64U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 168 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_3a(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, -N>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c63( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_3a(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 168 -- DELIM= 31 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_c6( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)168U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c63(&s, buf, i0 * (size_t)168U); - } - size_t rem = data_len % (size_t)168U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e2(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)168U; - size_t last = outlen - outlen % (size_t)168U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, (size_t)168U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, i0 * (size_t)168U, - (size_t)168U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHAKE128 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_shake128( - Eurydice_slice digest, Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_c6(data, digest); -} - -/** - SHAKE 128 - - Writes `out.len()` bytes. -*/ -static inline void libcrux_sha3_shake128_ema(Eurydice_slice out, - Eurydice_slice data) { - libcrux_sha3_portable_shake128(out, data); -} - -/** - SHAKE 256 - - Writes `out.len()` bytes. -*/ -static inline void libcrux_sha3_shake256_ema(Eurydice_slice out, - Eurydice_slice data) { - libcrux_sha3_portable_shake256(out, data); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, -1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_first_five_blocks_b4 with const -generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) { - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)3U * (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)4U * (size_t)168U, - (size_t)168U); -} - -/** - Squeeze five blocks -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) { - libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(s, out0); -} - -/** - Absorb some data for SHAKE-256 for the last time -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake256_absorb_final( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data) { - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s; - Eurydice_slice uu____1[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e1( - uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data, uint8_t)); -} - -/** - Create a new SHAKE-256 state object. -*/ -static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_portable_incremental_shake256_init(void) { - return libcrux_sha3_generic_keccak_new_80_04(); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, -1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_first_block_b4 with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) { - libcrux_sha3_simd_portable_squeeze_13_5b(self, out, (size_t)0U, (size_t)136U); -} - -/** - Squeeze the first SHAKE-256 block -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake256_squeeze_first_block( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) { - libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(s, out); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64, -1usize>[core::marker::Sized<u64>, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_5b(self, out, start, (size_t)136U); -} - -/** - Squeeze the next SHAKE-256 block -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake256_squeeze_next_block( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) { - libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(s, out, - (size_t)0U); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState -with types uint64_t -with const generics -- $1size_t -- $136size_t -*/ -typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_e2_s { - libcrux_sha3_generic_keccak_KeccakState_17 inner; - uint8_t buf[1U][136U]; - size_t buf_len; - bool sponge; -} libcrux_sha3_generic_keccak_xof_KeccakXofState_e2; - -typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 - libcrux_sha3_portable_incremental_Shake256Xof; - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - size_t consumed = (size_t)0U; - if (self->buf_len > (size_t)0U) { - if (self->buf_len + input_len >= (size_t)136U) { - consumed = (size_t)136U - self->buf_len; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t, - uint8_t[]); - Eurydice_slice_copy( - uu____0, - Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t, - uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + consumed; - } - } - return consumed; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c6( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - size_t input_consumed = - libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(self, inputs); - if (input_consumed > (size_t)0U) { - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[136U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf, - uint8_t, Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_block_a1_5b(&self->inner, borrowed, - (size_t)0U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - self->buf_len = (size_t)0U; - } - size_t input_to_consume = - Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed; - size_t num_blocks = input_to_consume / (size_t)136U; - size_t remainder = input_to_consume % (size_t)136U; - for (size_t i = (size_t)0U; i < num_blocks; i++) { - size_t i0 = i; - libcrux_sha3_simd_portable_load_block_a1_5b( - &self->inner, inputs, input_consumed + i0 * (size_t)136U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - return remainder; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c6( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - size_t input_remainder_len = - libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(self, inputs); - if (input_remainder_len > (size_t)0U) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice_copy(Eurydice_array_to_subslice3( - self->buf[i0], self->buf_len, - self->buf_len + input_remainder_len, uint8_t *), - Eurydice_slice_subslice_from( - inputs[i0], input_len - input_remainder_len, - uint8_t, size_t, uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + input_remainder_len; - } -} - -/** - Shake256 absorb -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_42( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, inputs); - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[136U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf, uint8_t, - Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_last_a1_ad0(&self->inner, borrowed, - (size_t)0U, self->buf_len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); -} - -/** - Shake256 absorb final -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_final_42( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c6( - uint8_t ret[136U]) { - memset(ret, 0U, 136U * sizeof(uint8_t)); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 -libcrux_sha3_generic_keccak_xof_new_35_c6(void) { - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 lit; - lit.inner = libcrux_sha3_generic_keccak_new_80_04(); - uint8_t repeat_expression[1U][136U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - libcrux_sha3_generic_keccak_xof_zero_block_35_c6(repeat_expression[i]); - } - memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[136U])); - lit.buf_len = (size_t)0U; - lit.sponge = false; - return lit; -} - -/** - Shake256 new state -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 -libcrux_sha3_portable_incremental_new_42(void) { - return libcrux_sha3_generic_keccak_xof_new_35_c6(); -} - -/** - Squeeze `N` x `LEN` bytes. Only `N = 1` for now. -*/ -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 -with types uint64_t -with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_c7( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice out) { - if (self->sponge) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - size_t out_len = Eurydice_slice_len(out, uint8_t); - if (out_len > (size_t)0U) { - if (out_len <= (size_t)136U) { - libcrux_sha3_simd_portable_squeeze_13_5b(&self->inner, out, (size_t)0U, - out_len); - } else { - size_t blocks = out_len / (size_t)136U; - for (size_t i = (size_t)0U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_5b( - &self->inner, out, i0 * (size_t)136U, (size_t)136U); - } - size_t remaining = out_len % (size_t)136U; - if (remaining > (size_t)0U) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_5b( - &self->inner, out, blocks * (size_t)136U, remaining); - } - } - self->sponge = true; - } -} - -/** - Shake256 squeeze -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline void libcrux_sha3_portable_incremental_squeeze_42( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice out) { - libcrux_sha3_generic_keccak_xof_squeeze_85_c7(self, out); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState -with types uint64_t -with const generics -- $1size_t -- $168size_t -*/ -typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_97_s { - libcrux_sha3_generic_keccak_KeccakState_17 inner; - uint8_t buf[1U][168U]; - size_t buf_len; - bool sponge; -} libcrux_sha3_generic_keccak_xof_KeccakXofState_97; - -typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_97 - libcrux_sha3_portable_incremental_Shake128Xof; - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - size_t consumed = (size_t)0U; - if (self->buf_len > (size_t)0U) { - if (self->buf_len + input_len >= (size_t)168U) { - consumed = (size_t)168U - self->buf_len; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t, - uint8_t[]); - Eurydice_slice_copy( - uu____0, - Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t, - uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + consumed; - } - } - return consumed; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c60( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - size_t input_consumed = - libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(self, inputs); - if (input_consumed > (size_t)0U) { - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[168U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf, - uint8_t, Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_block_a1_3a(&self->inner, borrowed, - (size_t)0U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - self->buf_len = (size_t)0U; - } - size_t input_to_consume = - Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed; - size_t num_blocks = input_to_consume / (size_t)168U; - size_t remainder = input_to_consume % (size_t)168U; - for (size_t i = (size_t)0U; i < num_blocks; i++) { - size_t i0 = i; - libcrux_sha3_simd_portable_load_block_a1_3a( - &self->inner, inputs, input_consumed + i0 * (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - return remainder; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c60( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - size_t input_remainder_len = - libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(self, inputs); - if (input_remainder_len > (size_t)0U) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice_copy(Eurydice_array_to_subslice3( - self->buf[i0], self->buf_len, - self->buf_len + input_remainder_len, uint8_t *), - Eurydice_slice_subslice_from( - inputs[i0], input_len - input_remainder_len, - uint8_t, size_t, uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + input_remainder_len; - } -} - -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_26( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, inputs); - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[168U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf, uint8_t, - Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_last_a1_c6(&self->inner, borrowed, (size_t)0U, - self->buf_len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); -} - -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_final_26( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c60( - uint8_t ret[168U]) { - memset(ret, 0U, 168U * sizeof(uint8_t)); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97 -libcrux_sha3_generic_keccak_xof_new_35_c60(void) { - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 lit; - lit.inner = libcrux_sha3_generic_keccak_new_80_04(); - uint8_t repeat_expression[1U][168U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - libcrux_sha3_generic_keccak_xof_zero_block_35_c60(repeat_expression[i]); - } - memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[168U])); - lit.buf_len = (size_t)0U; - lit.sponge = false; - return lit; -} - -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97 -libcrux_sha3_portable_incremental_new_26(void) { - return libcrux_sha3_generic_keccak_xof_new_35_c60(); -} - -/** - Squeeze `N` x `LEN` bytes. Only `N = 1` for now. -*/ -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize, -RATE>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 -with types uint64_t -with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_13( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice out) { - if (self->sponge) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - size_t out_len = Eurydice_slice_len(out, uint8_t); - if (out_len > (size_t)0U) { - if (out_len <= (size_t)168U) { - libcrux_sha3_simd_portable_squeeze_13_3a(&self->inner, out, (size_t)0U, - out_len); - } else { - size_t blocks = out_len / (size_t)168U; - for (size_t i = (size_t)0U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_3a( - &self->inner, out, i0 * (size_t)168U, (size_t)168U); - } - size_t remaining = out_len % (size_t)168U; - if (remaining > (size_t)0U) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_3a( - &self->inner, out, blocks * (size_t)168U, remaining); - } - } - self->sponge = true; - } -} - -/** - Shake128 squeeze -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline void libcrux_sha3_portable_incremental_squeeze_26( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice out) { - libcrux_sha3_generic_keccak_xof_squeeze_85_13(self, out); -} - -/** -This function found in impl {core::clone::Clone for -libcrux_sha3::portable::KeccakState} -*/ -static inline libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_portable_clone_fe( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - return self[0U]; -} - -/** -This function found in impl {core::convert::From<libcrux_sha3::Algorithm> for -u32} -*/ -static inline uint32_t libcrux_sha3_from_6c(libcrux_sha3_Algorithm v) { - switch (v) { - case libcrux_sha3_Algorithm_Sha224: { - break; - } - case libcrux_sha3_Algorithm_Sha256: { - return 2U; - } - case libcrux_sha3_Algorithm_Sha384: { - return 3U; - } - case libcrux_sha3_Algorithm_Sha512: { - return 4U; - } - default: { - KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, - __LINE__); - KRML_HOST_EXIT(253U); - } - } - return 1U; -} - -/** -This function found in impl {core::convert::From<u32> for -libcrux_sha3::Algorithm} -*/ -static inline libcrux_sha3_Algorithm libcrux_sha3_from_29(uint32_t v) { - switch (v) { - case 1U: { - break; - } - case 2U: { - return libcrux_sha3_Algorithm_Sha256; - } - case 3U: { - return libcrux_sha3_Algorithm_Sha384; - } - case 4U: { - return libcrux_sha3_Algorithm_Sha512; - } - default: { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "panic!"); - KRML_HOST_EXIT(255U); - } - } - return libcrux_sha3_Algorithm_Sha224; -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_sha3_portable_H_DEFINED -#endif /* libcrux_sha3_portable_H */ - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem768_portable.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com> - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_mlkem768_portable_H -#define libcrux_mlkem768_portable_H - - -#if defined(__cplusplus) -extern "C" { -#endif - - -static inline void libcrux_ml_kem_hash_functions_portable_G( - Eurydice_slice input, uint8_t ret[64U]) { - uint8_t digest[64U] = {0U}; - libcrux_sha3_portable_sha512( - Eurydice_array_to_slice((size_t)64U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)64U * sizeof(uint8_t)); -} - -static inline void libcrux_ml_kem_hash_functions_portable_H( - Eurydice_slice input, uint8_t ret[32U]) { - uint8_t digest[32U] = {0U}; - libcrux_sha3_portable_sha256( - Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)32U * sizeof(uint8_t)); -} - -static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] = - {(int16_t)-1044, (int16_t)-758, (int16_t)-359, (int16_t)-1517, - (int16_t)1493, (int16_t)1422, (int16_t)287, (int16_t)202, - (int16_t)-171, (int16_t)622, (int16_t)1577, (int16_t)182, - (int16_t)962, (int16_t)-1202, (int16_t)-1474, (int16_t)1468, - (int16_t)573, (int16_t)-1325, (int16_t)264, (int16_t)383, - (int16_t)-829, (int16_t)1458, (int16_t)-1602, (int16_t)-130, - (int16_t)-681, (int16_t)1017, (int16_t)732, (int16_t)608, - (int16_t)-1542, (int16_t)411, (int16_t)-205, (int16_t)-1571, - (int16_t)1223, (int16_t)652, (int16_t)-552, (int16_t)1015, - (int16_t)-1293, (int16_t)1491, (int16_t)-282, (int16_t)-1544, - (int16_t)516, (int16_t)-8, (int16_t)-320, (int16_t)-666, - (int16_t)-1618, (int16_t)-1162, (int16_t)126, (int16_t)1469, - (int16_t)-853, (int16_t)-90, (int16_t)-271, (int16_t)830, - (int16_t)107, (int16_t)-1421, (int16_t)-247, (int16_t)-951, - (int16_t)-398, (int16_t)961, (int16_t)-1508, (int16_t)-725, - (int16_t)448, (int16_t)-1065, (int16_t)677, (int16_t)-1275, - (int16_t)-1103, (int16_t)430, (int16_t)555, (int16_t)843, - (int16_t)-1251, (int16_t)871, (int16_t)1550, (int16_t)105, - (int16_t)422, (int16_t)587, (int16_t)177, (int16_t)-235, - (int16_t)-291, (int16_t)-460, (int16_t)1574, (int16_t)1653, - (int16_t)-246, (int16_t)778, (int16_t)1159, (int16_t)-147, - (int16_t)-777, (int16_t)1483, (int16_t)-602, (int16_t)1119, - (int16_t)-1590, (int16_t)644, (int16_t)-872, (int16_t)349, - (int16_t)418, (int16_t)329, (int16_t)-156, (int16_t)-75, - (int16_t)817, (int16_t)1097, (int16_t)603, (int16_t)610, - (int16_t)1322, (int16_t)-1285, (int16_t)-1465, (int16_t)384, - (int16_t)-1215, (int16_t)-136, (int16_t)1218, (int16_t)-1335, - (int16_t)-874, (int16_t)220, (int16_t)-1187, (int16_t)-1659, - (int16_t)-1185, (int16_t)-1530, (int16_t)-1278, (int16_t)794, - (int16_t)-1510, (int16_t)-854, (int16_t)-870, (int16_t)478, - (int16_t)-108, (int16_t)-308, (int16_t)996, (int16_t)991, - (int16_t)958, (int16_t)-1460, (int16_t)1522, (int16_t)1628}; - -static KRML_MUSTINLINE int16_t libcrux_ml_kem_polynomial_zeta(size_t i) { - return libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[i]; -} - -#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT ((size_t)16U) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \ - ((int16_t)1353) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \ - (62209U) - -typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_s { - int16_t elements[16U]; -} libcrux_ml_kem_vector_portable_vector_type_PortableVector; - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_vector_type_from_i16_array( - Eurydice_slice array) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector lit; - int16_t ret[16U]; - Result_0a dst; - Eurydice_slice_to_array2( - &dst, Eurydice_slice_subslice3(array, (size_t)0U, (size_t)16U, int16_t *), - Eurydice_slice, int16_t[16U], TryFromSliceError); - unwrap_26_00(dst, ret); - memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice array) { - return libcrux_ml_kem_vector_portable_vector_type_from_i16_array( - libcrux_secrets_int_classify_public_classify_ref_9b_39(array)); -} - -typedef struct int16_t_x8_s { - int16_t fst; - int16_t snd; - int16_t thd; - int16_t f3; - int16_t f4; - int16_t f5; - int16_t f6; - int16_t f7; -} int16_t_x8; - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_vector_type_zero(void) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector lit; - int16_t ret[16U]; - int16_t buf[16U] = {0U}; - libcrux_secrets_int_public_integers_classify_27_46(buf, ret); - memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ZERO_b8(void) { - return libcrux_ml_kem_vector_portable_vector_type_zero(); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_add( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - lhs.elements[uu____0] = lhs.elements[uu____0] + rhs->elements[i0]; - } - return lhs; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_add_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_sub( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - lhs.elements[uu____0] = lhs.elements[uu____0] - rhs->elements[i0]; - } - return lhs; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_sub_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - vec.elements[uu____0] = vec.elements[uu____0] * c; - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_multiply_by_constant_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(vec, c); -} - -/** - Note: This function is not secret independent - Only use with public values. -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - if (libcrux_secrets_int_public_integers_declassify_d8_39( - vec.elements[i0]) >= (int16_t)3329) { - size_t uu____0 = i0; - vec.elements[uu____0] = vec.elements[uu____0] - (int16_t)3329; - } - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_cond_subtract_3329_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { - return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v); -} - -#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \ - ((int32_t)20159) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT ((int32_t)26) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R \ - ((int32_t)1 << (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT) - -/** - Signed Barrett Reduction - - Given an input `value`, `barrett_reduce` outputs a representative `result` - such that: - - - result ≡ value (mod FIELD_MODULUS) - - the absolute value of `result` is bound as follows: - - `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1) - - Note: The input bound is 28296 to prevent overflow in the multiplication of - quotient by FIELD_MODULUS - -*/ -static inline int16_t -libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( - int16_t value) { - int32_t t = libcrux_secrets_int_as_i32_f5(value) * - LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER + - (LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R >> 1U); - int16_t quotient = libcrux_secrets_int_as_i16_36( - t >> (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT); - return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int16_t vi = - libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( - vec.elements[i0]); - vec.elements[i0] = vi; - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_barrett_reduce_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) { - return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(vector); -} - -#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U) - -/** - Signed Montgomery Reduction - - Given an input `value`, `montgomery_reduce` outputs a representative `o` - such that: - - - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS) - - the absolute value of `o` is bound as follows: - - `|result| ≤ ceil(|value| / MONTGOMERY_R) + 1665 - - In particular, if `|value| ≤ FIELD_MODULUS-1 * FIELD_MODULUS-1`, then `|o| <= - FIELD_MODULUS-1`. And, if `|value| ≤ pow2 16 * FIELD_MODULUS-1`, then `|o| <= - FIELD_MODULUS + 1664 - -*/ -static inline int16_t -libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - int32_t value) { - int32_t k = - libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(value)) * - libcrux_secrets_int_as_i32_b8( - libcrux_secrets_int_public_integers_classify_27_df( - LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R)); - int32_t k_times_modulus = - libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(k)) * - libcrux_secrets_int_as_i32_f5( - libcrux_secrets_int_public_integers_classify_27_39( - LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); - int16_t c = libcrux_secrets_int_as_i16_36( - k_times_modulus >> - (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); - int16_t value_high = libcrux_secrets_int_as_i16_36( - value >> - (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); - return value_high - c; -} - -/** - If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to - `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to - `x · y`, as follows: - - `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)` - - `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a - representative `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod - FIELD_MODULUS)`. -*/ -static KRML_MUSTINLINE int16_t -libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - int16_t fe, int16_t fer) { - int32_t product = - libcrux_secrets_int_as_i32_f5(fe) * libcrux_secrets_int_as_i32_f5(fer); - return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - product); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - vec.elements[i0] = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - vec.elements[i0], c); - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vector, - int16_t constant) { - return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( - vector, libcrux_secrets_int_public_integers_classify_27_39(constant)); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - vec.elements[uu____0] = vec.elements[uu____0] & c; - } - return vec; -} - -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right -with const generics -- SHIFT_BY= 15 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - vec.elements[i0] = vec.elements[i0] >> (uint32_t)(int32_t)15; - } - return vec; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector t = - libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(a); - libcrux_ml_kem_vector_portable_vector_type_PortableVector fm = - libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( - t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS); - return libcrux_ml_kem_vector_portable_arithmetic_add(a, &fm); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_to_unsigned_representative_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative( - a); -} - -/** - The `compress_*` functions implement the `Compress` function specified in the - NIST FIPS 203 standard (Page 18, Expression 4.5), which is defined as: - - ```plaintext - Compress_d: ℤq -> ℤ_{2ᵈ} - Compress_d(x) = ⌈(2ᵈ/q)·x⌋ - ``` - - Since `⌈x⌋ = ⌊x + 1/2⌋` we have: - - ```plaintext - Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋ - = ⌊(2^{d+1}·x + q) / 2q⌋ - ``` - - For further information about the function implementations, consult the - `implementation_notes.pdf` document in this directory. - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -static inline uint8_t -libcrux_ml_kem_vector_portable_compress_compress_message_coefficient( - uint16_t fe) { - int16_t shifted = - libcrux_secrets_int_public_integers_classify_27_39((int16_t)1664) - - libcrux_secrets_int_as_i16_ca(fe); - int16_t mask = shifted >> 15U; - int16_t shifted_to_positive = mask ^ shifted; - int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832; - int16_t r0 = shifted_positive_in_range >> 15U; - int16_t r1 = r0 & (int16_t)1; - return libcrux_secrets_int_as_u8_f5(r1); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_compress_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - a.elements[i0] = libcrux_secrets_int_as_i16_59( - libcrux_ml_kem_vector_portable_compress_compress_message_coefficient( - libcrux_secrets_int_as_u16_f5(a.elements[i0]))); - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_1_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_compress_1(a); -} - -static KRML_MUSTINLINE uint32_t -libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( - uint8_t n, uint32_t value) { - return value & ((1U << (uint32_t)n) - 1U); -} - -static inline int16_t -libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( - uint8_t coefficient_bits, uint16_t fe) { - uint64_t compressed = libcrux_secrets_int_as_u64_ca(fe) - << (uint32_t)coefficient_bits; - compressed = compressed + 1664ULL; - compressed = compressed * 10321340ULL; - compressed = compressed >> 35U; - return libcrux_secrets_int_as_i16_b8( - libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( - coefficient_bits, libcrux_secrets_int_as_u32_a3(compressed))); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_decompress_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector z = - libcrux_ml_kem_vector_portable_vector_type_zero(); - libcrux_ml_kem_vector_portable_vector_type_PortableVector s = - libcrux_ml_kem_vector_portable_arithmetic_sub(z, &a); - libcrux_ml_kem_vector_portable_vector_type_PortableVector res = - libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( - s, (int16_t)1665); - return res; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_decompress_1_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_decompress_1(a); -} - -static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec, - int16_t zeta, size_t i, size_t j) { - int16_t t = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - vec->elements[j], - libcrux_secrets_int_public_integers_classify_27_39(zeta)); - int16_t a_minus_t = vec->elements[i] - t; - int16_t a_plus_t = vec->elements[i] + t; - vec->elements[j] = a_minus_t; - vec->elements[i] = a_plus_t; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)2U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)3U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)4U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)5U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)8U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)9U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)12U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)13U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1, int16_t zeta2, int16_t zeta3) { - return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1, - zeta2, zeta3); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1) { - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)4U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)5U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)2U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)3U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)8U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)9U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)10U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)11U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1) { - return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta) { - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)0U, - (size_t)8U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)1U, - (size_t)9U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)2U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)3U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)4U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)5U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)6U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)7U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) { - return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta); -} - -static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec, - int16_t zeta, size_t i, size_t j) { - int16_t a_minus_b = vec->elements[j] - vec->elements[i]; - int16_t a_plus_b = vec->elements[j] + vec->elements[i]; - int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( - a_plus_b); - int16_t o1 = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - a_minus_b, libcrux_secrets_int_public_integers_classify_27_39(zeta)); - vec->elements[i] = o0; - vec->elements[j] = o1; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)2U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)3U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)4U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)5U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)8U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)9U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)12U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)13U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1, int16_t zeta2, int16_t zeta3) { - return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( - a, zeta0, zeta1, zeta2, zeta3); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1) { - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)4U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)5U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)2U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)3U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)8U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)9U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)10U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)11U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1) { - return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0, - zeta1); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta) { - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)0U, - (size_t)8U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)1U, - (size_t)9U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)2U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)3U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)4U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)5U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)6U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)7U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) { - return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta); -} - -/** - Compute the product of two Kyber binomials with respect to the - modulus `X² - zeta`. - - This function almost implements <strong>Algorithm 11</strong> of the - NIST FIPS 203 standard, which is reproduced below: - - ```plaintext - Input: a₀, a₁, b₀, b₁ ∈ ℤq. - Input: γ ∈ ℤq. - Output: c₀, c₁ ∈ ℤq. - - c₀ ← a₀·b₀ + a₁·b₁·γ - c₁ ← a₀·b₁ + a₁·b₀ - return c₀, c₁ - ``` - We say "almost" because the coefficients output by this function are in - the Montgomery domain (unlike in the specification). - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *a, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta, - size_t i, libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) { - int16_t ai = a->elements[(size_t)2U * i]; - int16_t bi = b->elements[(size_t)2U * i]; - int16_t aj = a->elements[(size_t)2U * i + (size_t)1U]; - int16_t bj = b->elements[(size_t)2U * i + (size_t)1U]; - int32_t ai_bi = - libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bi); - int32_t aj_bj_ = - libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bj); - int16_t aj_bj = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - aj_bj_); - int32_t aj_bj_zeta = libcrux_secrets_int_as_i32_f5(aj_bj) * - libcrux_secrets_int_as_i32_f5(zeta); - int32_t ai_bi_aj_bj = ai_bi + aj_bj_zeta; - int16_t o0 = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - ai_bi_aj_bj); - int32_t ai_bj = - libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bj); - int32_t aj_bi = - libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bi); - int32_t ai_bj_aj_bi = ai_bj + aj_bi; - int16_t o1 = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - ai_bj_aj_bi); - out->elements[(size_t)2U * i] = o0; - out->elements[(size_t)2U * i + (size_t)1U] = o1; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_multiply( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - int16_t nzeta0 = -zeta0; - int16_t nzeta1 = -zeta1; - int16_t nzeta2 = -zeta2; - int16_t nzeta3 = -zeta3; - libcrux_ml_kem_vector_portable_vector_type_PortableVector out = - libcrux_ml_kem_vector_portable_vector_type_zero(); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta0), - (size_t)0U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta0), - (size_t)1U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta1), - (size_t)2U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta1), - (size_t)3U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta2), - (size_t)4U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta2), - (size_t)5U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta3), - (size_t)6U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta3), - (size_t)7U, &out); - return out; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_multiply_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1, - zeta2, zeta3); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[2U]) { - uint8_t result0 = - (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[0U]) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[1U]) << 1U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[2U]) << 2U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[3U]) << 3U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[4U]) << 4U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[5U]) << 5U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[6U]) << 6U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[7U]) << 7U; - uint8_t result1 = - (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[8U]) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[9U]) << 1U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[10U]) << 2U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[11U]) << 3U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[12U]) << 4U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[13U]) << 5U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[14U]) << 6U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[15U]) << 7U; - ret[0U] = result0; - ret[1U] = result1; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[2U]) { - uint8_t ret0[2U]; - libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_d4(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_1_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[2U]) { - libcrux_ml_kem_vector_portable_serialize_1(a, ret); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) { - int16_t result0 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) & 1U); - int16_t result1 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 1U & - 1U); - int16_t result2 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 2U & - 1U); - int16_t result3 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 3U & - 1U); - int16_t result4 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 4U & - 1U); - int16_t result5 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 5U & - 1U); - int16_t result6 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 6U & - 1U); - int16_t result7 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 7U & - 1U); - int16_t result8 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) & 1U); - int16_t result9 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 1U & - 1U); - int16_t result10 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 2U & - 1U); - int16_t result11 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 3U & - 1U); - int16_t result12 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 4U & - 1U); - int16_t result13 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 5U & - 1U); - int16_t result14 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 6U & - 1U); - int16_t result15 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 7U & - 1U); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {result0, result1, result2, result3, result4, result5, - result6, result7, result8, result9, result10, result11, - result12, result13, result14, result15}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_1( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_1(a); -} - -typedef struct uint8_t_x4_s { - uint8_t fst; - uint8_t snd; - uint8_t thd; - uint8_t f3; -} uint8_t_x4; - -static KRML_MUSTINLINE uint8_t_x4 -libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) { - uint8_t result0 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)0U, int16_t, int16_t *)); - uint8_t result1 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)2U, int16_t, int16_t *)); - uint8_t result2 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)4U, int16_t, int16_t *)); - uint8_t result3 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)6U, int16_t, int16_t *)); - return (KRML_CLITERAL(uint8_t_x4){ - .fst = result0, .snd = result1, .thd = result2, .f3 = result3}); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_4( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[8U]) { - uint8_t_x4 result0_3 = - libcrux_ml_kem_vector_portable_serialize_serialize_4_int( - Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)8U, - int16_t *)); - uint8_t_x4 result4_7 = - libcrux_ml_kem_vector_portable_serialize_serialize_4_int( - Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)16U, - int16_t *)); - ret[0U] = result0_3.fst; - ret[1U] = result0_3.snd; - ret[2U] = result0_3.thd; - ret[3U] = result0_3.f3; - ret[4U] = result4_7.fst; - ret[5U] = result4_7.snd; - ret[6U] = result4_7.thd; - ret[7U] = result4_7.f3; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_4( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[8U]) { - uint8_t ret0[8U]; - libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_76(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_4_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[8U]) { - libcrux_ml_kem_vector_portable_serialize_4(a, ret); -} - -static KRML_MUSTINLINE int16_t_x8 -libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( - Eurydice_slice bytes) { - int16_t v0 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) & - 15U); - int16_t v1 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) >> - 4U & - 15U); - int16_t v2 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) & - 15U); - int16_t v3 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >> - 4U & - 15U); - int16_t v4 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) & - 15U); - int16_t v5 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >> - 4U & - 15U); - int16_t v6 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) & - 15U); - int16_t v7 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >> - 4U & - 15U); - return (KRML_CLITERAL(int16_t_x8){.fst = v0, - .snd = v1, - .thd = v2, - .f3 = v3, - .f4 = v4, - .f5 = v5, - .f6 = v6, - .f7 = v7}); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) { - int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( - Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)4U, uint8_t *)); - int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( - Eurydice_slice_subslice3(bytes, (size_t)4U, (size_t)8U, uint8_t *)); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, - v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd, - v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_4( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_4(a); -} - -typedef struct uint8_t_x5_s { - uint8_t fst; - uint8_t snd; - uint8_t thd; - uint8_t f3; - uint8_t f4; -} uint8_t_x5; - -static KRML_MUSTINLINE uint8_t_x5 -libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) { - uint8_t r0 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255); - uint8_t r1 = - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)63) - << 2U | - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U & - (int16_t)3); - uint8_t r2 = - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) & (int16_t)15) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 6U & - (int16_t)15); - uint8_t r3 = - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) & (int16_t)3) - << 6U | - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 4U & - (int16_t)63); - uint8_t r4 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U & - (int16_t)255); - return (KRML_CLITERAL(uint8_t_x5){ - .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4}); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_10( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[20U]) { - uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)4U, - int16_t *)); - uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)8U, - int16_t *)); - uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)12U, - int16_t *)); - uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)16U, - int16_t *)); - ret[0U] = r0_4.fst; - ret[1U] = r0_4.snd; - ret[2U] = r0_4.thd; - ret[3U] = r0_4.f3; - ret[4U] = r0_4.f4; - ret[5U] = r5_9.fst; - ret[6U] = r5_9.snd; - ret[7U] = r5_9.thd; - ret[8U] = r5_9.f3; - ret[9U] = r5_9.f4; - ret[10U] = r10_14.fst; - ret[11U] = r10_14.snd; - ret[12U] = r10_14.thd; - ret[13U] = r10_14.f3; - ret[14U] = r10_14.f4; - ret[15U] = r15_19.fst; - ret[16U] = r15_19.snd; - ret[17U] = r15_19.thd; - ret[18U] = r15_19.f3; - ret[19U] = r15_19.f4; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_10( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[20U]) { - uint8_t ret0[20U]; - libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_57(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_10_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[20U]) { - libcrux_ml_kem_vector_portable_serialize_10(a, ret); -} - -static KRML_MUSTINLINE int16_t_x8 -libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( - Eurydice_slice bytes) { - int16_t r0 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) & - (int16_t)3) - << 8U | - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *)) & - (int16_t)255)); - int16_t r1 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) & - (int16_t)15) - << 6U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) >> - 2U); - int16_t r2 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) & - (int16_t)63) - << 4U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) >> - 4U); - int16_t r3 = libcrux_secrets_int_as_i16_f5( - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *)) - << 2U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) >> - 6U); - int16_t r4 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) & - (int16_t)3) - << 8U | - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *)) & - (int16_t)255)); - int16_t r5 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) & - (int16_t)15) - << 6U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) >> - 2U); - int16_t r6 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) & - (int16_t)63) - << 4U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) >> - 4U); - int16_t r7 = libcrux_secrets_int_as_i16_f5( - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *)) - << 2U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) >> - 6U); - return (KRML_CLITERAL(int16_t_x8){.fst = r0, - .snd = r1, - .thd = r2, - .f3 = r3, - .f4 = r4, - .f5 = r5, - .f6 = r6, - .f7 = r7}); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) { - int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( - Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)10U, uint8_t *)); - int16_t_x8 v8_15 = - libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( - Eurydice_slice_subslice3(bytes, (size_t)10U, (size_t)20U, uint8_t *)); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, - v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd, - v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_10( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_10(a); -} - -typedef struct uint8_t_x3_s { - uint8_t fst; - uint8_t snd; - uint8_t thd; -} uint8_t_x3; - -static KRML_MUSTINLINE uint8_t_x3 -libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) { - uint8_t r0 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255); - uint8_t r1 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U | - (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)15) - << 4U); - uint8_t r2 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U & - (int16_t)255); - return (KRML_CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2}); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_12( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[24U]) { - uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)2U, - int16_t *)); - uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)2U, (size_t)4U, - int16_t *)); - uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)6U, - int16_t *)); - uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)6U, (size_t)8U, - int16_t *)); - uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)10U, - int16_t *)); - uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)10U, (size_t)12U, - int16_t *)); - uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)14U, - int16_t *)); - uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)14U, (size_t)16U, - int16_t *)); - ret[0U] = r0_2.fst; - ret[1U] = r0_2.snd; - ret[2U] = r0_2.thd; - ret[3U] = r3_5.fst; - ret[4U] = r3_5.snd; - ret[5U] = r3_5.thd; - ret[6U] = r6_8.fst; - ret[7U] = r6_8.snd; - ret[8U] = r6_8.thd; - ret[9U] = r9_11.fst; - ret[10U] = r9_11.snd; - ret[11U] = r9_11.thd; - ret[12U] = r12_14.fst; - ret[13U] = r12_14.snd; - ret[14U] = r12_14.thd; - ret[15U] = r15_17.fst; - ret[16U] = r15_17.snd; - ret[17U] = r15_17.thd; - ret[18U] = r18_20.fst; - ret[19U] = r18_20.snd; - ret[20U] = r18_20.thd; - ret[21U] = r21_23.fst; - ret[22U] = r21_23.snd; - ret[23U] = r21_23.thd; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_12( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[24U]) { - uint8_t ret0[24U]; - libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_d2(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_12_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[24U]) { - libcrux_ml_kem_vector_portable_serialize_12(a, ret); -} - -typedef struct int16_t_x2_s { - int16_t fst; - int16_t snd; -} int16_t_x2; - -static KRML_MUSTINLINE int16_t_x2 -libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice bytes) { - int16_t byte0 = libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *)); - int16_t byte1 = libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)); - int16_t byte2 = libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)); - int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255); - int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15); - return (KRML_CLITERAL(int16_t_x2){.fst = r0, .snd = r1}); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) { - int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)3U, uint8_t *)); - int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)3U, (size_t)6U, uint8_t *)); - int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)6U, (size_t)9U, uint8_t *)); - int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)9U, (size_t)12U, uint8_t *)); - int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)12U, (size_t)15U, uint8_t *)); - int16_t_x2 v10_11 = - libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)15U, (size_t)18U, uint8_t *)); - int16_t_x2 v12_13 = - libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)18U, (size_t)21U, uint8_t *)); - int16_t_x2 v14_15 = - libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)21U, (size_t)24U, uint8_t *)); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {v0_1.fst, v0_1.snd, v2_3.fst, v2_3.snd, v4_5.fst, - v4_5.snd, v6_7.fst, v6_7.snd, v8_9.fst, v8_9.snd, - v10_11.fst, v10_11.snd, v12_13.fst, v12_13.snd, - v14_15.fst, v14_15.snd}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_12( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_12(a); -} - -static KRML_MUSTINLINE size_t -libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a, - Eurydice_slice result) { - size_t sampled = (size_t)0U; - for (size_t i = (size_t)0U; i < Eurydice_slice_len(a, uint8_t) / (size_t)3U; - i++) { - size_t i0 = i; - int16_t b1 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)0U, - uint8_t, uint8_t *); - int16_t b2 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)1U, - uint8_t, uint8_t *); - int16_t b3 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)2U, - uint8_t, uint8_t *); - int16_t d1 = (b2 & (int16_t)15) << 8U | b1; - int16_t d2 = b3 << 4U | b2 >> 4U; - if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) { - if (sampled < (size_t)16U) { - Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1; - sampled++; - } - } - if (d2 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) { - if (sampled < (size_t)16U) { - Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d2; - sampled++; - } - } - } - return sampled; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline size_t libcrux_ml_kem_vector_portable_rej_sample_b8( - Eurydice_slice a, Eurydice_slice out) { - return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out); -} - -#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR ((size_t)10U) - -#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE \ - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_RANK ((size_t)3U) - -#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE * LIBCRUX_ML_KEM_MLKEM768_RANK) - -#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR ((size_t)4U) - -#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE \ - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE) - -#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_RANK * \ - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE + (size_t)32U) - -#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_RANK * \ - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U) - -#define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \ - (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + \ - LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE) - -typedef libcrux_ml_kem_types_MlKemPrivateKey_d9 - libcrux_ml_kem_mlkem768_MlKem768PrivateKey; - -typedef libcrux_ml_kem_types_MlKemPublicKey_30 - libcrux_ml_kem_mlkem768_MlKem768PublicKey; - -#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT \ - (LIBCRUX_ML_KEM_MLKEM768_RANK * \ - LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE + \ - LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE + \ - LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \ - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector - -*/ -typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_1d_s { - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U]; -} libcrux_ml_kem_polynomial_PolynomialRingElement_1d; - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0_s { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d secret_as_ntt[3U]; -} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0; - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ZERO_d6_ea(void) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - repeat_expression[16U]; - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); - } - memcpy(lit.coefficients, repeat_expression, - (size_t)16U * - sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector)); - return lit; -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]> for libcrux_ml_kem::ind_cpa::decrypt::closure<Vector, K, -CIPHERTEXT_SIZE, VECTOR_U_ENCODED_SIZE, U_COMPRESSION_FACTOR, -V_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt.call_mut_0b -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- VECTOR_U_ENCODED_SIZE= 960 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) { - size_t i0 = i; - Eurydice_slice bytes = - Eurydice_slice_subslice3(serialized, i0 * (size_t)24U, - i0 * (size_t)24U + (size_t)24U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** - Call [`deserialize_to_uncompressed_ring_element`] for each ring element. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_vector -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_vector_1b( - Eurydice_slice secret_key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt) { - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea( - Eurydice_slice_subslice3( - secret_key, - i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - (i0 + (size_t)1U) * - LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - uint8_t *)); - secret_as_ntt[i0] = uu____0; - } -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]> for -libcrux_ml_kem::ind_cpa::deserialize_then_decompress_u::closure<Vector, K, -CIPHERTEXT_SIZE, U_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.call_mut_35 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- U_COMPRESSION_FACTOR= 10 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with -const generics -- COEFFICIENT_BITS= 10 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int32_t decompressed = - libcrux_secrets_int_as_i32_f5(a.elements[i0]) * - libcrux_secrets_int_as_i32_f5( - libcrux_secrets_int_public_integers_classify_27_39( - LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); - decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10); - decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1); - a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed); - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const -generics -- COEFFICIENT_BITS= 10 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef( - a); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) { - size_t i0 = i; - Eurydice_slice bytes = - Eurydice_slice_subslice3(serialized, i0 * (size_t)20U, - i0 * (size_t)20U + (size_t)20U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_deserialize_10_b8(bytes); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef( - coefficient); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- COMPRESSION_FACTOR= 10 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a( - Eurydice_slice serialized) { - return libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(serialized); -} - -typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s { - libcrux_ml_kem_vector_portable_vector_type_PortableVector fst; - libcrux_ml_kem_vector_portable_vector_type_PortableVector snd; -} libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2; - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 - libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - libcrux_ml_kem_vector_portable_vector_type_PortableVector b, - int16_t zeta_r) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector t = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b, - zeta_r); - b = libcrux_ml_kem_vector_portable_sub_b8(a, &t); - a = libcrux_ml_kem_vector_portable_add_b8(a, &t); - return (KRML_CLITERAL( - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a, - .snd = b}); -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t layer, size_t _initial_coefficient_bound) { - size_t step = (size_t)1U << (uint32_t)layer; - for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) { - size_t round = i0; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - size_t offset = round * step * (size_t)2U; - size_t offset_vec = offset / (size_t)16U; - size_t step_vec = step / (size_t)16U; - for (size_t i = offset_vec; i < offset_vec + step_vec; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 = - libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea( - re->coefficients[j], re->coefficients[j + step_vec], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst; - libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd; - re->coefficients[j] = x; - re->coefficients[j + step_vec] = y; - } - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t _initial_coefficient_bound) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8( - re->coefficients[round], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - re->coefficients[round] = uu____0; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t _initial_coefficient_bound) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U)); - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t _initial_coefficient_bound) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)2U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)3U)); - zeta_i[0U] = zeta_i[0U] + (size_t)3U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_barrett_reduce_b8( - myself->coefficients[i0]); - myself->coefficients[i0] = uu____0; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) { - libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(self); -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- VECTOR_U_COMPRESSION_FACTOR= 10 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_0a( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - size_t zeta_i = (size_t)0U; - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U, - (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, - (size_t)2U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U, - (size_t)3U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U, - (size_t)4U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)5U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)6U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)7U * (size_t)3328U); - libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); -} - -/** - Call [`deserialize_then_decompress_ring_element_u`] on each ring element - in the `ciphertext`. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- U_COMPRESSION_FACTOR= 10 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c( - uint8_t *ciphertext, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - u_as_ntt[i] = - libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c( - &lvalue, i); - } - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice((size_t)1088U, ciphertext, uint8_t), - uint8_t) / - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U); - i++) { - size_t i0 = i; - Eurydice_slice u_bytes = Eurydice_array_to_subslice3( - ciphertext, - i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U), - i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U) + - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U, - uint8_t *); - u_as_ntt[i0] = - libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a( - u_bytes); - libcrux_ml_kem_ntt_ntt_vector_u_0a(&u_as_ntt[i0]); - } - memcpy( - ret, u_as_ntt, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with -const generics -- COEFFICIENT_BITS= 4 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int32_t decompressed = - libcrux_secrets_int_as_i32_f5(a.elements[i0]) * - libcrux_secrets_int_as_i32_f5( - libcrux_secrets_int_public_integers_classify_27_39( - LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); - decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4); - decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1); - a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed); - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const -generics -- COEFFICIENT_BITS= 4 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1( - a); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) { - size_t i0 = i; - Eurydice_slice bytes = Eurydice_slice_subslice3( - serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_deserialize_4_b8(bytes); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1( - coefficient); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- COMPRESSION_FACTOR= 4 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89( - Eurydice_slice serialized) { - return libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(serialized); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ZERO -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ZERO_ea(void) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - repeat_expression[16U]; - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); - } - memcpy(lit.coefficients, repeat_expression, - (size_t)16U * - sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector)); - return lit; -} - -/** - Given two `KyberPolynomialRingElement`s in their NTT representations, - compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`, - the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation: - - ```plaintext - ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X² - - ζ^(2·BitRev₇(i) + 1)) - ``` - - This function almost implements <strong>Algorithm 10</strong> of the - NIST FIPS 203 standard, which is reproduced below: - - ```plaintext - Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆. - Output: An array ĥ ∈ ℤq. - - for(i ← 0; i < 128; i++) - (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1], - ζ^(2·BitRev₇(i) + 1)) end for return ĥ - ``` - We say "almost" because the coefficients of the ring element output by - this function are in the Montgomery domain. - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ntt_multiply_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d out = - libcrux_ml_kem_polynomial_ZERO_ea(); - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_ntt_multiply_b8( - &myself->coefficients[i0], &rhs->coefficients[i0], - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0), - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + - (size_t)1U), - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + - (size_t)2U), - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + - (size_t)3U)); - out.coefficients[i0] = uu____0; - } - return out; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ntt_multiply_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - return libcrux_ml_kem_polynomial_ntt_multiply_ea(self, rhs); -} - -/** - Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise - sum of their constituent coefficients. -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)16U, myself->coefficients, - libcrux_ml_kem_vector_portable_vector_type_PortableVector), - libcrux_ml_kem_vector_portable_vector_type_PortableVector); - i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0], - &rhs->coefficients[i0]); - myself->coefficients[i0] = uu____0; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - libcrux_ml_kem_polynomial_add_to_ring_element_1b(self, rhs); -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)2U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)3U)); - zeta_i[0U] = zeta_i[0U] - (size_t)3U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U)); - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8( - re->coefficients[round], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - re->coefficients[round] = uu____0; - } -} - -/** -A monomorphic instance of -libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 - libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - libcrux_ml_kem_vector_portable_vector_type_PortableVector b, - int16_t zeta_r) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b = - libcrux_ml_kem_vector_portable_sub_b8(b, &a); - a = libcrux_ml_kem_vector_portable_barrett_reduce_b8( - libcrux_ml_kem_vector_portable_add_b8(a, &b)); - b = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - a_minus_b, zeta_r); - return (KRML_CLITERAL( - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a, - .snd = b}); -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t layer) { - size_t step = (size_t)1U << (uint32_t)layer; - for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) { - size_t round = i0; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - size_t offset = round * step * (size_t)2U; - size_t offset_vec = - offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; - size_t step_vec = - step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; - for (size_t i = offset_vec; i < offset_vec + step_vec; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 = - libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea( - re->coefficients[j], re->coefficients[j + step_vec], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst; - libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd; - re->coefficients[j] = x; - re->coefficients[j + step_vec] = y; - } - } -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - size_t zeta_i = - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U; - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(&zeta_i, re); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(&zeta_i, re); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(&zeta_i, re); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)4U); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)5U); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)6U); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)7U); - libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_subtract_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - b.coefficients[i0], (int16_t)1441); - libcrux_ml_kem_vector_portable_vector_type_PortableVector diff = - libcrux_ml_kem_vector_portable_sub_b8(myself->coefficients[i0], - &coefficient_normal_form); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(diff); - b.coefficients[i0] = red; - } - return b; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_subtract_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) { - return libcrux_ml_kem_polynomial_subtract_reduce_ea(self, b); -} - -/** - The following functions compute various expressions involving - vectors and matrices. The computation of these expressions has been - abstracted away into these functions in order to save on loop iterations. - Compute v − InverseNTT(sᵀ ◦ NTT(u)) -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_message -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_matrix_compute_message_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *v, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *u_as_ntt) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&secret_as_ntt[i0], - &u_as_ntt[i0]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product); - } - libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result); - return libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(v, result); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.to_unsigned_field_modulus -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(a); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.compress_then_serialize_message with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_message_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, uint8_t ret[32U]) { - uint8_t serialized[32U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re.coefficients[i0]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_compressed = - libcrux_ml_kem_vector_portable_compress_1_b8(coefficient); - uint8_t bytes[2U]; - libcrux_ml_kem_vector_portable_serialize_1_b8(coefficient_compressed, - bytes); - Eurydice_slice_copy( - Eurydice_array_to_subslice3(serialized, (size_t)2U * i0, - (size_t)2U * i0 + (size_t)2U, uint8_t *), - Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t); - } - memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t)); -} - -/** - This function implements <strong>Algorithm 14</strong> of the - NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm. - - Algorithm 14 is reproduced below: - - ```plaintext - Input: decryption key dkₚₖₑ ∈ 𝔹^{384k}. - Input: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. - Output: message m ∈ 𝔹^{32}. - - c₁ ← c[0 : 32dᵤk] - c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)] - u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁)) - v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂)) - ŝ ← ByteDecode₁₂(dkₚₖₑ) - w ← v - NTT-¹(ŝᵀ ◦ NTT(u)) - m ← ByteEncode₁(Compress₁(w)) - return m - ``` - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- VECTOR_U_ENCODED_SIZE= 960 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_unpacked_42( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *secret_key, - uint8_t *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U]; - libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(ciphertext, u_as_ntt); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d v = - libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89( - Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, - (size_t)960U, uint8_t, size_t, - uint8_t[])); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d message = - libcrux_ml_kem_matrix_compute_message_1b(&v, secret_key->secret_as_ntt, - u_as_ntt); - uint8_t ret0[32U]; - libcrux_ml_kem_serialize_compress_then_serialize_message_ea(message, ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- VECTOR_U_ENCODED_SIZE= 960 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_42( - Eurydice_slice secret_key, uint8_t *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 - secret_key_unpacked; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - ret0[i] = libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(&lvalue, i); - } - memcpy( - secret_key_unpacked.secret_as_ntt, ret0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - libcrux_ml_kem_ind_cpa_deserialize_vector_1b( - secret_key, secret_key_unpacked.secret_as_ntt); - uint8_t ret1[32U]; - libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(&secret_key_unpacked, ciphertext, - ret1); - memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_4a -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_slice input, uint8_t ret[64U]) { - libcrux_ml_kem_hash_functions_portable_G(input, ret); -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF -with const generics -- LEN= 32 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_9e( - Eurydice_slice input, uint8_t ret[32U]) { - uint8_t digest[32U] = {0U}; - libcrux_sha3_portable_shake256( - Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)32U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a -with const generics -- K= 3 -- LEN= 32 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_41( - Eurydice_slice input, uint8_t ret[32U]) { - libcrux_ml_kem_hash_functions_portable_PRF_9e(input, ret); -} - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.unpacked.IndCpaPublicKeyUnpacked with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0_s { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d t_as_ntt[3U]; - uint8_t seed_for_A[32U]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U]; -} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0; - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_8b -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(void) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - uu____0[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); - } - uint8_t uu____1[32U] = {0U}; - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit; - memcpy( - lit.t_as_ntt, uu____0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression0[3U][3U]; - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); - } - memcpy(repeat_expression0[i0], repeat_expression, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - } - memcpy(lit.A, repeat_expression0, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - return lit; -} - -/** - Only use with public values. - - This MUST NOT be used with secret inputs, like its caller - `deserialize_ring_elements_reduced`. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) { - size_t i0 = i; - Eurydice_slice bytes = - Eurydice_slice_subslice3(serialized, i0 * (size_t)24U, - i0 * (size_t)24U + (size_t)24U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(coefficient); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** - See [deserialize_ring_elements_reduced_out]. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - Eurydice_slice public_key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *deserialized_pk) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(public_key, uint8_t) / - LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; - i++) { - size_t i0 = i; - Eurydice_slice ring_element = Eurydice_slice_subslice3( - public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + - LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - uint8_t *); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea( - ring_element); - deserialized_pk[i0] = uu____0; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash -with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_88_s { - libcrux_sha3_generic_keccak_KeccakState_17 shake128_state[3U]; -} libcrux_ml_kem_hash_functions_portable_PortableHash_88; - -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88 -libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0( - uint8_t (*input)[34U]) { - libcrux_ml_kem_hash_functions_portable_PortableHash_88 shake128_state; - libcrux_sha3_generic_keccak_KeccakState_17 repeat_expression[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - repeat_expression[i] = libcrux_sha3_portable_incremental_shake128_init(); - } - memcpy(shake128_state.shake128_state, repeat_expression, - (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_17)); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_incremental_shake128_absorb_final( - &shake128_state.shake128_state[i0], - Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t)); - } - return shake128_state; -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final_4a with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88 -libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0( - uint8_t (*input)[34U]) { - return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0( - input); -} - -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks with -const generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st, - uint8_t ret[3U][504U]) { - uint8_t out[3U][504U] = {{0U}}; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( - &st->shake128_state[i0], - Eurydice_array_to_slice((size_t)504U, out[i0], uint8_t)); - } - memcpy(ret, out, (size_t)3U * sizeof(uint8_t[504U])); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks_4a -with const generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self, - uint8_t ret[3U][504U]) { - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0( - self, ret); -} - -/** - If `bytes` contains a set of uniformly random bytes, this function - uniformly samples a ring element `â` that is treated as being the NTT - representation of the corresponding polynomial `a`. - - Since rejection sampling is used, it is possible the supplied bytes are - not enough to sample the element, in which case an `Err` is returned and the - caller must try again with a fresh set of bytes. - - This function <strong>partially</strong> implements <strong>Algorithm - 6</strong> of the NIST FIPS 203 standard, We say "partially" because this - implementation only accepts a finite set of bytes as input and returns an error - if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other - hand samples from an infinite stream of bytes until the ring element is filled. - Algorithm 6 is reproduced below: - - ```plaintext - Input: byte stream B ∈ 𝔹*. - Output: array â ∈ ℤ₂₅₆. - - i ← 0 - j ← 0 - while j < 256 do - d₁ ← B[i] + 256·(B[i+1] mod 16) - d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] - if d₁ < q then - â[j] ← d₁ - j ← j + 1 - end if - if d₂ < q and j < 256 then - â[j] ← d₂ - j ← j + 1 - end if - i ← i + 3 - end while - return â - ``` - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- N= 504 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89( - uint8_t (*randomness)[504U], size_t *sampled_coefficients, - int16_t (*out)[272U]) { - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - size_t i1 = i0; - for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) { - size_t r = i; - if (sampled_coefficients[i1] < - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8( - Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U, - r * (size_t)24U + (size_t)24U, - uint8_t *), - Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1], - sampled_coefficients[i1] + (size_t)16U, - int16_t *)); - size_t uu____0 = i1; - sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled; - } - } - } - bool done = true; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - if (sampled_coefficients[i0] >= - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - sampled_coefficients[i0] = - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; - } else { - done = false; - } - } - return done; -} - -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block with const -generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st, - uint8_t ret[3U][168U]) { - uint8_t out[3U][168U] = {{0U}}; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_incremental_shake128_squeeze_next_block( - &st->shake128_state[i0], - Eurydice_array_to_slice((size_t)168U, out[i0], uint8_t)); - } - memcpy(ret, out, (size_t)3U * sizeof(uint8_t[168U])); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block_4a with const -generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self, - uint8_t ret[3U][168U]) { - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(self, - ret); -} - -/** - If `bytes` contains a set of uniformly random bytes, this function - uniformly samples a ring element `â` that is treated as being the NTT - representation of the corresponding polynomial `a`. - - Since rejection sampling is used, it is possible the supplied bytes are - not enough to sample the element, in which case an `Err` is returned and the - caller must try again with a fresh set of bytes. - - This function <strong>partially</strong> implements <strong>Algorithm - 6</strong> of the NIST FIPS 203 standard, We say "partially" because this - implementation only accepts a finite set of bytes as input and returns an error - if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other - hand samples from an infinite stream of bytes until the ring element is filled. - Algorithm 6 is reproduced below: - - ```plaintext - Input: byte stream B ∈ 𝔹*. - Output: array â ∈ ℤ₂₅₆. - - i ← 0 - j ← 0 - while j < 256 do - d₁ ← B[i] + 256·(B[i+1] mod 16) - d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] - if d₁ < q then - â[j] ← d₁ - j ← j + 1 - end if - if d₂ < q and j < 256 then - â[j] ← d₂ - j ← j + 1 - end if - i ← i + 3 - end while - return â - ``` - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- N= 168 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890( - uint8_t (*randomness)[168U], size_t *sampled_coefficients, - int16_t (*out)[272U]) { - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - size_t i1 = i0; - for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) { - size_t r = i; - if (sampled_coefficients[i1] < - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8( - Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U, - r * (size_t)24U + (size_t)24U, - uint8_t *), - Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1], - sampled_coefficients[i1] + (size_t)16U, - int16_t *)); - size_t uu____0 = i1; - sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled; - } - } - } - bool done = true; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - if (sampled_coefficients[i0] >= - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - sampled_coefficients[i0] = - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; - } else { - done = false; - } - } - return done; -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_slice a) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result = - libcrux_ml_kem_polynomial_ZERO_ea(); - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_from_i16_array_b8( - Eurydice_slice_subslice3(a, i0 * (size_t)16U, - (i0 + (size_t)1U) * (size_t)16U, - int16_t *)); - result.coefficients[i0] = uu____0; - } - return result; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_slice a) { - return libcrux_ml_kem_polynomial_from_i16_array_ea(a); -} - -/** -This function found in impl {core::ops::function::FnMut<(@Array<i16, 272usize>), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@2]> for libcrux_ml_kem::sampling::sample_from_xof::closure<Vector, -Hasher, K>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.call_mut_e7 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b( - void **_, int16_t tupled_args[272U]) { - int16_t s[272U]; - memcpy(s, tupled_args, (size_t)272U * sizeof(int16_t)); - return libcrux_ml_kem_polynomial_from_i16_array_d6_ea( - Eurydice_array_to_subslice3(s, (size_t)0U, (size_t)256U, int16_t *)); -} - -/** -A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_2b( - uint8_t (*seeds)[34U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - size_t sampled_coefficients[3U] = {0U}; - int16_t out[3U][272U] = {{0U}}; - libcrux_ml_kem_hash_functions_portable_PortableHash_88 xof_state = - libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0( - seeds); - uint8_t randomness0[3U][504U]; - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0( - &xof_state, randomness0); - bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89( - randomness0, sampled_coefficients, out); - while (true) { - if (done) { - break; - } else { - uint8_t randomness[3U][168U]; - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0( - &xof_state, randomness); - done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890( - randomness, sampled_coefficients, out); - } - } - /* Passing arrays by value in Rust generates a copy in C */ - int16_t copy_of_out[3U][272U]; - memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U])); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - ret0[i] = libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b( - &lvalue, copy_of_out[i]); - } - memcpy( - ret, ret0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** -A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_2b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*A_transpose)[3U], - uint8_t *seed, bool transpose) { - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - size_t i1 = i0; - uint8_t seeds[3U][34U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)34U, seed, seeds[i], uint8_t, void *); - } - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t j = i; - seeds[j][32U] = (uint8_t)i1; - seeds[j][33U] = (uint8_t)j; - } - libcrux_ml_kem_polynomial_PolynomialRingElement_1d sampled[3U]; - libcrux_ml_kem_sampling_sample_from_xof_2b(seeds, sampled); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, sampled, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t j = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d sample = sampled[j]; - if (transpose) { - A_transpose[j][i1] = sample; - } else { - A_transpose[i1][j] = sample; - } - } - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key_mut -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f( - Eurydice_slice public_key, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - *unpacked_public_key) { - Eurydice_slice uu____0 = Eurydice_slice_subslice_to( - public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]); - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - uu____0, unpacked_public_key->t_as_ntt); - Eurydice_slice seed = Eurydice_slice_subslice_from( - public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] = - unpacked_public_key->A; - uint8_t ret[34U]; - libcrux_ml_kem_utils_into_padded_array_b6(seed, ret); - libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, false); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f( - Eurydice_slice public_key) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - unpacked_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(); - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(public_key, - &unpacked_public_key); - return unpacked_public_key; -} - -/** -A monomorphic instance of K. -with types libcrux_ml_kem_polynomial_PolynomialRingElement -libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t], -libcrux_ml_kem_polynomial_PolynomialRingElement -libcrux_ml_kem_vector_portable_vector_type_PortableVector - -*/ -typedef struct tuple_ed_s { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d fst[3U]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d snd; -} tuple_ed; - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure<Vector, Hasher, -K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE, ETA2, -ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2, -TraitClause@3]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_f1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- C1_LEN= 960 -- U_COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN -with const generics -- K= 3 -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_41( - uint8_t (*input)[33U], uint8_t ret[3U][128U]) { - uint8_t out[3U][128U] = {{0U}}; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_shake256( - Eurydice_array_to_slice((size_t)128U, out[i0], uint8_t), - Eurydice_array_to_slice((size_t)33U, input[i0], uint8_t)); - } - memcpy(ret, out, (size_t)3U * sizeof(uint8_t[128U])); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_4a -with const generics -- K= 3 -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41( - uint8_t (*input)[33U], uint8_t ret[3U][128U]) { - libcrux_ml_kem_hash_functions_portable_PRFxN_41(input, ret); -} - -/** - Given a series of uniformly random bytes in `randomness`, for some number - `eta`, the `sample_from_binomial_distribution_{eta}` functions sample a ring - element from a binomial distribution centered at 0 that uses two sets of `eta` - coin flips. If, for example, `eta = ETA`, each ring coefficient is a value `v` - such such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and: - - ```plaintext - - If v < 0, Pr[v] = Pr[-v] - - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA) - ``` - - The values `v < 0` are mapped to the appropriate `KyberFieldElement`. - - The expected value is: - - ```plaintext - E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1] - + (ETA)Pr[ETA] = 0 since Pr[-v] = Pr[v] when v < 0. - ``` - - And the variance is: - - ```plaintext - Var(X) = E[(X - E[X])^2] - = E[X^2] - = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / - 2^(2 * ETA)) = ETA / 2 - ``` - - This function implements <strong>Algorithm 7</strong> of the NIST FIPS 203 - standard, which is reproduced below: - - ```plaintext - Input: byte array B ∈ 𝔹^{64η}. - Output: array f ∈ ℤ₂₅₆. - - b ← BytesToBits(B) - for (i ← 0; i < 256; i++) - x ← ∑(j=0 to η - 1) b[2iη + j] - y ← ∑(j=0 to η - 1) b[2iη + η + j] - f[i] ← x−y mod q - end for - return f - ``` - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea( - Eurydice_slice randomness) { - int16_t sampled_i16s[256U] = {0U}; - for (size_t i0 = (size_t)0U; - i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) { - size_t chunk_number = i0; - Eurydice_slice byte_chunk = Eurydice_slice_subslice3( - randomness, chunk_number * (size_t)4U, - chunk_number * (size_t)4U + (size_t)4U, uint8_t *); - uint32_t random_bits_as_u32 = - (((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t, - uint8_t *) | - (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t, - uint8_t *) - << 8U) | - (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t, - uint8_t *) - << 16U) | - (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)3U, uint8_t, - uint8_t *) - << 24U; - uint32_t even_bits = random_bits_as_u32 & 1431655765U; - uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U; - uint32_t coin_toss_outcomes = even_bits + odd_bits; - for (uint32_t i = 0U; i < 32U / 4U; i++) { - uint32_t outcome_set = i; - uint32_t outcome_set0 = outcome_set * 4U; - int16_t outcome_1 = - (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U); - int16_t outcome_2 = - (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U); - size_t offset = (size_t)(outcome_set0 >> 2U); - sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2; - } - } - return libcrux_ml_kem_polynomial_from_i16_array_d6_ea( - Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_binomial_distribution with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- ETA= 2 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_slice randomness) { - return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea( - randomness); -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U; - for (size_t i = (size_t)0U; i < step; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector t = - libcrux_ml_kem_vector_portable_multiply_by_constant_b8( - re->coefficients[j + step], (int16_t)-1600); - re->coefficients[j + step] = - libcrux_ml_kem_vector_portable_sub_b8(re->coefficients[j], &t); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 = - libcrux_ml_kem_vector_portable_add_b8(re->coefficients[j], &t); - re->coefficients[j] = uu____1; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - libcrux_ml_kem_ntt_ntt_at_layer_7_ea(re); - size_t zeta_i = (size_t)1U; - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, - (size_t)11207U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U, - (size_t)11207U + (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea( - &zeta_i, re, (size_t)4U, (size_t)11207U + (size_t)2U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_3_ea( - &zeta_i, re, (size_t)11207U + (size_t)3U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_2_ea( - &zeta_i, re, (size_t)11207U + (size_t)4U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_1_ea( - &zeta_i, re, (size_t)11207U + (size_t)5U * (size_t)3328U); - libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); -} - -/** - Sample a vector of ring elements from a centered binomial distribution and - convert them into their NTT representations. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- ETA= 2 -- ETA_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE uint8_t -libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re_as_ntt, - uint8_t *prf_input, uint8_t domain_separator) { - uint8_t prf_inputs[3U][33U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *); - } - domain_separator = - libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator); - uint8_t prf_outputs[3U][128U]; - libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - re_as_ntt[i0] = - libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t)); - libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(&re_as_ntt[i0]); - } - return domain_separator; -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure#1<Vector, -Hasher, K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE, -ETA2, ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2, -TraitClause@3]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_dd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- C1_LEN= 960 -- U_COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** - Sample a vector of ring elements from a centered binomial distribution. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- ETA2_RANDOMNESS_SIZE= 128 -- ETA2= 2 -*/ -static KRML_MUSTINLINE uint8_t -libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b( - uint8_t *prf_input, uint8_t domain_separator, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1) { - uint8_t prf_inputs[3U][33U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *); - } - domain_separator = - libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator); - uint8_t prf_outputs[3U][128U]; - libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t)); - error_1[i0] = uu____0; - } - return domain_separator; -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF -with const generics -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_a6( - Eurydice_slice input, uint8_t ret[128U]) { - uint8_t digest[128U] = {0U}; - libcrux_sha3_portable_shake256( - Eurydice_array_to_slice((size_t)128U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)128U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a -with const generics -- K= 3 -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_410( - Eurydice_slice input, uint8_t ret[128U]) { - libcrux_ml_kem_hash_functions_portable_PRF_a6(input, ret); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]> for libcrux_ml_kem::matrix::compute_vector_u::closure<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.call_mut_a8 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(void **_, - size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - myself->coefficients[j], (int16_t)1441); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum = - libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, - &error->coefficients[j]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); - myself->coefficients[j] = red; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - libcrux_ml_kem_polynomial_add_error_reduce_ea(self, error); -} - -/** - Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁ -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*a_as_ntt)[3U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - result[i] = - libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(&lvalue, i); - } - for (size_t i0 = (size_t)0U; - i0 < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, a_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]); - i0++) { - size_t i1 = i0; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = a_as_ntt[i1]; - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, row, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t j = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *a_element = &row[j]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(a_element, &r_as_ntt[j]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result[i1], - &product); - } - libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result[i1]); - libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(&result[i1], &error_1[i1]); - } - memcpy( - ret, result, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress -with const generics -- COEFFICIENT_BITS= 10 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_compress_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int16_t uu____0 = libcrux_secrets_int_as_i16_f5( - libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( - (uint8_t)(int32_t)10, - libcrux_secrets_int_as_u16_f5(a.elements[i0]))); - a.elements[i0] = uu____0; - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 -with const generics -- COEFFICIENT_BITS= 10 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_b8_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_compress_ef(a); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- OUT_LEN= 320 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_10_ff( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) { - uint8_t serialized[320U] = {0U}; - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_compress_b8_ef( - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re->coefficients[i0])); - uint8_t bytes[20U]; - libcrux_ml_kem_vector_portable_serialize_10_b8(coefficient, bytes); - Eurydice_slice_copy( - Eurydice_array_to_subslice3(serialized, (size_t)20U * i0, - (size_t)20U * i0 + (size_t)20U, uint8_t *), - Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t); - } - memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- COMPRESSION_FACTOR= 10 -- OUT_LEN= 320 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) { - uint8_t uu____0[320U]; - libcrux_ml_kem_serialize_compress_then_serialize_10_ff(re, uu____0); - memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t)); -} - -/** - Call [`compress_then_serialize_ring_element_u`] on each ring element. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- OUT_LEN= 960 -- COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d input[3U], - Eurydice_slice out) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, input, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = input[i0]; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, i0 * ((size_t)960U / (size_t)3U), - (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t *); - uint8_t ret[320U]; - libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(&re, - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t); - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- C1_LEN= 960 -- U_COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_ed libcrux_ml_kem_ind_cpa_encrypt_c1_85( - Eurydice_slice randomness, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix)[3U], - Eurydice_slice ciphertext) { - uint8_t prf_input[33U]; - libcrux_ml_kem_utils_into_padded_array_c8(randomness, prf_input); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - r_as_ntt[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(&lvalue, i); - } - uint8_t domain_separator0 = - libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(r_as_ntt, prf_input, - 0U); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_1[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - error_1[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(&lvalue, i); - } - uint8_t domain_separator = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b( - prf_input, domain_separator0, error_1); - prf_input[32U] = domain_separator; - uint8_t prf_output[128U]; - libcrux_ml_kem_hash_functions_portable_PRF_4a_410( - Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 = - libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d u[3U]; - libcrux_ml_kem_matrix_compute_vector_u_1b(matrix, r_as_ntt, error_1, u); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U]; - memcpy( - uu____0, u, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(uu____0, ciphertext); - /* Passing arrays by value in Rust generates a copy in C */ - libcrux_ml_kem_polynomial_PolynomialRingElement_1d copy_of_r_as_ntt[3U]; - memcpy( - copy_of_r_as_ntt, r_as_ntt, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - tuple_ed lit; - memcpy( - lit.fst, copy_of_r_as_ntt, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - lit.snd = error_2; - return lit; -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_message with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea( - uint8_t *serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_compressed = - libcrux_ml_kem_vector_portable_deserialize_1_b8( - Eurydice_array_to_subslice3(serialized, (size_t)2U * i0, - (size_t)2U * i0 + (size_t)2U, - uint8_t *)); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_decompress_1_b8(coefficient_compressed); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_add_message_error_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - result.coefficients[i0], (int16_t)1441); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum1 = - libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0], - &message->coefficients[i0]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum2 = - libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &sum1); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum2); - result.coefficients[i0] = red; - } - return result; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) { - return libcrux_ml_kem_polynomial_add_message_error_reduce_ea(self, message, - result); -} - -/** - Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_matrix_compute_ring_element_v_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&t_as_ntt[i0], - &r_as_ntt[i0]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product); - } - libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result); - return libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea( - error_2, message, result); -} - -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress -with const generics -- COEFFICIENT_BITS= 4 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_compress_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int16_t uu____0 = libcrux_secrets_int_as_i16_f5( - libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( - (uint8_t)(int32_t)4, - libcrux_secrets_int_as_u16_f5(a.elements[i0]))); - a.elements[i0] = uu____0; - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 -with const generics -- COEFFICIENT_BITS= 4 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_b8_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_compress_d1(a); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_4_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, - Eurydice_slice serialized) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_compress_b8_d1( - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re.coefficients[i0])); - uint8_t bytes[8U]; - libcrux_ml_kem_vector_portable_serialize_4_b8(coefficient, bytes); - Eurydice_slice_copy( - Eurydice_slice_subslice3(serialized, (size_t)8U * i0, - (size_t)8U * i0 + (size_t)8U, uint8_t *), - Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t); - } -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- COMPRESSION_FACTOR= 4 -- OUT_LEN= 128 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, Eurydice_slice out) { - libcrux_ml_kem_serialize_compress_then_serialize_4_ea(re, out); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c2 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- V_COMPRESSION_FACTOR= 4 -- C2_LEN= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_c2_6c( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2, - uint8_t *message, Eurydice_slice ciphertext) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d message_as_ring_element = - libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(message); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d v = - libcrux_ml_kem_matrix_compute_ring_element_v_1b( - t_as_ntt, r_as_ntt, error_2, &message_as_ring_element); - libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c( - v, ciphertext); -} - -/** - This function implements <strong>Algorithm 13</strong> of the - NIST FIPS 203 specification; this is the Kyber CPA-PKE encryption algorithm. - - Algorithm 13 is reproduced below: - - ```plaintext - Input: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. - Input: message m ∈ 𝔹^{32}. - Input: encryption randomness r ∈ 𝔹^{32}. - Output: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. - - N ← 0 - t̂ ← ByteDecode₁₂(ekₚₖₑ[0:384k]) - ρ ← ekₚₖₑ[384k: 384k + 32] - for (i ← 0; i < k; i++) - for(j ← 0; j < k; j++) - Â[i,j] ← SampleNTT(XOF(ρ, i, j)) - end for - end for - for(i ← 0; i < k; i++) - r[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(r,N)) - N ← N + 1 - end for - for(i ← 0; i < k; i++) - e₁[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) - N ← N + 1 - end for - e₂ ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) - r̂ ← NTT(r) - u ← NTT-¹(Âᵀ ◦ r̂) + e₁ - μ ← Decompress₁(ByteDecode₁(m))) - v ← NTT-¹(t̂ᵀ ◦ rˆ) + e₂ + μ - c₁ ← ByteEncode_{dᵤ}(Compress_{dᵤ}(u)) - c₂ ← ByteEncode_{dᵥ}(Compress_{dᵥ}(v)) - return c ← (c₁ ‖ c₂) - ``` - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_unpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_LEN= 960 -- C2_LEN= 128 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key, - uint8_t *message, Eurydice_slice randomness, uint8_t ret[1088U]) { - uint8_t ciphertext[1088U] = {0U}; - tuple_ed uu____0 = libcrux_ml_kem_ind_cpa_encrypt_c1_85( - randomness, public_key->A, - Eurydice_array_to_subslice3(ciphertext, (size_t)0U, (size_t)960U, - uint8_t *)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U]; - memcpy( - r_as_ntt, uu____0.fst, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 = uu____0.snd; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____1 = - public_key->t_as_ntt; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____2 = r_as_ntt; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____3 = &error_2; - uint8_t *uu____4 = message; - libcrux_ml_kem_ind_cpa_encrypt_c2_6c( - uu____1, uu____2, uu____3, uu____4, - Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, (size_t)960U, - uint8_t, size_t, uint8_t[])); - memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_LEN= 960 -- C2_LEN= 128 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_2a( - Eurydice_slice public_key, uint8_t *message, Eurydice_slice randomness, - uint8_t ret[1088U]) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - unpacked_public_key = - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(public_key); - uint8_t ret0[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&unpacked_public_key, message, - randomness, ret0); - memcpy(ret, ret0, (size_t)1088U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::variant::Variant for -libcrux_ml_kem::variant::MlKem} -*/ -/** -A monomorphic instance of libcrux_ml_kem.variant.kdf_39 -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_39_d6( - Eurydice_slice shared_secret, uint8_t *_, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t), - shared_secret, uint8_t); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** - This code verifies on some machines, runs out of memory on others -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_decapsulate_62( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - Eurydice_slice_uint8_t_x4 uu____0 = - libcrux_ml_kem_types_unpack_private_key_b4( - Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t)); - Eurydice_slice ind_cpa_secret_key = uu____0.fst; - Eurydice_slice ind_cpa_public_key = uu____0.snd; - Eurydice_slice ind_cpa_public_key_hash = uu____0.thd; - Eurydice_slice implicit_rejection_value = uu____0.f3; - uint8_t decrypted[32U]; - libcrux_ml_kem_ind_cpa_decrypt_42(ind_cpa_secret_key, ciphertext->value, - decrypted); - uint8_t to_hash0[64U]; - libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0); - Eurydice_slice_copy( - Eurydice_array_to_subslice_from( - (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]), - ind_cpa_public_key_hash, uint8_t); - uint8_t hashed[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed); - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret0 = uu____1.fst; - Eurydice_slice pseudorandomness = uu____1.snd; - uint8_t to_hash[1120U]; - libcrux_ml_kem_utils_into_padded_array_15(implicit_rejection_value, to_hash); - Eurydice_slice uu____2 = Eurydice_array_to_subslice_from( - (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]); - Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - uint8_t); - uint8_t implicit_rejection_shared_secret0[32U]; - libcrux_ml_kem_hash_functions_portable_PRF_4a_41( - Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t), - implicit_rejection_shared_secret0); - uint8_t expected_ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_2a(ind_cpa_public_key, decrypted, - pseudorandomness, expected_ciphertext); - uint8_t implicit_rejection_shared_secret[32U]; - libcrux_ml_kem_variant_kdf_39_d6( - Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0, - uint8_t), - libcrux_ml_kem_types_as_slice_a9_80(ciphertext), - implicit_rejection_shared_secret); - uint8_t shared_secret[32U]; - libcrux_ml_kem_variant_kdf_39_d6( - shared_secret0, libcrux_ml_kem_types_as_slice_a9_80(ciphertext), - shared_secret); - uint8_t ret0[32U]; - libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( - libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t), - Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t), - Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret, - uint8_t), - ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -/** - Portable decapsulate -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static inline void -libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_decapsulate_62(private_key, ciphertext, ret); -} - -/** - Decapsulate ML-KEM 768 - - Generates an [`MlKemSharedSecret`]. - The input is a reference to an [`MlKem768PrivateKey`] and an - [`MlKem768Ciphertext`]. -*/ -static inline void libcrux_ml_kem_mlkem768_portable_decapsulate( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35( - private_key, ciphertext, ret); -} - -/** -This function found in impl {libcrux_ml_kem::variant::Variant for -libcrux_ml_kem::variant::MlKem} -*/ -/** -A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_39 -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_39_9c( - Eurydice_slice randomness, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t), - randomness, uint8_t); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for -libcrux_ml_kem::hash_functions::portable::PortableHash<K>} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_4a -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_slice input, uint8_t ret[32U]) { - libcrux_ml_kem_hash_functions_portable_H(input, ret); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_encapsulate_ca( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) { - uint8_t randomness0[32U]; - libcrux_ml_kem_variant_entropy_preprocess_39_9c( - Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0); - uint8_t to_hash[64U]; - libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash); - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, - size_t, uint8_t[]); - uint8_t ret0[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_slice((size_t)1184U, - libcrux_ml_kem_types_as_slice_e6_d0(public_key), - uint8_t), - ret0); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t); - uint8_t hashed[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed); - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret = uu____1.fst; - Eurydice_slice pseudorandomness = uu____1.snd; - uint8_t ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_2a( - Eurydice_array_to_slice((size_t)1184U, - libcrux_ml_kem_types_as_slice_e6_d0(public_key), - uint8_t), - randomness0, pseudorandomness, ciphertext); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_ciphertext[1088U]; - memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t)); - tuple_c2 lit; - lit.fst = libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext); - uint8_t ret[32U]; - libcrux_ml_kem_variant_kdf_39_d6(shared_secret, ciphertext, ret); - memcpy(lit.snd, ret, (size_t)32U * sizeof(uint8_t)); - return lit; -} - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static inline tuple_c2 -libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) { - return libcrux_ml_kem_ind_cca_encapsulate_ca(public_key, randomness); -} - -/** - Encapsulate ML-KEM 768 - - Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. - The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`] - bytes of `randomness`. -*/ -static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - uint8_t randomness[32U]) { - return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd( - public_key, randomness); -} - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cpa::unpacked::IndCpaPrivateKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_70 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 -libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(void) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 lit; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); - } - memcpy( - lit.secret_as_ntt, repeat_expression, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::variant::Variant for -libcrux_ml_kem::variant::MlKem} -*/ -/** -A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_39 -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_39_9c( - Eurydice_slice key_generation_seed, uint8_t ret[64U]) { - uint8_t seed[33U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - seed, (size_t)0U, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *), - key_generation_seed, uint8_t); - seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] = - (uint8_t)(size_t)3U; - uint8_t ret0[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0); - memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t)); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@3]> for -libcrux_ml_kem::ind_cpa::generate_keypair_unpacked::closure<Vector, Hasher, -Scheme, K, ETA1, ETA1_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, -TraitClause@2, TraitClause@3, TraitClause@4, TraitClause@5]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.generate_keypair_unpacked.call_mut_73 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.to_standard_domain -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_polynomial_to_standard_domain_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) { - return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - vector, - LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_polynomial_add_standard_error_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_polynomial_to_standard_domain_ea( - myself->coefficients[j]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum = - libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, - &error->coefficients[j]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); - myself->coefficients[j] = red; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(self, error); -} - -/** - Compute  ◦ ŝ + ê -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix_A)[3U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *s_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_as_ntt) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, matrix_A, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]); - i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = matrix_A[i0]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - t_as_ntt[i0] = uu____0; - for (size_t i1 = (size_t)0U; - i1 < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, row, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i1++) { - size_t j = i1; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *matrix_element = - &row[j]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(matrix_element, - &s_as_ntt[j]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&t_as_ntt[i0], - &product); - } - libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea( - &t_as_ntt[i0], &error_as_ntt[i0]); - } -} - -/** - This function implements most of <strong>Algorithm 12</strong> of the - NIST FIPS 203 specification; this is the Kyber CPA-PKE key generation - algorithm. - - We say "most of" since Algorithm 12 samples the required randomness within - the function itself, whereas this implementation expects it to be provided - through the `key_generation_seed` parameter. - - Algorithm 12 is reproduced below: - - ```plaintext - Output: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. - Output: decryption key dkₚₖₑ ∈ 𝔹^{384k}. - - d ←$ B - (ρ,σ) ← G(d) - N ← 0 - for (i ← 0; i < k; i++) - for(j ← 0; j < k; j++) - Â[i,j] ← SampleNTT(XOF(ρ, i, j)) - end for - end for - for(i ← 0; i < k; i++) - s[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(σ,N)) - N ← N + 1 - end for - for(i ← 0; i < k; i++) - e[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(σ,N)) - N ← N + 1 - end for - ŝ ← NTT(s) - ê ← NTT(e) - t̂ ← Â◦ŝ + ê - ekₚₖₑ ← ByteEncode₁₂(t̂) ‖ ρ - dkₚₖₑ ← ByteEncode₁₂(ŝ) - ``` - - The NIST FIPS 203 standard can be found at - <https://csrc.nist.gov/pubs/fips/203/ipd>. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c( - Eurydice_slice key_generation_seed, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key) { - uint8_t hashed[64U]; - libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(key_generation_seed, hashed); - Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U, - uint8_t, Eurydice_slice_uint8_t_x2); - Eurydice_slice seed_for_A = uu____0.fst; - Eurydice_slice seed_for_secret_and_error = uu____0.snd; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] = - public_key->A; - uint8_t ret[34U]; - libcrux_ml_kem_utils_into_padded_array_b6(seed_for_A, ret); - libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, true); - uint8_t prf_input[33U]; - libcrux_ml_kem_utils_into_padded_array_c8(seed_for_secret_and_error, - prf_input); - uint8_t domain_separator = - libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b( - private_key->secret_as_ntt, prf_input, 0U); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_as_ntt[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - error_as_ntt[i] = - libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(&lvalue, - i); - } - libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(error_as_ntt, prf_input, - domain_separator); - libcrux_ml_kem_matrix_compute_As_plus_e_1b( - public_key->t_as_ntt, public_key->A, private_key->secret_as_ntt, - error_as_ntt); - uint8_t uu____2[32U]; - Result_fb dst; - Eurydice_slice_to_array2(&dst, seed_for_A, Eurydice_slice, uint8_t[32U], - TryFromSliceError); - unwrap_26_b3(dst, uu____2); - memcpy(public_key->seed_for_A, uu____2, (size_t)32U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.serialize_uncompressed_ring_element with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[384U]) { - uint8_t serialized[384U] = {0U}; - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re->coefficients[i0]); - uint8_t bytes[24U]; - libcrux_ml_kem_vector_portable_serialize_12_b8(coefficient, bytes); - Eurydice_slice_copy( - Eurydice_array_to_subslice3(serialized, (size_t)24U * i0, - (size_t)24U * i0 + (size_t)24U, uint8_t *), - Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t); - } - memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t)); -} - -/** - Call [`serialize_uncompressed_ring_element`] for each ring element. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_vector -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_vector_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *key, - Eurydice_slice out) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = key[i0]; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - uint8_t *); - uint8_t ret[384U]; - libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(&re, ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)384U, ret, uint8_t), uint8_t); - } -} - -/** - Concatenate `t` and `ρ` into the public key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key_mut -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - Eurydice_slice seed_for_a, uint8_t *serialized) { - libcrux_ml_kem_ind_cpa_serialize_vector_1b( - t_as_ntt, - Eurydice_array_to_subslice3( - serialized, (size_t)0U, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t *)); - Eurydice_slice_copy( - Eurydice_array_to_subslice_from( - (size_t)1184U, serialized, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t, size_t, uint8_t[]), - seed_for_a, uint8_t); -} - -/** - Concatenate `t` and `ρ` into the public key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_89( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - Eurydice_slice seed_for_a, uint8_t ret[1184U]) { - uint8_t public_key_serialized[1184U] = {0U}; - libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(t_as_ntt, seed_for_a, - public_key_serialized); - memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t)); -} - -/** - Serialize the secret key from the unpacked key pair generation. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_unpacked_secret_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PRIVATE_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static inline libcrux_ml_kem_utils_extraction_helper_Keypair768 -libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key) { - uint8_t public_key_serialized[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - public_key->t_as_ntt, - Eurydice_array_to_slice((size_t)32U, public_key->seed_for_A, uint8_t), - public_key_serialized); - uint8_t secret_key_serialized[1152U] = {0U}; - libcrux_ml_kem_ind_cpa_serialize_vector_1b( - private_key->secret_as_ntt, - Eurydice_array_to_slice((size_t)1152U, secret_key_serialized, uint8_t)); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_secret_key_serialized[1152U]; - memcpy(copy_of_secret_key_serialized, secret_key_serialized, - (size_t)1152U * sizeof(uint8_t)); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_public_key_serialized[1184U]; - memcpy(copy_of_public_key_serialized, public_key_serialized, - (size_t)1184U * sizeof(uint8_t)); - libcrux_ml_kem_utils_extraction_helper_Keypair768 lit; - memcpy(lit.fst, copy_of_secret_key_serialized, - (size_t)1152U * sizeof(uint8_t)); - memcpy(lit.snd, copy_of_public_key_serialized, - (size_t)1184U * sizeof(uint8_t)); - return lit; -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- PRIVATE_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_utils_extraction_helper_Keypair768 -libcrux_ml_kem_ind_cpa_generate_keypair_ea(Eurydice_slice key_generation_seed) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 private_key = - libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(); - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 public_key = - libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(); - libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c( - key_generation_seed, &private_key, &public_key); - return libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(&public_key, - &private_key); -} - -/** - Serialize the secret key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key_mut -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SERIALIZED_KEY_LEN= 2400 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6( - Eurydice_slice private_key, Eurydice_slice public_key, - Eurydice_slice implicit_rejection_value, uint8_t *serialized) { - size_t pointer = (size_t)0U; - uint8_t *uu____0 = serialized; - size_t uu____1 = pointer; - size_t uu____2 = pointer; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t), - uint8_t *), - private_key, uint8_t); - pointer = pointer + Eurydice_slice_len(private_key, uint8_t); - uint8_t *uu____3 = serialized; - size_t uu____4 = pointer; - size_t uu____5 = pointer; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t), - uint8_t *), - public_key, uint8_t); - pointer = pointer + Eurydice_slice_len(public_key, uint8_t); - Eurydice_slice uu____6 = Eurydice_array_to_subslice3( - serialized, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, - uint8_t *); - uint8_t ret[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0(public_key, ret); - Eurydice_slice_copy( - uu____6, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t); - pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE; - uint8_t *uu____7 = serialized; - size_t uu____8 = pointer; - size_t uu____9 = pointer; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____7, uu____8, - uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t), - uint8_t *), - implicit_rejection_value, uint8_t); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SERIALIZED_KEY_LEN= 2400 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6( - Eurydice_slice private_key, Eurydice_slice public_key, - Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) { - uint8_t out[2400U] = {0U}; - libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6( - private_key, public_key, implicit_rejection_value, out); - memcpy(ret, out, (size_t)2400U * sizeof(uint8_t)); -} - -/** - Packed API - - Generate a key pair. - - Depending on the `Vector` and `Hasher` used, this requires different hardware - features -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_ind_cca_generate_keypair_15(uint8_t *randomness) { - Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3( - randomness, (size_t)0U, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *); - Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from( - (size_t)64U, randomness, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t, - size_t, uint8_t[]); - libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 = - libcrux_ml_kem_ind_cpa_generate_keypair_ea(ind_cpa_keypair_randomness); - uint8_t ind_cpa_private_key[1152U]; - memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t)); - uint8_t public_key[1184U]; - memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t)); - uint8_t secret_key_serialized[2400U]; - libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6( - Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t), - Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t), - implicit_rejection_value, secret_key_serialized); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_secret_key_serialized[2400U]; - memcpy(copy_of_secret_key_serialized, secret_key_serialized, - (size_t)2400U * sizeof(uint8_t)); - libcrux_ml_kem_types_MlKemPrivateKey_d9 private_key = - libcrux_ml_kem_types_from_77_28(copy_of_secret_key_serialized); - libcrux_ml_kem_types_MlKemPrivateKey_d9 uu____2 = private_key; - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_public_key[1184U]; - memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t)); - return libcrux_ml_kem_types_from_17_74( - uu____2, libcrux_ml_kem_types_from_fd_d0(copy_of_public_key)); -} - -/** - Portable generate key pair. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair with const -generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce( - uint8_t *randomness) { - return libcrux_ml_kem_ind_cca_generate_keypair_15(randomness); -} - -/** - Generate ML-KEM 768 Key Pair -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) { - return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce( - randomness); -} - -/** - Validate an ML-KEM private key. - - This implements the Hash check in 7.3 3. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key_only -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -*/ -static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_only_d6( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) { - uint8_t t[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_subslice3(private_key->value, (size_t)384U * (size_t)3U, - (size_t)768U * (size_t)3U + (size_t)32U, - uint8_t *), - t); - Eurydice_slice expected = Eurydice_array_to_subslice3( - private_key->value, (size_t)768U * (size_t)3U + (size_t)32U, - (size_t)768U * (size_t)3U + (size_t)64U, uint8_t *); - return Eurydice_array_eq_slice((size_t)32U, t, &expected, uint8_t, bool); -} - -/** - Validate an ML-KEM private key. - - This implements the Hash check in 7.3 3. - Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE` - and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CIPHERTEXT_SIZE= 1088 -*/ -static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_37( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) { - return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key); -} - -/** - Private key validation -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const -generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CIPHERTEXT_SIZE= 1088 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) { - return libcrux_ml_kem_ind_cca_validate_private_key_37(private_key, - ciphertext); -} - -/** - Validate a private key. - - Returns `true` if valid, and `false` otherwise. -*/ -static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) { - return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31( - private_key, ciphertext); -} - -/** - Private key validation -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key_only with -const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) { - return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key); -} - -/** - Validate the private key only. - - Returns `true` if valid, and `false` otherwise. -*/ -static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key_only( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) { - return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41( - private_key); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]> for -libcrux_ml_kem::serialize::deserialize_ring_elements_reduced_out::closure<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out.call_mut_0b with -types libcrux_ml_kem_vector_portable_vector_type_PortableVector with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** - This function deserializes ring elements and reduces the result by the field - modulus. - - This function MUST NOT be used on secret inputs. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b( - Eurydice_slice public_key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - deserialized_pk[i] = - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b( - &lvalue, i); - } - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - public_key, deserialized_pk); - memcpy( - ret, deserialized_pk, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** - Validate an ML-KEM public key. - - This implements the Modulus check in 7.2 2. - Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the - `public_key` type. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_89( - uint8_t *public_key) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U]; - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b( - Eurydice_array_to_subslice_to( - (size_t)1184U, public_key, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t, size_t, uint8_t[]), - deserialized_pk); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____0 = deserialized_pk; - uint8_t public_key_serialized[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - uu____0, - Eurydice_array_to_subslice_from( - (size_t)1184U, public_key, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t, size_t, uint8_t[]), - public_key_serialized); - return Eurydice_array_eq((size_t)1184U, public_key, public_key_serialized, - uint8_t); -} - -/** - Public key validation -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const -generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41( - uint8_t *public_key) { - return libcrux_ml_kem_ind_cca_validate_public_key_89(public_key); -} - -/** - Validate a public key. - - Returns `true` if valid, and `false` otherwise. -*/ -static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key) { - return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41( - public_key->value); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPublicKeyUnpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0_s { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 ind_cpa_public_key; - uint8_t public_key_hash[32U]; -} libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0; - -typedef libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768PublicKeyUnpacked; - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.MlKemPrivateKeyUnpacked with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0_s { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 - ind_cpa_private_key; - uint8_t implicit_rejection_value[32U]; -} libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0; - -typedef struct - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked_s { - libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 private_key; - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 public_key; -} libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked; - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.decapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_decapsulate_51( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - uint8_t decrypted[32U]; - libcrux_ml_kem_ind_cpa_decrypt_unpacked_42( - &key_pair->private_key.ind_cpa_private_key, ciphertext->value, decrypted); - uint8_t to_hash0[64U]; - libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0); - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]); - Eurydice_slice_copy( - uu____0, - Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash, - uint8_t), - uint8_t); - uint8_t hashed[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed); - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret = uu____1.fst; - Eurydice_slice pseudorandomness = uu____1.snd; - uint8_t to_hash[1120U]; - libcrux_ml_kem_utils_into_padded_array_15( - Eurydice_array_to_slice( - (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t), - to_hash); - Eurydice_slice uu____2 = Eurydice_array_to_subslice_from( - (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]); - Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - uint8_t); - uint8_t implicit_rejection_shared_secret[32U]; - libcrux_ml_kem_hash_functions_portable_PRF_4a_41( - Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t), - implicit_rejection_shared_secret); - uint8_t expected_ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a( - &key_pair->public_key.ind_cpa_public_key, decrypted, pseudorandomness, - expected_ciphertext); - uint8_t selector = - libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( - libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t)); - uint8_t ret0[32U]; - libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( - shared_secret, - Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret, - uint8_t), - selector, ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -/** - Unpacked decapsulate -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.decapsulate with const -generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(key_pair, ciphertext, ret); -} - -/** - Decapsulate ML-KEM 768 (unpacked) - - Generates an [`MlKemSharedSecret`]. - The input is a reference to an unpacked key pair of type - [`MlKem768KeyPairUnpacked`] and an [`MlKem768Ciphertext`]. -*/ -static inline void libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35( - private_key, ciphertext, ret); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encaps_prepare -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c( - Eurydice_slice randomness, Eurydice_slice pk_hash, uint8_t ret[64U]) { - uint8_t to_hash[64U]; - libcrux_ml_kem_utils_into_padded_array_24(randomness, to_hash); - Eurydice_slice_copy( - Eurydice_array_to_subslice_from((size_t)64U, to_hash, - LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, - uint8_t, size_t, uint8_t[]), - pk_hash, uint8_t); - uint8_t ret0[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), ret0); - memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- VECTOR_U_BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - uint8_t *randomness) { - uint8_t hashed[64U]; - libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c( - Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), - Eurydice_array_to_slice((size_t)32U, public_key->public_key_hash, - uint8_t), - hashed); - Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret = uu____0.fst; - Eurydice_slice pseudorandomness = uu____0.snd; - uint8_t ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&public_key->ind_cpa_public_key, - randomness, pseudorandomness, - ciphertext); - uint8_t shared_secret_array[32U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_slice((size_t)32U, shared_secret_array, uint8_t), - shared_secret, uint8_t); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_ciphertext[1088U]; - memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t)); - libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____2 = - libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_shared_secret_array[32U]; - memcpy(copy_of_shared_secret_array, shared_secret_array, - (size_t)32U * sizeof(uint8_t)); - tuple_c2 lit; - lit.fst = uu____2; - memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t)); - return lit; -} - -/** - Unpacked encapsulate -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.encapsulate with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- VECTOR_U_BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_c2 -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - uint8_t *randomness) { - return libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(public_key, randomness); -} - -/** - Encapsulate ML-KEM 768 (unpacked) - - Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. - The input is a reference to an unpacked public key of type - [`MlKem768PublicKeyUnpacked`], the SHA3-256 hash of this public key, and - [`SHARED_SECRET_SIZE`] bytes of `randomness`. -*/ -static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - uint8_t randomness[32U]) { - return libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd( - public_key, randomness); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1]> for -libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure::closure<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.transpose_a.closure.call_mut_b4 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -@Array<libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@1], K>> for -libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.transpose_a.call_mut_7b with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b( - void **_, size_t tupled_args, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - ret[i] = libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b( - &lvalue, i); - } -} - -/** -This function found in impl {core::clone::Clone for -libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0, -TraitClause@2]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.clone_c1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_clone_c1_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit; - libcrux_ml_kem_vector_portable_vector_type_PortableVector ret[16U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)16U, self->coefficients, ret, - libcrux_ml_kem_vector_portable_vector_type_PortableVector, void *); - memcpy(lit.coefficients, ret, - (size_t)16U * - sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector)); - return lit; -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ind_cpa_a[3U][3U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(&lvalue, i, - A[i]); - } - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d _a_i[3U][3U]; - memcpy(_a_i, A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - for (size_t i1 = (size_t)0U; i1 < (size_t)3U; i1++) { - size_t j = i1; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_polynomial_clone_c1_ea(&ind_cpa_a[j][i0]); - A[i0][j] = uu____0; - } - } - memcpy(ret, A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); -} - -/** - Generate Unpacked Keys -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.generate_keypair -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15( - uint8_t randomness[64U], - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) { - Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3( - randomness, (size_t)0U, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *); - Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from( - (size_t)64U, randomness, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t, - size_t, uint8_t[]); - libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c( - ind_cpa_keypair_randomness, &out->private_key.ind_cpa_private_key, - &out->public_key.ind_cpa_public_key); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U][3U]; - memcpy(uu____0, out->public_key.ind_cpa_public_key.A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U]; - libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(uu____0, A); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____1[3U][3U]; - memcpy(uu____1, A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - memcpy(out->public_key.ind_cpa_public_key.A, uu____1, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - uint8_t pk_serialized[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - out->public_key.ind_cpa_public_key.t_as_ntt, - Eurydice_array_to_slice( - (size_t)32U, out->public_key.ind_cpa_public_key.seed_for_A, uint8_t), - pk_serialized); - uint8_t uu____2[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_slice((size_t)1184U, pk_serialized, uint8_t), uu____2); - memcpy(out->public_key.public_key_hash, uu____2, - (size_t)32U * sizeof(uint8_t)); - uint8_t uu____3[32U]; - Result_fb dst; - Eurydice_slice_to_array2(&dst, implicit_rejection_value, Eurydice_slice, - uint8_t[32U], TryFromSliceError); - unwrap_26_b3(dst, uu____3); - memcpy(out->private_key.implicit_rejection_value, uu____3, - (size_t)32U * sizeof(uint8_t)); -} - -/** - Generate a key pair -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.generate_keypair with -const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce( - uint8_t randomness[64U], - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_randomness[64U]; - memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); - libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(copy_of_randomness, out); -} - -/** - Generate ML-KEM 768 Key Pair in "unpacked" form. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut( - uint8_t randomness[64U], - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_randomness[64U]; - memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce( - copy_of_randomness, key_pair); -} - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_30 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cca_unpacked_default_30_1b(void) { - return ( - KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0){ - .ind_cpa_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(), - .public_key_hash = {0U}}); -} - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_7b -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(void) { - libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 uu____0 = { - .ind_cpa_private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(), - .implicit_rejection_value = {0U}}; - return (KRML_CLITERAL( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked){ - .private_key = uu____0, - .public_key = libcrux_ml_kem_ind_cca_unpacked_default_30_1b()}); -} - -/** - Generate ML-KEM 768 Key Pair in "unpacked" form. -*/ -static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked -libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair( - uint8_t randomness[64U]) { - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked key_pair = - libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(); - uint8_t uu____0[64U]; - memcpy(uu____0, randomness, (size_t)64U * sizeof(uint8_t)); - libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(uu____0, - &key_pair); - return key_pair; -} - -/** - Create a new, empty unpacked key. -*/ -static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked -libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void) { - return libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(); -} - -/** - Create a new, empty unpacked public key. -*/ -static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 -libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void) { - return libcrux_ml_kem_ind_cca_unpacked_default_30_1b(); -} - -/** - Take a serialized private key and generate an unpacked key pair from it. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.keys_from_private_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - Eurydice_slice_uint8_t_x4 uu____0 = - libcrux_ml_kem_types_unpack_private_key_b4( - Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t)); - Eurydice_slice ind_cpa_secret_key = uu____0.fst; - Eurydice_slice ind_cpa_public_key = uu____0.snd; - Eurydice_slice ind_cpa_public_key_hash = uu____0.thd; - Eurydice_slice implicit_rejection_value = uu____0.f3; - libcrux_ml_kem_ind_cpa_deserialize_vector_1b( - ind_cpa_secret_key, - key_pair->private_key.ind_cpa_private_key.secret_as_ntt); - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f( - ind_cpa_public_key, &key_pair->public_key.ind_cpa_public_key); - Eurydice_slice_copy( - Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash, - uint8_t), - ind_cpa_public_key_hash, uint8_t); - Eurydice_slice_copy( - Eurydice_array_to_slice( - (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t), - implicit_rejection_value, uint8_t); - Eurydice_slice_copy( - Eurydice_array_to_slice( - (size_t)32U, key_pair->public_key.ind_cpa_public_key.seed_for_A, - uint8_t), - Eurydice_slice_subslice_from(ind_cpa_public_key, (size_t)1152U, uint8_t, - size_t, uint8_t[]), - uint8_t); -} - -/** - Take a serialized private key and generate an unpacked key pair from it. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.keypair_from_private_key -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(private_key, - key_pair); -} - -/** - Get an unpacked key from a private key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd( - private_key, key_pair); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_mut_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, - libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) { - libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 = - libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c( - &self->public_key.ind_cpa_public_key, - &self->private_key.ind_cpa_private_key); - uint8_t ind_cpa_private_key[1152U]; - memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t)); - uint8_t ind_cpa_public_key[1184U]; - memcpy(ind_cpa_public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t)); - libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6( - Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t), - Eurydice_array_to_slice((size_t)1184U, ind_cpa_public_key, uint8_t), - Eurydice_array_to_slice( - (size_t)32U, self->private_key.implicit_rejection_value, uint8_t), - serialized->value); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) { - libcrux_ml_kem_types_MlKemPrivateKey_d9 sk = - libcrux_ml_kem_types_default_d3_28(); - libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(self, &sk); - return sk; -} - -/** - Get the serialized private key. -*/ -static inline libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - return libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(key_pair); -} - -/** - Get the serialized private key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(key_pair, - serialized); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_dd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) { - uint8_t ret[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - self->ind_cpa_public_key.t_as_ntt, - Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A, - uint8_t), - ret); - return libcrux_ml_kem_types_from_fd_d0(ret); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) { - return libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(&self->public_key); -} - -/** - Get the serialized public key. -*/ -static inline libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - return libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(key_pair); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_mut_dd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89( - self->ind_cpa_public_key.t_as_ntt, - Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A, - uint8_t), - serialized->value); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_mut_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(&self->public_key, - serialized); -} - -/** - Get the serialized public key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(key_pair, - serialized); -} - -/** -This function found in impl {core::clone::Clone for -libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@2]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.clone_91 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *self) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)3U, self->t_as_ntt, uu____0, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d, void *); - uint8_t uu____1[32U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)32U, self->seed_for_A, uu____1, uint8_t, void *); - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit; - memcpy( - lit.t_as_ntt, uu____0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)3U, self->A, ret, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U], void *); - memcpy(lit.A, ret, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - return lit; -} - -/** -This function found in impl {core::clone::Clone for -libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector, -K>[TraitClause@0, TraitClause@2]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.clone_d7 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) { - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 lit; - lit.ind_cpa_public_key = - libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(&self->ind_cpa_public_key); - uint8_t ret[32U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)32U, self->public_key_hash, ret, uint8_t, void *); - memcpy(lit.public_key_hash, ret, (size_t)32U * sizeof(uint8_t)); - return lit; -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector, -K>[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.public_key_11 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * -libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) { - return &self->public_key; -} - -/** - Get the unpacked public key. -*/ -static inline void libcrux_ml_kem_mlkem768_portable_unpacked_public_key( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *pk) { - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 uu____0 = - libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b( - libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(key_pair)); - pk[0U] = uu____0; -} - -/** - Get the serialized public key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(public_key, serialized); -} - -/** - Generate an unpacked key from a serialized key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.unpack_public_key -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - *unpacked_public_key) { - Eurydice_slice uu____0 = - Eurydice_array_to_subslice_to((size_t)1184U, public_key->value, - (size_t)1152U, uint8_t, size_t, uint8_t[]); - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - uu____0, unpacked_public_key->ind_cpa_public_key.t_as_ntt); - uint8_t uu____1[32U]; - libcrux_ml_kem_utils_into_padded_array_9e( - Eurydice_array_to_subslice_from((size_t)1184U, public_key->value, - (size_t)1152U, uint8_t, size_t, - uint8_t[]), - uu____1); - memcpy(unpacked_public_key->ind_cpa_public_key.seed_for_A, uu____1, - (size_t)32U * sizeof(uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____2)[3U] = - unpacked_public_key->ind_cpa_public_key.A; - uint8_t ret[34U]; - libcrux_ml_kem_utils_into_padded_array_b6( - Eurydice_array_to_subslice_from((size_t)1184U, public_key->value, - (size_t)1152U, uint8_t, size_t, - uint8_t[]), - ret); - libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____2, ret, false); - uint8_t uu____3[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_slice((size_t)1184U, - libcrux_ml_kem_types_as_slice_e6_d0(public_key), - uint8_t), - uu____3); - memcpy(unpacked_public_key->public_key_hash, uu____3, - (size_t)32U * sizeof(uint8_t)); -} - -/** - Get the unpacked public key. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.unpack_public_key with -const generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - *unpacked_public_key) { - libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(public_key, - unpacked_public_key); -} - -/** - Get the unpacked public key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - *unpacked_public_key) { - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31( - public_key, unpacked_public_key); -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_mlkem768_portable_H_DEFINED -#endif /* libcrux_mlkem768_portable_H */ - - -/* rename some types to be a bit more ergonomic */ -#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s -#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s -#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s -#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s -#define libcrux_mlkem768_enc_result tuple_c2_s -/* defines for PRNG inputs */ -#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64U -#define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32 @@ -1,4 +1,4 @@ -/* $OpenBSD: mac.c,v 1.38 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: mac.c,v 1.39 2026/05/13 05:58:58 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * @@ -236,6 +236,7 @@ int mac_valid(const char *names) { char *maclist, *cp, *p; + int found = 0; if (names == NULL || strcmp(names, "") == 0) return 0; @@ -246,8 +247,9 @@ mac_valid(const char *names) if (mac_setup(NULL, p) < 0) { free(maclist); return 0; - } + } else + found = 1; } free(maclist); - return 1; + return found; } @@ -1,4 +1,4 @@ -/* $OpenBSD: match.c,v 1.45 2024/09/06 02:30:44 djm Exp $ */ +/* $OpenBSD: match.c,v 1.46 2026/05/31 04:19:16 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -13,6 +13,7 @@ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. + * Copyright (c) 2026 Damien Miller. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -50,66 +51,104 @@ #include "misc.h" /* + * Computes the epsilon closure of an NFA set. + * In our wildcard grammar, epsilon transitions only exist for '*' wildcards, + * allowing us to transition from state i to i+1 without consuming input. + * + * This function modifies 'states' in place. + */ +static void +epsilon_closure(char *states, const char *pattern, size_t M) +{ + size_t i; + + /* only need a forward pass as there are no back jumps in our grammar */ + for (i = 0; i < M; i++) { + if (!states[i] || pattern[i] != '*') + continue; + /* + * State i is active, and pattern[i] is '*', so we can + * epsilon-transition to i+1. + */ + states[i + 1] = 1; + } +} + +/* * Returns true if the given string matches the pattern (which may contain ? - * and * as wildcards), and zero if it does not match. + * and * as wildcards), and zero if it does not match. Uses an NFA internally. */ int match_pattern(const char *s, const char *pattern) { - for (;;) { - /* If at end of pattern, accept if also at end of string. */ - if (!*pattern) - return !*s; + size_t M; + size_t i; + char *states, *next_states, *tmp; + int active, matched = 0; + + /* trivial case: empty pattern vs empty input */ + if ((M = strlen(pattern)) == 0) + return *s == '\0'; + + /* A state for each pattern character, plus one final accepting state */ + states = xcalloc(M + 1, sizeof(*states)); + next_states = xcalloc(M + 1, sizeof(*next_states)); - if (*pattern == '*') { - /* Skip this and any consecutive asterisks. */ - while (*pattern == '*') - pattern++; + /* Initial state: state 0 is active */ + states[0] = 1; + /* Other states might be reachable now if the pattern starts with '*' */ + epsilon_closure(states, pattern, M); - /* If at end of pattern, accept immediately. */ - if (!*pattern) - return 1; + for (; *s; s++) { + memset(next_states, 0, M + 1); - /* If next character in pattern is known, optimize. */ - if (*pattern != '?' && *pattern != '*') { + /* Calculate the reachable next states given the input char */ + for (i = 0; i < M; i++) { + if (!states[i]) + continue; + if (pattern[i] == '*') { /* - * Look instances of the next character in - * pattern, and try to match starting from - * those. + * '*' matches any character, so we can + * stay in state i */ - for (; *s; s++) - if (*s == *pattern && - match_pattern(s + 1, pattern + 1)) - return 1; - /* Failed. */ - return 0; + next_states[i] = 1; + } else if (pattern[i] == '?' || pattern[i] == *s) { + /* + * '?' matches any character, or we have + * a literal match. + */ + next_states[i + 1] = 1; } - /* - * Move ahead one character at a time and try to - * match at each position. - */ - for (; *s; s++) - if (match_pattern(s, pattern)) - return 1; - /* Failed. */ - return 0; } - /* - * There must be at least one more character in the string. - * If we are at the end, fail. - */ - if (!*s) - return 0; - /* Check if the next character of the string is acceptable. */ - if (*pattern != '?' && *pattern != *s) - return 0; + /* Expand the reachable next states with epsilon transitions */ + epsilon_closure(next_states, pattern, M); + + /* Swap states and next_states */ + tmp = states; + states = next_states; + next_states = tmp; - /* Move to the next character, both in string and in pattern. */ - s++; - pattern++; + /* Check if we have any active pattern states left */ + active = 0; + for (i = 0; i <= M; i++) { + if (states[i]) { + active = 1; + break; + } + } + if (!active) + goto out; /* No active states, fail early */ } - /* NOTREACHED */ + /* + * We matched only if we ended up in the final, accepting state + * after consuming all the input. + */ + matched = states[M]; + out: + free(states); + free(next_states); + return matched; } /* @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.213 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: misc.c,v 1.215 2026/06/21 19:23:56 tb Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -2588,10 +2588,12 @@ parse_absolute_time(const char *s, uint64_t *tp) if ((cp = strptime(buf, fmt, &tm)) == NULL || *cp != '\0') return SSH_ERR_INVALID_FORMAT; if (is_utc) { - if ((tt = timegm(&tm)) < 0) + tm.tm_wday = -1; /* sentinel for error */ + if ((tt = timegm(&tm)) == -1 && tm.tm_wday == -1) return SSH_ERR_INVALID_FORMAT; } else { - if ((tt = mktime(&tm)) < 0) + tm.tm_wday = -1; /* sentinel for error */ + if ((tt = mktime(&tm)) == -1 && tm.tm_wday == -1) return SSH_ERR_INVALID_FORMAT; } /* success */ diff --git a/mlkem768.sh b/mlkem768.sh deleted file mode 100644 index bec372a5fc7b..000000000000 --- a/mlkem768.sh +++ /dev/null @@ -1,219 +0,0 @@ -#!/bin/sh -# $OpenBSD: mlkem768.sh,v 1.5 2025/11/13 05:13:06 djm Exp $ -# Placed in the Public Domain. -# - -#WANT_LIBCRUX_REVISION="origin/main" -WANT_LIBCRUX_REVISION="core-models-v0.0.4" - -BASE="libcrux/libcrux-ml-kem/extracts/c_header_only/generated" -FILES=" - $BASE/eurydice_glue.h - $BASE/libcrux_mlkem_core.h - $BASE/libcrux_ct_ops.h - $BASE/libcrux_sha3_portable.h - $BASE/libcrux_mlkem768_portable.h -" - -START="$PWD" -die() { - echo "$@" 1>&2 - exit 1 -} - -set -xeuo pipefail -test -d libcrux || git clone https://github.com/cryspen/libcrux -cd libcrux -test `git diff | wc -l` -ne 0 && die "tree has unstaged changes" -git fetch -git checkout -B extract 1>&2 -git reset --hard $WANT_LIBCRUX_REVISION 1>&2 -LIBCRUX_REVISION=`git rev-parse HEAD` -set +x - -cd $START -( -printf '/* $Open'; printf 'BSD$ */\n' # Sigh -echo -echo "/* Extracted from libcrux revision $LIBCRUX_REVISION */" -echo -echo '/*' -cat libcrux/LICENSE-MIT | sed 's/^/ * /;s/ *$//' -echo ' */' -echo - -LSHIFT="<<" -cat << _EOF -#if !defined(__GNUC__) || (__GNUC__ < 2) -# define __attribute__(x) -#endif -#define KRML_MUSTINLINE inline -#define KRML_NOINLINE __attribute__((noinline, unused)) -#define KRML_HOST_EPRINTF(...) -#define KRML_HOST_EXIT(x) fatal_f("internal error") - -static inline void -store64_le(uint8_t dst[8], uint64_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; - dst[4] = (src >> 32) & 0xff; - dst[5] = (src >> 40) & 0xff; - dst[6] = (src >> 48) & 0xff; - dst[7] = (src >> 56) & 0xff; -} - -static inline void -store32_le(uint8_t dst[4], uint32_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; -} - -static inline void -store32_be(uint8_t dst[4], uint32_t src) -{ - dst[0] = (src >> 24) & 0xff; - dst[1] = (src >> 16) & 0xff; - dst[2] = (src >> 8) & 0xff; - dst[3] = src & 0xff; -} - -static inline uint64_t -load64_le(uint8_t src[8]) -{ - return (uint64_t)(src[0]) | - ((uint64_t)(src[1]) $LSHIFT 8) | - ((uint64_t)(src[2]) $LSHIFT 16) | - ((uint64_t)(src[3]) $LSHIFT 24) | - ((uint64_t)(src[4]) $LSHIFT 32) | - ((uint64_t)(src[5]) $LSHIFT 40) | - ((uint64_t)(src[6]) $LSHIFT 48) | - ((uint64_t)(src[7]) $LSHIFT 56); -} - -static inline uint32_t -load32_le(uint8_t src[4]) -{ - return (uint32_t)(src[0]) | - ((uint32_t)(src[1]) $LSHIFT 8) | - ((uint32_t)(src[2]) $LSHIFT 16) | - ((uint32_t)(src[3]) $LSHIFT 24); -} - -#ifdef MISSING_BUILTIN_POPCOUNT -static inline unsigned int -__builtin_popcount(unsigned int num) -{ - const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; - return v[num & 0xf] + v[(num >> 4) & 0xf]; -} -#endif - -_EOF - -for i in $FILES; do - echo "/* from $i */" - # Changes to all files: - # - remove all includes, we inline everything required. - # - cleanup whitespace - sed -e "/#include/d" \ - -e 's/[ ]*$//' \ - $i | \ - case "$i" in - */eurydice_glue.h) - # Replace endian function for consistency. - perl -0777 -pe 's/(static inline void core_num__u32__to_be_bytes.*\n)([^}]*\n)/\1 store32_be(dst, src);\n/' - ;; - # Default: pass through. - *) - cat - ;; - esac - echo -done - -echo -echo '/* rename some types to be a bit more ergonomic */' -echo '#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s' -echo '#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s' -echo '#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s' -echo '#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s' -echo '#define libcrux_mlkem768_enc_result tuple_c2_s' -) > libcrux_mlkem768_sha3.h_new - -# Do some checks on the resultant file - -cat > libcrux_mlkem768_sha3_check.c << _EOF -#include <sys/types.h> -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <stdbool.h> -#include <string.h> -#include <signal.h> -#include <err.h> -#include "crypto_api.h" -#define fatal_f(x) exit(1) -#include "libcrux_mlkem768_sha3.h_new" -int main(void) { - struct libcrux_mlkem768_keypair keypair = {0}; - struct libcrux_mlkem768_pk pk = {0}; - struct libcrux_mlkem768_sk sk = {0}; - struct libcrux_mlkem768_ciphertext ct = {0}; - struct libcrux_mlkem768_enc_result enc_result = {0}; - uint8_t kp_seed[64] = {0}, enc_seed[32] = {0}; - uint8_t shared_key[crypto_kem_mlkem768_BYTES]; - - if (sizeof(keypair.pk.value) != crypto_kem_mlkem768_PUBLICKEYBYTES) - errx(1, "keypair.pk bad"); - if (sizeof(keypair.sk.value) != crypto_kem_mlkem768_SECRETKEYBYTES) - errx(1, "keypair.sk bad"); - if (sizeof(pk.value) != crypto_kem_mlkem768_PUBLICKEYBYTES) - errx(1, "pk bad"); - if (sizeof(sk.value) != crypto_kem_mlkem768_SECRETKEYBYTES) - errx(1, "sk bad"); - if (sizeof(ct.value) != crypto_kem_mlkem768_CIPHERTEXTBYTES) - errx(1, "ct bad"); - if (sizeof(enc_result.fst.value) != crypto_kem_mlkem768_CIPHERTEXTBYTES) - errx(1, "enc_result ct bad"); - if (sizeof(enc_result.snd) != crypto_kem_mlkem768_BYTES) - errx(1, "enc_result shared key bad"); - - keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(kp_seed); - if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&keypair.pk)) - errx(1, "valid smoke failed"); - enc_result = libcrux_ml_kem_mlkem768_portable_encapsulate(&keypair.pk, - enc_seed); - libcrux_ml_kem_mlkem768_portable_decapsulate(&keypair.sk, - &enc_result.fst, shared_key); - if (memcmp(shared_key, enc_result.snd, sizeof(shared_key)) != 0) - errx(1, "smoke failed"); - return 0; -} -_EOF -cc -Wall -Wextra -Wno-unused-parameter -I . -o libcrux_mlkem768_sha3_check \ - libcrux_mlkem768_sha3_check.c -./libcrux_mlkem768_sha3_check - -# Extract PRNG inputs; there's no nice #defines for these -key_pair_rng_len=`grep '^libcrux_ml_kem_mlkem768_portable_generate_key_pair.*randomness' libcrux_mlkem768_sha3.h_new | sed 's/.*randomness[[]//;s/\].*//'` -enc_rng_len=`sed -e '/^static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'` -test -z "$key_pair_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair randomness argument" -test -z "$enc_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_encapsulate randomness argument" - -( -echo "/* defines for PRNG inputs */" -echo "#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN $key_pair_rng_len" -echo "#define LIBCRUX_ML_KEM_ENC_PRNG_LEN $enc_rng_len" -) >> libcrux_mlkem768_sha3.h_new - -mv libcrux_mlkem768_sha3.h_new libcrux_mlkem768_sha3.h -rm libcrux_mlkem768_sha3_check libcrux_mlkem768_sha3_check.c -echo 1>&2 -echo "libcrux_mlkem768_sha3.h OK" 1>&2 - diff --git a/mlkem_mldsa.sh b/mlkem_mldsa.sh new file mode 100644 index 000000000000..fb470e26f520 --- /dev/null +++ b/mlkem_mldsa.sh @@ -0,0 +1,341 @@ +#!/bin/sh +# $OpenBSD: mlkem_mldsa.sh,v 1.1 2026/06/14 03:59:34 djm Exp $ +# Placed in the Public Domain. +# + +WANT_LIBCRUX_REVISION="origin/jonas/combined-extraction-mldsa" + +BASE="libcrux/combined_extraction/generated" +FILES=" + $BASE/eurydice_glue.h + $BASE/combined_core.h + $BASE/libcrux_sha3_portable.h + $BASE/libcrux_mlkem_core.h + $BASE/libcrux_mldsa_core.h + $BASE/libcrux_ct_ops.h + $BASE/libcrux_mldsa_portable.h + $BASE/libcrux_mldsa44_portable.h + $BASE/libcrux_mldsa65_portable.h + $BASE/libcrux_mldsa87_portable.h + $BASE/libcrux_mlkem768_portable.h +" + +START="$PWD" +die() { + echo "$@" 1>&2 + exit 1 +} + +set -xeuo pipefail +test -d libcrux || git clone https://github.com/cryspen/libcrux +cd libcrux +test `git diff | wc -l` -ne 0 && die "tree has unstaged changes" +git fetch +git checkout -B extract 1>&2 +git reset --hard $WANT_LIBCRUX_REVISION 1>&2 +LIBCRUX_REVISION=`git rev-parse HEAD` +set +x + +cd $START +( +printf '/* $Open'; printf 'BSD$ */\n' # Sigh +echo +echo "/* Extracted from libcrux revision $LIBCRUX_REVISION */" +echo +echo '/*' +cat libcrux/LICENSE-MIT | sed 's/^/ * /;s/ *$//' +echo ' */' +echo + +LSHIFT="<<" +cat << _EOF +#if !defined(__GNUC__) || (__GNUC__ < 2) +# define __attribute__(x) +#endif +#define KRML_MUSTINLINE inline +#define KRML_NOINLINE __attribute__((noinline, unused)) +#define KRML_HOST_EPRINTF(...) +#define KRML_HOST_EXIT(x) fatal_f("internal error") +#define KRML_UNION_CONSTRUCTOR(T) + +static inline void +store64_le(uint8_t dst[8], uint64_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; + dst[4] = (src >> 32) & 0xff; + dst[5] = (src >> 40) & 0xff; + dst[6] = (src >> 48) & 0xff; + dst[7] = (src >> 56) & 0xff; +} + +static inline void +store32_le(uint8_t dst[4], uint32_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; +} + +static inline void +store16_le(uint8_t dst[2], uint16_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; +} + +static inline void +store32_be(uint8_t dst[4], uint32_t src) +{ + dst[0] = (src >> 24) & 0xff; + dst[1] = (src >> 16) & 0xff; + dst[2] = (src >> 8) & 0xff; + dst[3] = src & 0xff; +} + +static inline uint64_t +load64_le(uint8_t src[8]) +{ + return (uint64_t)(src[0]) | + ((uint64_t)(src[1]) $LSHIFT 8) | + ((uint64_t)(src[2]) $LSHIFT 16) | + ((uint64_t)(src[3]) $LSHIFT 24) | + ((uint64_t)(src[4]) $LSHIFT 32) | + ((uint64_t)(src[5]) $LSHIFT 40) | + ((uint64_t)(src[6]) $LSHIFT 48) | + ((uint64_t)(src[7]) $LSHIFT 56); +} + +static inline uint32_t +load32_le(uint8_t src[4]) +{ + return (uint32_t)(src[0]) | + ((uint32_t)(src[1]) $LSHIFT 8) | + ((uint32_t)(src[2]) $LSHIFT 16) | + ((uint32_t)(src[3]) $LSHIFT 24); +} + +static inline uint16_t +load16_le(uint8_t src[4]) +{ + return (uint16_t)(src[0]) | + ((uint16_t)(src[1]) $LSHIFT 8); +} + +#ifdef MISSING_BUILTIN_POPCOUNT +static inline unsigned int +__builtin_popcount(unsigned int num) +{ + const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; + return v[num & 0xf] + v[(num >> 4) & 0xf]; +} +#endif + +_EOF + +for i in $FILES; do + echo "/* from $i */" + # Changes to all files: + # - remove all includes, we inline everything required. + # - cleanup whitespace + # - convert C++-style constructors to C-style compound literals + # - convert Result constructors to C initializers + # - use anonymous unions to avoid "union U" redefinition errors + sed -e "/#include/d" \ + -e 's/[ ]*$//' \ + $i | \ + case "$i" in + */eurydice_glue.h) + # Replace endian function for consistency. + perl -0777 -pe 's/(static inline void core_num__u32__to_be_bytes.*\n)([^}]*\n)/\1 store32_be(dst, src);\n/' + ;; + # Default: pass through. + *) + cat + ;; + esac | \ + perl -0777 -pe 's/ <<\n\s+\(uint32_t\)\(int32_t\)0//g' + echo +done + +cat << _EOF + +/* rename some types to be a bit more ergonomic */ + +/* ML-KEM 768 */ +typedef Eurydice_arr_c7 libcrux_mlkem768_keypair_rnd; +typedef Eurydice_arr_ec libcrux_mlkem768_enc_rnd; +typedef libcrux_ml_kem_mlkem768_MlKem768KeyPair libcrux_mlkem768_keypair; +typedef Eurydice_arr_5f libcrux_mlkem768_pk; +typedef Eurydice_arr_7d libcrux_mlkem768_sk; +typedef Eurydice_arr_2b libcrux_mlkem768_ciphertext; +typedef tuple_f4 libcrux_mlkem768_enc_result; +typedef Eurydice_arr_ec libcrux_mlkem768_dec_result; +/* ML-DSA 44 */ +typedef Eurydice_arr_ec libcrux_mldsa44_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair + libcrux_mldsa44_keypair; +typedef Eurydice_arr_10 libcrux_mldsa44_sk; +typedef Eurydice_arr_02 libcrux_mldsa44_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa44_message; +typedef Eurydice_arr_ec libcrux_mldsa44_sign_rnd; +typedef core_result_Result_48 libcrux_mldsa44_sign_result; +typedef core_result_Result_41 libcrux_mldsa44_verify_result; +typedef Eurydice_arr_85 libcrux_mldsa44_signature; +/* ML-DSA 65 */ +typedef Eurydice_arr_ec libcrux_mldsa65_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair + libcrux_mldsa65_keypair; +typedef Eurydice_arr_24 libcrux_mldsa65_sk; +typedef Eurydice_arr_29 libcrux_mldsa65_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa65_message; +typedef Eurydice_arr_ec libcrux_mldsa65_sign_rnd; +typedef core_result_Result_8c libcrux_mldsa65_sign_result; +typedef core_result_Result_41 libcrux_mldsa65_verify_result; +typedef Eurydice_arr_0c libcrux_mldsa65_signature; +/* ML-DSA 87 */ +typedef Eurydice_arr_ec libcrux_mldsa87_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair + libcrux_mldsa87_keypair; +typedef Eurydice_arr_e2 libcrux_mldsa87_sk; +typedef Eurydice_arr_43 libcrux_mldsa87_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa87_message; +typedef Eurydice_arr_ec libcrux_mldsa87_sign_rnd; +typedef core_result_Result_8b libcrux_mldsa87_sign_result; +typedef core_result_Result_41 libcrux_mldsa87_verify_result; +typedef Eurydice_arr_93 libcrux_mldsa87_signature; + +#define LIBCRUX_RESULT_OK core_result_Ok + +_EOF + +) > libcrux_internal.h_new + +# Do some checks on the resultant file + +cat > libcrux_internal_check.c << _EOF +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include <signal.h> +#include <err.h> +#include "crypto_api.h" +#define fatal_f(x) exit(1) +#include "libcrux_internal.h_new" + +#define TEST_MLDSA(L) do { \ + libcrux_mldsa##L##_keypair_rnd kpseed##L = {0}; \ + libcrux_mldsa##L##_keypair kp##L = {0}; \ + libcrux_mldsa##L##_sk sk##L = {0}; \ + libcrux_mldsa##L##_pk pk##L = {0}; \ + const uint8_t msgdata##L[6] = { 0x4a, 0x75, 0x6c, 0x69, 0x75, 0x73 }; \ + libcrux_mldsa##L##_message msg##L = { \ + msgdata##L, sizeof(msgdata##L) \ + }; \ + const uint8_t ctxdata##L[4] = { 0x48, 0x75, 0x67, 0x6f }; \ + libcrux_mldsa##L##_message ctx##L = { \ + ctxdata##L, sizeof(ctxdata##L) \ + }; \ + libcrux_mldsa##L##_sign_rnd signseed##L = {0}; \ + libcrux_mldsa##L##_sign_result signresult##L = {0}; \ + libcrux_mldsa##L##_verify_result verifyresult##L = {0}; \ + libcrux_mldsa##L##_signature sig##L = {0}; \ + \ + if (sizeof(kpseed##L.data) != MLDSA##L##_SEEDBYTES) \ + errx(1, "libcrux_mldsa%d_keypair_rnd bad", L); \ + if (sizeof(kp##L.verification_key.data) != MLDSA##L##_PUBLICKEYBYTES) \ + errx(1, "libcrux_mldsa%d_keypair verification_key bad", L); \ + if (sizeof(kp##L.signing_key.data) != MLDSA##L##_SECRETKEYBYTES) \ + errx(1, "libcrux_mldsa%d_keypair signing_key bad", L); \ + if (sizeof(pk##L.data) != MLDSA##L##_PUBLICKEYBYTES) \ + errx(1, "libcrux_mldsa%d_pk bad", L); \ + if (sizeof(sk##L.data) != MLDSA##L##_SECRETKEYBYTES) \ + errx(1, "libcrux_mldsa%d_sk bad", L); \ + if (sizeof(signresult##L.val.case_Ok.data) != MLDSA##L##_SIGBYTES) \ + errx(1, "libcrux_mldsa%d_sign_result bad", L); \ + if (sizeof(sig##L.data) != MLDSA##L##_SIGBYTES) \ + errx(1, "libcrux_mldsa%d_signature bad", L); \ + \ + kp##L = libcrux_ml_dsa_ml_dsa_##L##_portable_generate_key_pair( \ + kpseed##L); \ + sk##L = kp##L.signing_key; \ + pk##L = kp##L.verification_key; \ + signresult##L = libcrux_ml_dsa_ml_dsa_##L##_portable_sign(&sk##L, \ + msg##L, ctx##L, signseed##L); \ + if (signresult##L.tag != LIBCRUX_RESULT_OK) \ + errx(1, "libcrux_ml_dsa_ml_dsa_%d_portable_sign failed", L); \ + sig##L = signresult##L.val.case_Ok; \ + verifyresult##L = libcrux_ml_dsa_ml_dsa_##L##_portable_verify(&pk##L, \ + msg##L, ctx##L, &sig##L); \ + if (verifyresult##L.tag != LIBCRUX_RESULT_OK) \ + errx(1, "libcrux_ml_dsa_ml_dsa_%d_portable_verify failed", L); \ + sig##L.data[10] ^= 0x10; /* corrupt the signature */ \ + verifyresult##L = libcrux_ml_dsa_ml_dsa_##L##_portable_verify(&pk##L, \ + msg##L, ctx##L, &sig##L); \ + if (verifyresult##L.tag == LIBCRUX_RESULT_OK) \ + errx(1, "libcrux_ml_dsa_ml_dsa_%d_portable_verify fail2", L); \ +} while (0) + +int main(void) { + libcrux_mlkem768_keypair keypair = {0}; + libcrux_mlkem768_pk pk = {0}; + libcrux_mlkem768_sk sk = {0}; + libcrux_mlkem768_ciphertext ct = {0}; + libcrux_mlkem768_enc_result enc_result = {0}; + libcrux_mlkem768_keypair_rnd kp_seed = {0}; + libcrux_mlkem768_enc_rnd enc_seed = {0}; + libcrux_mlkem768_dec_result shared_secret = {0}; + uint8_t shared_key[crypto_kem_mlkem768_BYTES]; + + if (sizeof(keypair.pk.data) != crypto_kem_mlkem768_PUBLICKEYBYTES) + errx(1, "keypair.pk bad"); + if (sizeof(keypair.sk.data) != crypto_kem_mlkem768_SECRETKEYBYTES) + errx(1, "keypair.sk bad"); + if (sizeof(pk.data) != crypto_kem_mlkem768_PUBLICKEYBYTES) + errx(1, "pk bad"); + if (sizeof(sk.data) != crypto_kem_mlkem768_SECRETKEYBYTES) + errx(1, "sk bad"); + if (sizeof(ct.data) != crypto_kem_mlkem768_CIPHERTEXTBYTES) + errx(1, "ct bad"); + if (sizeof(enc_result.fst.data) != crypto_kem_mlkem768_CIPHERTEXTBYTES) + errx(1, "enc_result ct bad"); + if (sizeof(enc_result.snd.data) != crypto_kem_mlkem768_BYTES) + errx(1, "enc_result shared key bad"); + if (sizeof(kp_seed.data) != crypto_kem_mlkem768_KEYPAIRSEEDBYTES) + errx(1, "keypair rnd bad"); + if (sizeof(enc_seed.data) != crypto_kem_mlkem768_ENCSEEDBYTES) + errx(1, "keypair rnd bad"); + + keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(kp_seed); + if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&keypair.pk)) + errx(1, "valid smoke failed"); + enc_result = libcrux_ml_kem_mlkem768_portable_encapsulate(&keypair.pk, + enc_seed); + shared_secret = libcrux_ml_kem_mlkem768_portable_decapsulate( + &keypair.sk, &enc_result.fst); + memcpy(shared_key, shared_secret.data, sizeof(shared_key)); + if (memcmp(shared_key, enc_result.snd.data, sizeof(shared_key)) != 0) + errx(1, "smoke failed"); + + TEST_MLDSA(44); + TEST_MLDSA(65); + TEST_MLDSA(87); + + return 0; +} +_EOF +cc -Wall -Wextra -Wno-unused-parameter -I . -o libcrux_internal_check \ + libcrux_internal_check.c +./libcrux_internal_check + +mv libcrux_internal.h_new libcrux_internal.h +rm libcrux_internal_check libcrux_internal_check.c +echo 1>&2 +echo "libcrux_internal.h OK" 1>&2 + @@ -1,586 +1,540 @@ -# $OpenBSD: moduli,v 1.41 2025/10/11 23:39:14 dtucker Exp $ +# $OpenBSD: moduli,v 1.42 2026/06/07 08:21:06 dtucker Exp $ # Time Type Tests Tries Size Generator Modulus -20250616002444 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626168803637 -20250616002455 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626168CECC1F -20250616002507 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261692C7353 -20250616002518 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261697DCA23 -20250616002520 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261698D69EF -20250616002525 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626169AA57DB -20250616002529 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626169CBB25F -20250616002546 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616A5307EB -20250616002549 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616A6385DB -20250616002603 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616AD0C40B -20250616002612 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B10F7D3 -20250616002613 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B182DC3 -20250616002615 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B25024B -20250616002624 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B689AFF -20250616002627 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B79A1F3 -20250616002633 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BA0CE7B -20250616002634 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BA926E7 -20250616002638 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BBF1327 -20250616002644 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BEC119B -20250616002648 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616C0A4D47 -20250616002651 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616C1B6AAF -20250616002713 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616CCBE9D3 -20250616002747 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616DE70BB3 -20250616002755 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616E1C5B1F -20250616002802 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616E57586B -20250616002822 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616EFEC4AB -20250616002825 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F0CBA83 -20250616002826 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F133697 -20250616002834 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F526313 -20250616002835 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F56D8DB -20250616002838 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F63E88B -20250616002842 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F813C83 -20250616002843 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F86C16B -20250616002854 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616FDC52CF -20250616002858 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616FFB576F -20250616002914 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626170776DAF -20250616002919 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626170939C97 -20250616002920 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261709C6907 -20250616002954 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171B2A95B -20250616002958 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171CCCD77 -20250616003000 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171D0FA13 -20250616003002 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171E18997 -20250616003005 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171EE92B7 -20250616003006 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171F5ADB3 -20250616003007 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171F9F0F3 -20250616003016 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261723F66A7 -20250616003019 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261724E9AAF -20250616003020 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626172573C83 -20250616003025 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626172798D8B -20250616003052 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261734F06E7 -20250616003103 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626173A507C3 -20250616003114 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626173FB9947 -20250616003118 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617416E49B -20250616003127 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261745F914B -20250616003136 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626174A4F763 -20250616003143 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626174D621A7 -20250616003153 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175244157 -20250616003155 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175304CEB -20250616003159 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617553F42F -20250616003209 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261759B7C0B -20250616003214 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175BFA7AF -20250616003217 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175D8110F -20250616003218 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175D8BEBB -20250616003248 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176C7670B -20250616003253 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176E7934F -20250616003256 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176FDC4CB -20250616003314 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261778C1A6B -20250616003318 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177A40A3F -20250616003324 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177CE451F -20250616003329 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177F722EB -20250616003331 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177FFB46F -20250616003336 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617822C973 -20250616003337 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617828C757 -20250616003405 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261790E9D67 -20250616003413 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261794E5533 -20250616003416 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261796529CF -20250616003430 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626179D66303 -20250616003432 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626179DCC057 -20250616003437 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A0363F3 -20250616003446 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A46B76B -20250616003455 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A8D28A7 -20250616003502 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AC41817 -20250616003503 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AC8EBC3 -20250616003509 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AF2AA53 -20250616003510 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AF70D8B -20250616003522 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B4FA6B7 -20250616003526 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B69E4D7 -20250616003530 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B8C1623 -20250616003541 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617BE325B3 -20250616003554 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617C48E047 -20250616003605 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617C9BBBC7 -20250616003611 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617CC7D78B -20250616003642 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DC7164F -20250616003645 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DDCEBBB -20250616003646 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DDD5EFF -20250616003700 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617E532FAF -20250616003718 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617EE49D4F -20250616003737 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617F78544F -20250616003745 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617FBBF7FB -20250616003759 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626180295803 -20250616024900 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE52FE1D8983 -20250616024916 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE52FE5187AB -20250616025426 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53015B738B -20250616025613 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5302B72663 -20250616025652 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53032B6AB3 -20250616025739 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303BCB52B -20250616025750 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303D8B5E7 -20250616025804 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303FF3613 -20250616025808 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5304041DF3 -20250616025813 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53040D42B3 -20250616025942 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305308573 -20250616025956 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305566ACB -20250616030027 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305B57B5B -20250616030040 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305D951BB -20250616030126 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53066DC43B -20250616030131 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5306792277 -20250616030407 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53087BB3C3 -20250616030439 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5308DA22D7 -20250616030457 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53090CC43F -20250616030623 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530A10BF03 -20250616030625 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530A12A4A3 -20250616030728 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530AD1C937 -20250616030747 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B08F417 -20250616030753 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B149E1F -20250616030835 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B97C463 -20250616030917 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530C17195B -20250616030941 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530C5E29EB -20250616031012 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530CB69887 -20250616031047 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D1B2B3B -20250616031102 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D42691B -20250616031119 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D6F09B7 -20250616031345 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530F453A3F -20250616031437 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530FE6A46F -20250616031522 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5310725CA3 -20250616031526 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5310796467 -20250616031630 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531145D673 -20250616031744 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53122DAB97 -20250616031748 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531235DC5B -20250616031828 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5312B5048F -20250616031908 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53132F33C7 -20250616031911 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531334BD6B -20250616031947 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5313A1C823 -20250616032023 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53140EA06B -20250616032050 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531463930B -20250616032110 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53149D1AE3 -20250616032205 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53154763FB -20250616032225 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531582AC17 -20250616032243 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315B3627B -20250616032250 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315C62473 -20250616032257 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315D6A113 -20250616032301 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315DA6E1B -20250616032456 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53174EA23B -20250616032613 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318454747 -20250616032619 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318518CE3 -20250616032621 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53185266F3 -20250616032705 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318DB30D3 -20250616032722 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53190CF753 -20250616032801 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531983C403 -20250616032827 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5319D4832F -20250616032843 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A0401AB -20250616032854 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A1F94AB -20250616032858 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A26B47B -20250616032930 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A86BE9B -20250616032934 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A8B9B23 -20250616032956 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531ACEECF7 -20250616033009 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531AF0B31B -20250616033016 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B028B8B -20250616033036 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B3D86EB -20250616033049 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B65D127 -20250616033115 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531BB41F3F -20250616033140 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531C01336B -20250616033207 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531C54135F -20250616033259 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531CF6B74B -20250616033308 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531D0E1EF3 -20250616033331 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531D5478CB -20250616033419 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531DED6323 -20250616033601 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531F31D043 -20250616033611 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531F48BD03 -20250616033701 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531FEA1EFF -20250616033825 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5320F3FBAB -20250616033938 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5321DD2153 -20250616033959 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53221A5443 -20250616034137 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532357E1EF -20250616034150 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53237AE35B -20250616034211 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5323B7E21F -20250616034317 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532486893F -20250616034324 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532496A2F7 -20250616034453 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325B5FF2F -20250616034508 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325DFBD83 -20250616034516 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325F4BEAF -20250616034538 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532632A773 -20250616034604 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53267F3C1F -20250616034646 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532703CCAF -20250616034920 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5328EDA0EF -20250616035201 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532AF8A223 -20250616035247 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532B864D0B -20250616035259 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532BA3AD6F -20250616035343 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532C2F66F3 -20250616035404 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532C6CBB1F -20250616035550 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532DC5FC83 -20250616025251 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0AAACEB7 -20250616025500 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0B703A67 -20250616025644 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0C098BAF -20250616025822 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0C9F6593 -20250616025947 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D1C3E97 -20250616030000 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D2AE36B -20250616030055 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D7B87EB -20250616030200 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0DD7FA2B -20250616030339 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0E70A8D7 -20250616031225 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D119395BB -20250616031921 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D141530E7 -20250616032156 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D14FF9A9B -20250616032638 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D16BBC31B -20250616032926 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D17C00207 -20250616032959 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D17ED9CB7 -20250616033143 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D188B3F2B -20250616033239 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D18D93D7B -20250616033406 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D195811AF -20250616033432 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D197A3F23 -20250616033615 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1A164913 -20250616033743 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1A9B44E3 -20250616034059 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1BCEF6E7 -20250616034148 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1C136A53 -20250616034236 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1C5441E3 -20250616034337 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1CAB3D9F -20250616034506 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1D3741AB -20250616034604 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1D8D2B83 -20250616034629 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1DABAEFF -20250616034737 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E0E748B -20250616034755 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E214BBF -20250616034809 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E33125F -20250616035026 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1F01594F -20250616035037 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1F0BD763 -20250616035313 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1FFD9B1F -20250616035402 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2044014B -20250616035437 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D20733A13 -20250616035449 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D207F63BF -20250616035530 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D20B97BAF -20250616035709 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D214FA723 -20250616035859 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D21FB8CD3 -20250616035947 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D22419713 -20250616040250 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D23574D73 -20250616041101 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D265B4043 -20250616041134 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2688243B -20250616041233 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D26E075D3 -20250616041313 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2717FB07 -20250616041513 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27C50567 -20250616041521 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27C7F1FF -20250616041543 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27E425BB -20250616041613 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D280BE63F -20250616041750 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D289E2F63 -20250616041811 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D28B7A6AB -20250616042211 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2A30F7BB -20250616042216 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2A31526F -20250616042440 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2B142177 -20250616042937 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2CF2463F -20250616043203 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2DCED4A3 -20250616044015 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D30DE8723 -20250616044102 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3123CD73 -20250616044318 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D31EC950F -20250616044447 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D326D5903 -20250616044737 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D33780D73 -20250616045055 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D34ADF7BB -20250616045513 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D363FBDB3 -20250616045709 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D36F8CB13 -20250616045917 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D37C1BF97 -20250616050232 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D38EF2887 -20250616050404 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3978CA43 -20250616050547 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A18F2FB -20250616050558 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A207793 -20250616050630 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A4A78B3 -20250616051043 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3BCF05C7 -20250616051341 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3CE19A73 -20250616051541 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3D96A783 -20250616051610 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3DBD0F4F -20250616051630 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3DD597C3 -20250616052534 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D412B8027 -20250616052644 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4191D41B -20250616052653 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4197FE0F -20250616053049 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43097AFB -20250616053247 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43BB9F6F -20250616053318 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43E4F583 -20250616053536 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D44B73D53 -20250616053606 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D44E1EE3B -20250616053755 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D45876E0F -20250616054222 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4726EF6B -20250616054241 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D473B5563 -20250616054858 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D498E3BAF -20250616054917 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D49A569F7 -20250616055026 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4A0F8DAB -20250616055148 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4A8B902F -20250616055232 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4AC9177F -20250616055323 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4B1157AB -20250616055559 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4C06056B -20250616055943 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4D5F3253 -20250616060324 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4EB4258B -20250616060456 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4F406FC3 -20250616061112 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D51930143 -20250616061754 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D5404A0F3 -20250616062045 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D550D543F -20250616031848 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABCFEBCFD5B -20250616041123 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD054A326B -20250616042441 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD06E7D59B -20250616042612 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD07106BD3 -20250616043534 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD08355803 -20250616043924 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD08A63293 -20250616044633 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0982DEEB -20250616045128 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0A19FE5B -20250616050534 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0BD5F123 -20250616051248 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0CB284DF -20250616051744 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0D4576E7 -20250616052615 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0E4EAA4F -20250616053024 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0EC9F933 -20250616054931 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD112C869B -20250616061023 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD13C0FA33 -20250616061103 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD13CF073F -20250616062941 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD16121F27 -20250616063708 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD16F3763F -20250616065251 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD18E600CF -20250616065656 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1961739B -20250616070508 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1A63040B -20250616071147 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1B2EB503 -20250616072730 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1D19F2FF -20250616075823 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD20E7E04F -20250616085003 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD274EB153 -20250616090823 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD298EF107 -20250616090942 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD29B0BD37 -20250616091953 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2AD9C44B -20250616092428 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2B623263 -20250616092837 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2BDBD627 -20250616093520 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2CA7968B -20250616093745 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2CEA82B3 -20250616100958 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD30DEC413 -20250616104346 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD34EE8193 -20250616104422 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD34F86857 -20250616111013 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3825D493 -20250616113910 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3BAD9997 -20250616115912 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3E1DEE1B -20250616121039 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3F7A2C5B -20250616130700 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD46657F43 -20250616131547 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47787287 -20250616131819 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47C09A53 -20250616132017 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47F6C84F -20250616140437 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4D750693 -20250616141233 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E6BD827 -20250616141414 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E9887C3 -20250616141602 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4EC7148F -20250616142052 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F592B73 -20250616142305 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F9896B3 -20250616151719 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5631119F -20250616152331 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD56EC431B -20250616154044 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD590666B7 -20250616155712 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B10CB97 -20250616160048 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B7B673F -20250616170503 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6377E0DF -20250616170926 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD63FDBC83 -20250616171549 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD64C3C247 -20250616171931 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD653018DB -20250616175241 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD69541097 -20250616183731 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6EE1B19F -20250616184010 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6F2D909B -20250616184304 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6F839987 -20250616190140 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD71C69267 -20250616190401 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD720797DB -20250616191520 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD73692CE3 -20250616192842 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD75053C7B -20250616194857 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7782C27B -20250616195918 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD78C5964B -20250616200557 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD799219DF -20250616203649 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7D732CE7 -20250616205237 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7F5D63A3 -20250616211219 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD81D243C7 -20250616211808 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD827D9623 -20250616213202 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8429B4CF -20250616214429 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD85BA7CCF -20250616215347 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD86DADC7B -20250616215504 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD86FBFAC3 -20250616215846 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD876E6177 -20250616221047 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD88DF6D3B -20250616223829 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8C566667 -20250616224259 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8CE0DE5B -20250616231230 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD908DA493 -20250616232834 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD928EEF7B -20250616233319 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD931E7A6F -20250616235722 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD961D984F -20250617002544 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3F7A2C5B -20250617012034 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD46657F43 -20250617012906 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47787287 -20250617013133 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47C09A53 -20250617013329 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47F6C84F -20250617021654 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4D750693 -20250617022440 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E6BD827 -20250617022615 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E9887C3 -20250617022801 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4EC7148F -20250617023244 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F592B73 -20250617023455 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F9896B3 -20250617032739 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5631119F -20250617033339 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD56EC431B -20250617035013 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD590666B7 -20250617040630 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B10CB97 -20250616035607 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826297803B -20250616042133 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582643F4617 -20250616052001 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858268210533 -20250616054850 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826A097C53 -20250616080903 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858273567FDB -20250616093015 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858278B0E5BB -20250616103728 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827D1D4113 -20250616111218 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827F657FAB -20250616112833 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858280648FFB -20250616125341 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858285F47EEF -20250616135204 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F -20250616150327 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B -20250616161704 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3 -20250616170843 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663 -20250616174557 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467 -20250616185934 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3 -20250616190202 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B -20250616202814 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A400B97B -20250616210901 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A6B686D7 -20250616212925 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A805594B -20250616232503 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582AFB7787B -20250616235406 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B19E791F -20250616235513 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B1A8E57B -20250617002853 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F -20250617013846 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B -20250617025103 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3 -20250617034223 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663 -20250617041923 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467 -20250617053144 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3 -20250617053409 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B -20250617075210 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826297803B -20250617081717 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582643F4617 -20250617091509 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858268210533 -20250617094347 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826A097C53 -20250617120252 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858273567FDB -20250617132226 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858278B0E5BB -20250617142749 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827D1D4113 -20250617150158 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827F657FAB -20250617151822 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858280648FFB -20250617164140 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858285F47EEF -20250617173833 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F -20250617184837 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B -20250617200056 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3 -20250617205150 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663 -20250617212820 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467 -20250617223953 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3 -20250617224217 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B -20250618000646 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A400B97B -20250618004650 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A6B686D7 -20250618010652 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A805594B -20250618030037 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582AFB7787B -20250618032918 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B19E791F -20250618033024 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B1A8E57B -20250618042330 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B53C775B -20250618045322 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B7440A97 -20250618052359 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B954EBF7 -20250618055947 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582BBB8C053 -20250618070614 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C035FFE3 -20250618072936 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C1B7AD67 -20250618073924 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C2551963 -20250618081151 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C480076F -20250618091411 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C8B7648B -20250618104754 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582CEFBD56F -20250618114039 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D2828D6F -20250618121547 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D4D953FB -20250618122123 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D533E9B3 -20250618123407 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D608F5D7 -20250618124634 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D6DB3867 -20250618125907 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D7B0E9A3 -20250618131722 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D8E5433B -20250618154711 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582E318E597 -20250618161518 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582E4FC61FF -20250618173320 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EA4C196B -20250618181001 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582ECCDA5AF -20250618182405 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EDB674CF -20250618185052 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EF76E9A7 -20250618205008 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582F7986EE3 -20250618212939 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582FA3E17BF -20250618235642 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858304421B3B -20250619002145 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858305ECDC73 -20250619004148 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583074F20CB -20250619005851 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858308581EC3 -20250619011346 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858309471D47 -20250619020628 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85830CCF0183 -20250619024424 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85830F5F31F3 -20250619033602 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858312D48B7B -20250619043748 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858316F99C53 -20250619050309 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858318AA26EF -20250619053830 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831AFC8263 -20250619063025 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831E74A76B -20250619063819 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831EF74217 -20250619064710 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831F833663 -20250619082314 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583253C251F -20250619082850 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583257F0853 -20250619090252 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583276E0493 -20250619095319 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85832AA1D0AB -20250619111645 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833035388F -20250619143826 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833DC506AB -20250619144408 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833E1EBFA7 -20250619144618 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833E3B9B63 -20250616030759 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F355CA78B -20250616040000 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3838355B -20250616041144 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F38D7F49B -20250616050424 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3BBD0A5B -20250616052304 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3CBEA257 -20250616061654 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3FACE56B -20250616075926 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F454D7B5F -20250616081144 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F45F6C43F -20250616090044 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F48A7A38B -20250616122407 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F53BFE9BB -20250616142400 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF -20250616160108 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217 -20250616193743 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F6B909527 -20250616213952 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F72566C2F -20250616232936 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F785F050F -20250617022031 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF -20250617035521 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217 -20250617084531 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF -20250617102034 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217 -20250617135507 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F6B909527 -20250617155752 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F72566C2F -20250617174609 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F785F050F -20250617185010 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F7BE9453B -20250617203518 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F81D8D1BF -20250617221016 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F872F0C47 -20250617224617 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F89296483 -20250618022226 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F955CABCF -20250618025323 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F971B858F -20250618025845 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F976024CF -20250618031117 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F980C128F -20250618050316 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F9E572DB3 -20250618054129 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA0770223 -20250618054813 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA0D14BEB -20250618061719 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA267BBE3 -20250618064955 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA436E453 -20250618065418 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA46BE9D3 -20250618091516 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FAC5A7C77 -20250618094924 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FAE3F83CB -20250618115905 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FB57652DF -20250618130037 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FB8EDA617 -20250618132027 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBA050653 -20250618141430 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD161D4F -20250618141922 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD51B563 -20250618142521 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD9DAAA3 -20250618155406 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC2A05D13 -20250618171641 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC74EF183 -20250618171856 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC769295B -20250618181022 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FCA4F6A13 -20250618202914 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD226B033 -20250618220927 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD7DA67EF -20250618224256 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD9B5DB6B -20250618232600 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC16AAB7 -20250618232719 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC210A83 -20250618233147 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC59DC33 -20250618234218 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDCEE4BE3 -20250618235527 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDDA3E65F -20250619001532 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDEC67F03 -20250619021548 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FE56B64F3 -20250619022245 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FE5CF6A53 -20250619050955 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FEF3B127B -20250619055851 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF1FBE17F -20250619061510 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF2DEEC33 -20250619062630 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF376CBEB -20250619062934 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF39994E7 -20250619075919 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF8440A8F -20250619100929 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FFEB8B7A3 -20250619113103 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED940033A057B -20250619121235 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94005794C2F -20250619123456 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94006B2B897 -20250619124527 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94007401FAB -20250619143042 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9400D0E145B -20250619161110 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94012944667 -20250619180616 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94019090B9F -20250619182713 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9401A2D7303 -20250619200425 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9401F9624E3 -20250619202406 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94020A68B53 -20250619224804 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94028B6619B -20250619234955 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402C389D97 -20250619235705 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402C96896B -20250620000401 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402CF2980F -20250620001146 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402D572997 -20250620002229 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402DE7288F -20250620004426 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402F1E827B -20250620013315 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94031D70FAB +20260511084302 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E851DEBB +20260511084318 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E8CDA50F +20260511084322 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E8E7805F +20260511084334 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E94028EB +20260511084337 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E9505B93 +20260511084339 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E95A061B +20260511084340 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E95BA34F +20260511084342 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E964EDA7 +20260511084351 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E9AC0DDF +20260511084409 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EA355D93 +20260511084417 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EA69CB33 +20260511084426 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EAAF511F +20260511084431 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EAD498C7 +20260511084447 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB48A09F +20260511084451 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB5D719B +20260511084452 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB5FF503 +20260511084458 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB9013DB +20260511084503 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EBAB5767 +20260511084504 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EBB15B27 +20260511084514 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EBFFBC17 +20260511084531 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EC843A6B +20260511084534 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EC97F50F +20260511084545 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ECE6901F +20260511084552 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED1971BF +20260511084554 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED209567 +20260511084557 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED3552FB +20260511084558 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED37ACB7 +20260511084612 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED9E9FDB +20260511084619 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EDCC8513 +20260511084627 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE0829AB +20260511084630 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE1858F3 +20260511084637 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE4986F7 +20260511084649 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE9F8F2F +20260511084651 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EEA9F6DB +20260511084655 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EEC54913 +20260511084701 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EEEFE82B +20260511084717 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EF65796F +20260511084728 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EFB3FB6B +20260511084729 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EFBB6893 +20260511084741 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F00BAE93 +20260511084754 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F06D30AF +20260511084758 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F081BABF +20260511084800 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F08CAD2B +20260511084814 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F0EE3FEB +20260511084819 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F10E456B +20260511084829 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F1593833 +20260511084904 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F26E90EB +20260511084916 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F2CC1023 +20260511084921 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F2E9B9CB +20260511084922 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F2EBAD03 +20260511084927 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F30CA733 +20260511084930 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F322EC3B +20260511084932 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F32B7783 +20260511084950 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F3B9BE77 +20260511084957 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F3F3C437 +20260511085004 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F42127EB +20260511085025 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F4C1A767 +20260511085040 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F53CE3D3 +20260511085041 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F53EA897 +20260511085045 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5564993 +20260511085048 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F566832B +20260511085053 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F58B657B +20260511085057 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5A62933 +20260511085101 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5C1B747 +20260511085103 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5CC5643 +20260511085109 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5F9ADD3 +20260511085112 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F60A5803 +20260511085115 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F6181907 +20260511085120 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F64085F3 +20260511085128 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F67EBEC7 +20260511085130 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F688928F +20260511085134 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F6A11BCF +20260511085228 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F84A6DC3 +20260511085236 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F886857B +20260511085238 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F894B7E3 +20260511085243 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F8B33F7F +20260511085251 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F8F5CCAF +20260511085302 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F94B6593 +20260511085354 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FAE53BA3 +20260511085401 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FB1B04EF +20260511085416 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FB90570F +20260511085423 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FBC24453 +20260511085431 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FBFF5EBF +20260511085437 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FC2916A7 +20260511085450 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FC8A174B +20260511085456 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FCB54EBB +20260511085500 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FCD84703 +20260511085512 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FD3265F3 +20260511085514 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FD3CC283 +20260511085529 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FDB0BB73 +20260511085531 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FDB76EE3 +20260511085533 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FDC6AE2B +20260511085548 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FE3AB12F +20260511085617 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FF1F380B +20260511085623 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FF46610F +20260511085630 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FF785033 +20260511085657 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA20530053C857 +20260511085659 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA205300635C0B +20260511085706 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA20530094D4D3 +20260511085715 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA205300D26217 +20260511084413 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B05396A17 +20260511084504 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B05D7CE83 +20260511084537 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B063E0F03 +20260511084605 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0694203B +20260511084716 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B07739A3B +20260511084739 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B07B7FD93 +20260511085045 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0A123D03 +20260511085131 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0AA2643F +20260511085155 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0AE8B7E7 +20260511085213 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0B1A625F +20260511085218 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0B270357 +20260511085318 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0BE5EB97 +20260511085329 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0C0201D7 +20260511085449 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0D082603 +20260511085506 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0D343EEB +20260511085538 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0D98CBB7 +20260511085551 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0DBAC91F +20260511085607 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0DEA2D2B +20260511085639 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0E481887 +20260511085646 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0E5B35DB +20260511085920 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B10469FFF +20260511090018 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B10FADAA3 +20260511090049 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B115B837B +20260511090111 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B119CA293 +20260511090116 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B11A91A3F +20260511090146 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B120787EB +20260511090154 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B12180293 +20260511090214 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1255511F +20260511090236 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B129443B7 +20260511090310 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B12FC8243 +20260511090349 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B13750D6F +20260511090452 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1439B6F7 +20260511090627 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1563EAA7 +20260511090721 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B160885A3 +20260511090747 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B16556747 +20260511090921 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1778151B +20260511091003 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B17FB45F7 +20260511091015 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B181815E3 +20260511091116 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B18DC5233 +20260511091208 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B197CA4BB +20260511091230 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B19BDF25F +20260511091254 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1A059A4B +20260511091335 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1A77F8CB +20260511091344 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1A8DA6B3 +20260511091437 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1B23D1AF +20260511091508 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1B835193 +20260511091542 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1BE6CC9F +20260511091609 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1C3B3E33 +20260511091652 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1CBA0FD3 +20260511091719 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1D0C0E5B +20260511092501 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B22F536CB +20260511092700 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2473CBFB +20260511092712 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B249283BB +20260511092730 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B24C4CEE3 +20260511092755 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B250C2AAF +20260511092826 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B256821E3 +20260511092945 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2660073B +20260511093009 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B26A7E263 +20260511093059 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B27443AE3 +20260511093200 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B280601C3 +20260511093208 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2818FFF7 +20260511093314 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B28E347B7 +20260511093409 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B298F8053 +20260511093444 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B29FBD093 +20260511093513 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2A55D2EB +20260511093558 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2ADA0177 +20260511093606 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2AEBC943 +20260511093609 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2AEF3F93 +20260511093705 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2B9BBACB +20260511093831 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2CB08B33 +20260511093923 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2D4E8FAB +20260511093947 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2D9706EB +20260511094039 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E3FDE8B +20260511094044 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E49A9A7 +20260511094053 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E60035B +20260511094108 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E8A410B +20260511094116 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E9B5E5B +20260511094140 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2EE064EB +20260511094147 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2EEDA093 +20260511094220 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2F4F767F +20260511094257 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2FC5CA63 +20260511094331 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B302706CB +20260511094404 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3082EFEF +20260511094407 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B30857693 +20260511094542 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B31B00EAB +20260511094602 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B31EBAA07 +20260511094619 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3219F023 +20260511094653 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3282600B +20260511094709 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B32AECC03 +20260511094718 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B32C6615F +20260511094726 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B32D965CF +20260511094804 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B334EF713 +20260511094906 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B34116A1F +20260511094915 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B34272383 +20260511094952 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B349A4D7F +20260511095034 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B35214227 +20260511095052 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3553AE5B +20260511095101 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B356BA7EF +20260511095122 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B35A661AF +20260511095148 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B35F36513 +20260511085213 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DE796233 +20260511085455 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DF78A11B +20260511085506 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DF821ACB +20260511085613 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DFE7899F +20260511085624 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DFEFBF13 +20260511085639 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E00065BF +20260511090533 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E345D97B +20260511090740 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E40A6A43 +20260511091009 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E4EF8BC3 +20260511091250 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E5E74B47 +20260511091354 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E63E25D3 +20260511091542 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E6E0282B +20260511092251 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E978EDEB +20260511092333 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E9B60FBF +20260511092429 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EA0645E7 +20260511092440 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EA104583 +20260511092500 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EA26ABBB +20260511092742 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EB1D22A7 +20260511092937 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EBCC43AF +20260511093204 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1ECA80283 +20260511093236 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1ECD3A797 +20260511093508 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EDBEAE9B +20260511093637 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EE4557E3 +20260511093729 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EE901BBF +20260511093914 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EF2D9C97 +20260511094301 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F0870C3F +20260511094812 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F26162C7 +20260511094925 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F2CE5093 +20260511095255 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F412A0A3 +20260511095718 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F5A667E3 +20260511100210 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F765790B +20260511100855 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F9E60ACF +20260511101503 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FC198267 +20260511101632 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FCA08DA7 +20260511101824 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FD4C1BEB +20260511102051 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FE309CDF +20260511102133 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FE6C88DB +20260511102723 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2009CC593 +20260511102930 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A201604573 +20260511103230 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20277E113 +20260511103421 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20324492B +20260511103540 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20397DC0F +20260511103602 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A203B389EB +20260511103609 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A203B5C6F7 +20260511103730 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2042D0BFB +20260511104003 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A205194FAF +20260511104124 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2059088B3 +20260511104348 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2066E4383 +20260511104441 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A206B5560B +20260511104447 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A206B71ADB +20260511104510 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A206D5D4F3 +20260511104609 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20729D44B +20260511105129 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2091F8A7F +20260511105356 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20A07BA33 +20260511105523 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20A8D3D93 +20260511105713 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20B36BFDF +20260511105805 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20B7EBACF +20260511105930 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20C01B713 +20260511110250 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20D379513 +20260511110424 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20DCA2F2B +20260511111115 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A210571093 +20260511111657 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2127B4EFB +20260511112235 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A214947EFB +20260511112319 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A214D56B13 +20260511113230 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21837527B +20260511113343 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A218A1E943 +20260511113538 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2194E88FF +20260511113939 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21AD1E593 +20260511114036 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21B2908DF +20260511114202 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21BAD3A53 +20260511114234 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21BD87D93 +20260511114513 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21CCDE94F +20260511115037 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21ED27967 +20260511115213 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21F6A2A6F +20260511115226 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21F76753F +20260511115256 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21FA0A4C7 +20260511115406 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2200ACE93 +20260511115634 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A220FAC5C3 +20260511115820 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A221A2CEF3 +20260511120346 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A223AC6827 +20260511121321 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A227440BD3 +20260511121429 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A227A4BBD7 +20260511121935 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2298B4EA7 +20260511122206 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22A789527 +20260511122928 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22D39A913 +20260511123114 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22DDE0A8B +20260511123332 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22EB6627B +20260511123530 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22F6EE5B7 +20260511123631 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22FC8DB4F +20260511123659 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22FF08FC7 +20260511123715 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A23000CA8B +20260511124057 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2315CFC2F +20260511124239 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A231F5A91F +20260511124823 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2340856F3 +20260511124915 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A234539983 +20260511124941 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A23476E82F +20260511125143 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2353A2E13 +20260511125539 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A236AE737F +20260511125618 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A236E43983 +20260511125947 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A238375663 +20260511085845 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78EEE8C4A3 +20260511091516 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F0E483FB +20260511091649 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F10A675B +20260511093018 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F2A92B63 +20260511093324 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F2FF6B0F +20260511101420 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F807C29B +20260511104659 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78FC09470B +20260511110615 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78FE71565B +20260511112848 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7901464FDB +20260511114632 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790375F297 +20260511122808 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7908BA57D3 +20260511123014 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7908F62953 +20260511125838 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790C86D58B +20260511130101 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790CCD812F +20260511130335 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790D192017 +20260511130358 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790D1DBB23 +20260511130634 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790D6B1413 +20260511131453 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790E637693 +20260511134423 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79121B6543 +20260511135551 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7913895007 +20260511135629 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7913958A6F +20260511140207 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7914432D1B +20260511142805 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79176DF777 +20260511143724 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791898E99B +20260511145300 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791A956863 +20260511145512 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791AD9028B +20260511152445 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791E9E0B3B +20260511153122 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791F6775F7 +20260511165234 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7929CAE4E7 +20260511165507 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C792A15C183 +20260511172732 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C792E258D2B +20260511174520 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79306C05D3 +20260511175205 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79313F5D3B +20260511181843 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7934943E23 +20260511182739 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7935AC74D3 +20260511183113 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793618258F +20260511183359 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79366E11CB +20260511183514 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79368BF21B +20260511184341 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793792FB37 +20260511184626 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7937E46E9F +20260511185327 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7938C104EF +20260511185431 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7938DB4C7B +20260511191128 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793AFE3BF7 +20260511192516 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793CBDCAA7 +20260511193714 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793E3CB59F +20260511201609 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79432B719B +20260511204606 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7946FD4633 +20260511204844 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79474F10CB +20260511205054 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79478F021B +20260511215117 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C794F44112B +20260511221406 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79523250AF +20260511224852 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7956958807 +20260511235101 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C795E8AABB3 +20260512001813 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7961F83DE3 +20260512002328 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79629B8D77 +20260512002427 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7962B3E783 +20260512004136 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7964DE75B3 +20260512005125 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79661C50F3 +20260512005206 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79662965CB +20260512005339 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7966521EB3 +20260512005621 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7966A4BD43 +20260512011429 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7968EBCCDB +20260512021321 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C796DD7F4EF +20260512025410 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79710005D7 +20260512031022 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797310C3BB +20260512031410 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79738711AB +20260512041548 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797B6EC643 +20260512042107 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797C153B7B +20260512042126 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797C177A13 +20260512044238 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797ECAEAE3 +20260512045048 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797FCC663B +20260512051517 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7982E7DBA7 +20260512051642 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79830DD24B +20260512052705 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7984615657 +20260512053154 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7984F6924F +20260512053217 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7984FAD9DF +20260512054425 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798681D66F +20260512054523 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798698633B +20260512055000 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798728786B +20260512060001 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798863FE9F +20260512061535 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798A5BCD13 +20260512061630 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798A706533 +20260512063005 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798C26C26F +20260512072010 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799290ADD7 +20260512072617 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7993516D9B +20260512073134 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7993F4B5EB +20260512074200 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7995438487 +20260512080903 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7998B913D3 +20260512082534 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799AD2284F +20260512083554 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799C17F823 +20260512083638 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799C26EB7B +20260512085653 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799EB2ADEB +20260512090224 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799F5E738B +20260512091939 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A18435A7 +20260512092147 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A1C02383 +20260512093959 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A40C47BF +20260512094454 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A4A146A3 +20260512094621 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A4C60CA3 +20260512102542 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A9BFC7EF +20260512102838 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79AA13CF1B +20260511095023 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE41A98E00B +20260511104049 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE41DE1C75F +20260511111800 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE42054B41B +20260511114647 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4224158D3 +20260511115816 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE422FEA613 +20260511123229 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4254D176F +20260511124134 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE425DE3F2B +20260511140548 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE42B854DAF +20260511142301 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE42CA60FCB +20260511160651 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE433B318C3 +20260511172659 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE43927A373 +20260511174857 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE43AA749EB +20260511185225 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE43EF1B2BB +20260511192332 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE441149A33 +20260511211933 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE449044E63 +20260511212941 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE449ABBF17 +20260511233100 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE451E75B43 +20260511235300 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4536430A7 +20260512001220 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE454AF2CD7 +20260512005230 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4576B1E63 +20260512011028 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE458A36BEB +20260512013349 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE45A34F373 +20260512013652 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE45A61D7E3 +20260512023147 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE45BE8ECD3 +20260512035157 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE461284F53 +20260512065243 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE46D8128FF +20260512065410 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE46D91A00B +20260512071754 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE46F24D8BF +20260512075434 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4719D54EF +20260512083210 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4742B4B23 +20260512084341 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE474ECB74F +20260512102543 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47BD030C7 +20260512105318 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47D9F87DB +20260512111841 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47F494AC7 +20260512112752 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47FDF4083 +20260512114215 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE480CDE24F +20260512121938 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4830272F7 +20260512122538 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4835F13DB +20260512132936 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE487B0E3AF +20260512134435 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE488AC6987 +20260512150407 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE48DFD71FB +20260512151822 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE48EE7B8CF +20260512192821 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE49FE9732F +20260512193203 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4A0249163 +20260513000500 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B2AF3C0F +20260513001701 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B37C5183 +20260513002704 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B4244193 +20260513005121 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B5BFF1D3 +20260513010334 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B6872613 +20260513011510 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B748D7B7 +20260513012701 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B810909F +20260513015144 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B9B88957 +20260513021535 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4BB51DF93 +20260513031324 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4BF3E64C3 +20260513042835 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4C44BBCEF +20260513060042 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4CA71B093 +20260513064033 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4CD267A3F +20260513074519 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D189F8EF +20260513081343 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D36F51EB +20260513085150 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D5FDED37 +20260513085855 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D6734DBB +20260513091849 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D7C11EBF +20260513092259 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D7FF058B +20260513095632 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4DA2CA7D7 +20260513124647 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4E5A3F6FF +20260513130359 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4E6C326EB +20260513143142 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4ECADA1EF +20260513191748 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE5000215EF +20260513194554 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE501D8E52F +20260513203356 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE5051C5DA3 +20260513212158 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE508579E33 +20260513221925 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE50C29C5F3 +20260513235432 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE512A0E32B +20260514000827 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE5138C5F9B +20260511093417 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE854E91CB27 +20260511133337 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE855BCC5B67 +20260511145423 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85604E94B3 +20260511152916 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85623EE687 +20260511160309 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE856420E2A7 +20260511161537 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8564CD00EB +20260511163527 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8565E5703B +20260511172036 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85686FFB77 +20260511193344 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE856FF4A103 +20260511211617 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8575C0979B +20260511222255 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85797BD56B +20260511230530 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE857BDBEC07 +20260511231453 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE857C591683 +20260511234043 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE857DCED457 +20260512004541 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE858168DF27 +20260512014053 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE858481054F +20260512030626 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85874839C3 +20260512062055 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859252BF97 +20260512070341 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8594B94C23 +20260512080443 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859821CB6B +20260512085914 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859B389833 +20260512092935 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859CE7BECB +20260512101235 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859F4B3543 +20260512111106 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85A291F197 +20260512121811 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85A60DB437 +20260512135205 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85AB56499F +20260512145753 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85AF07A1FB +20260512153458 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B11A007F +20260512154815 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B1D15B03 +20260512161228 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B32725FF +20260512165132 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B557930B +20260512184114 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BB729CA7 +20260512191659 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BD755397 +20260512193936 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BEAF2BCF +20260512195447 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BF824533 +20260512205424 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85C2E09833 +20260512211910 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85C43D91B7 +20260512231203 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85CA9BA833 +20260512233204 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85CBAFBAE7 +20260513004810 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85CFE44E7B +20260513011314 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D149436B +20260513022921 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D5893AAB +20260513024632 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D67CA2EB +20260513034619 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D9D53AF7 +20260513040743 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85DB0698F7 +20260513043513 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85DC8E920B +20260513085147 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85EAE29EE7 +20260513100018 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85EEA0C2B3 +20260513110225 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85F21DFAA3 +20260513141916 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85FD2CD947 +20260513153435 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE860159FE0F +20260513153922 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE860197FBAF +20260513165456 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8605D7E293 +20260513173921 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE860846992F +20260513233650 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE861C536263 +20260514015528 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE86242292E3 +20260514021814 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8625634DFB +20260514024141 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8626B1CACB +20260514040027 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE862B1D7613 +20260514081435 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8639786A1F +20260514083254 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE863A73E92B +20260514095704 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE863F20AE9F +20260514104217 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE86419FDAD3 +20260514122410 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE864745ECBB @@ -71,4 +71,4 @@ STANDARDS M. Friedl, N. Provos, and W. Simpson, Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol, RFC 4419, March 2006. -OpenBSD 7.8 April 16, 2022 MODULI(5) +OpenBSD 7.9 April 16, 2022 MODULI(5) diff --git a/monitor.c b/monitor.c index 9d6672bb628e..73a85408e400 100644 --- a/monitor.c +++ b/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.255 2026/03/28 05:06:16 djm Exp $ */ +/* $OpenBSD: monitor.c,v 1.256 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright 2002 Niels Provos <provos@citi.umich.edu> * Copyright 2002 Markus Friedl <markus@openbsd.org> @@ -592,34 +592,26 @@ monitor_reset_key_state(void) int mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *unused) { - struct sshbuf *m = NULL, *inc = NULL, *hostkeys = NULL; + struct sshbuf *m = NULL, *config = NULL, *hostkeys = NULL; struct sshbuf *opts = NULL, *confdata = NULL; - struct include_item *item = NULL; int postauth; int r; debug_f("config len %zu", sshbuf_len(cfg)); if ((m = sshbuf_new()) == NULL || - (inc = sshbuf_new()) == NULL || + (config = sshbuf_new()) == NULL || (opts = sshbuf_new()) == NULL || (confdata = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); - /* XXX unnecessary? */ - /* pack includes into a string */ - TAILQ_FOREACH(item, &includes, entry) { - if ((r = sshbuf_put_cstring(inc, item->selector)) != 0 || - (r = sshbuf_put_cstring(inc, item->filename)) != 0 || - (r = sshbuf_put_stringb(inc, item->contents)) != 0) - fatal_fr(r, "compose includes"); - } - hostkeys = pack_hostkeys(); + if ((r = serialise_server_options(&options, &config)) != 0) + fatal_fr(r, "serialise_server_options"); /* * Protocol from monitor to unpriv privsep process: - * string configuration + * string configuration_blob * uint64 timing_secret XXX move delays to monitor and remove * string host_keys[] { * string public_key @@ -627,23 +619,17 @@ mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *unused) * } * string server_banner * string client_banner - * string included_files[] { - * string selector - * string filename - * string contents - * } * string configuration_data (postauth) * string keystate (postauth) * string authenticated_user (postauth) * string session_info (postauth) * string authopts (postauth) */ - if ((r = sshbuf_put_stringb(m, cfg)) != 0 || + if ((r = sshbuf_put_stringb(m, config)) != 0 || (r = sshbuf_put_u64(m, options.timing_secret)) != 0 || (r = sshbuf_put_stringb(m, hostkeys)) != 0 || (r = sshbuf_put_stringb(m, ssh->kex->server_version)) != 0 || - (r = sshbuf_put_stringb(m, ssh->kex->client_version)) != 0 || - (r = sshbuf_put_stringb(m, inc)) != 0) + (r = sshbuf_put_stringb(m, ssh->kex->client_version)) != 0) fatal_fr(r, "compose config"); postauth = (authctxt && authctxt->pw && authctxt->authenticated); @@ -652,7 +638,7 @@ mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *unused) fatal_f("internal error: called in postauth"); } - sshbuf_free(inc); + sshbuf_free(config); sshbuf_free(opts); sshbuf_free(confdata); sshbuf_free(hostkeys); @@ -832,27 +818,15 @@ void mm_encode_server_options(struct sshbuf *m) { int r; - u_int i; + struct sshbuf *config; - /* XXX this leaks raw pointers to the unpriv child processes */ - if ((r = sshbuf_put_string(m, &options, sizeof(options))) != 0) + if ((config = sshbuf_new()) == NULL) + fatal_f("sshbuf_new failed"); + if ((r = serialise_server_options(&options, &config)) != 0) + fatal_fr(r, "serialise_server_options"); + if ((r = sshbuf_put_stringb(m, config)) != 0) fatal_fr(r, "assemble options"); - -#define M_CP_STROPT(x) do { \ - if (options.x != NULL && \ - (r = sshbuf_put_cstring(m, options.x)) != 0) \ - fatal_fr(r, "assemble %s", #x); \ - } while (0) -#define M_CP_STRARRAYOPT(x, nx, clobber) do { \ - for (i = 0; i < options.nx; i++) { \ - if ((r = sshbuf_put_cstring(m, options.x[i])) != 0) \ - fatal_fr(r, "assemble %s", #x); \ - } \ - } while (0) - /* See comment in servconf.h */ - COPY_MATCH_STRING_OPTS(); -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT + sshbuf_free(config); } /* Retrieves the password entry and also checks if the user is permitted */ diff --git a/monitor_wrap.c b/monitor_wrap.c index 81596a4cc66b..e2b9a2802898 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.c,v 1.146 2026/03/02 02:40:15 djm Exp $ */ +/* $OpenBSD: monitor_wrap.c,v 1.147 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright 2002 Niels Provos <provos@citi.umich.edu> * Copyright 2002 Markus Friedl <markus@openbsd.org> @@ -302,55 +302,20 @@ mm_sshkey_sign(struct ssh *ssh, struct sshkey *key, u_char **sigp, size_t *lenp, void mm_decode_activate_server_options(struct ssh *ssh, struct sshbuf *m) { - const u_char *p; - size_t len; - u_int i; - ServerOptions *newopts; + struct sshbuf *config; int r; + u_int i; - if ((r = sshbuf_get_string_direct(m, &p, &len)) != 0) + if ((r = sshbuf_froms(m, &config)) != 0) fatal_fr(r, "parse opts"); - if (len != sizeof(*newopts)) - fatal_f("option block size mismatch"); - newopts = xcalloc(sizeof(*newopts), 1); - memcpy(newopts, p, sizeof(*newopts)); - -#define M_CP_STROPT(x) do { \ - if (newopts->x != NULL && \ - (r = sshbuf_get_cstring(m, &newopts->x, NULL)) != 0) \ - fatal_fr(r, "parse %s", #x); \ - } while (0) -#define M_CP_STRARRAYOPT(x, nx, clobber) do { \ - newopts->x = newopts->nx == 0 ? \ - NULL : xcalloc(newopts->nx, sizeof(*newopts->x)); \ - for (i = 0; i < newopts->nx; i++) { \ - if ((r = sshbuf_get_cstring(m, \ - &newopts->x[i], NULL)) != 0) \ - fatal_fr(r, "parse %s", #x); \ - } \ - } while (0) - /* See comment in servconf.h */ - COPY_MATCH_STRING_OPTS(); -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT + if ((r = deserialise_server_options(config, &options)) != 0) + fatal_fr(r, "deserialise_server_options"); + sshbuf_free(config); - copy_set_server_options(&options, newopts, 1); log_change_level(options.log_level); log_verbose_reset(); for (i = 0; i < options.num_log_verbose; i++) log_verbose_add(options.log_verbose[i]); - - /* use the macro hell to clean up too */ -#define M_CP_STROPT(x) free(newopts->x) -#define M_CP_STRARRAYOPT(x, nx, clobber) do { \ - for (i = 0; i < newopts->nx; i++) \ - free(newopts->x[i]); \ - free(newopts->x); \ - } while (0) - COPY_MATCH_STRING_OPTS(); -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT - free(newopts); } #define GETPW(b, id) \ @@ -885,22 +850,19 @@ mm_terminate(void) /* Request state information */ void -mm_get_state(struct ssh *ssh, struct include_list *includes, - struct sshbuf *conf, struct sshbuf **confdatap, +mm_get_state(struct ssh *ssh, + ServerOptions *opts, struct sshbuf **confdatap, uint64_t *timing_secretp, struct sshbuf **hostkeysp, struct sshbuf **keystatep, u_char **pw_namep, struct sshbuf **authinfop, struct sshbuf **auth_optsp) { - struct sshbuf *m, *inc; - u_char *cp; - size_t len; + struct sshbuf *m, *config; int r; - struct include_item *item; debug3_f("entering"); - if ((m = sshbuf_new()) == NULL || (inc = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL || (config = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_STATE, m); @@ -909,12 +871,11 @@ mm_get_state(struct ssh *ssh, struct include_list *includes, mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_STATE, m); - if ((r = sshbuf_get_string(m, &cp, &len)) != 0 || + if ((r = sshbuf_froms(m, &config)) != 0 || (r = sshbuf_get_u64(m, timing_secretp)) != 0 || (r = sshbuf_froms(m, hostkeysp)) != 0 || (r = sshbuf_get_stringb(m, ssh->kex->server_version)) != 0 || - (r = sshbuf_get_stringb(m, ssh->kex->client_version)) != 0 || - (r = sshbuf_get_stringb(m, inc)) != 0) + (r = sshbuf_get_stringb(m, ssh->kex->client_version)) != 0) fatal_fr(r, "parse config"); /* postauth */ @@ -926,24 +887,11 @@ mm_get_state(struct ssh *ssh, struct include_list *includes, (r = sshbuf_froms(m, auth_optsp)) != 0) fatal_fr(r, "parse config postauth"); } + if ((r = deserialise_server_options(config, opts)) != 0) + fatal_fr(r, "deserialise_server_options"); - if (conf != NULL && (r = sshbuf_put(conf, cp, len))) - fatal_fr(r, "sshbuf_put"); - - while (sshbuf_len(inc) != 0) { - item = xcalloc(1, sizeof(*item)); - if ((item->contents = sshbuf_new()) == NULL) - fatal_f("sshbuf_new failed"); - if ((r = sshbuf_get_cstring(inc, &item->selector, NULL)) != 0 || - (r = sshbuf_get_cstring(inc, &item->filename, NULL)) != 0 || - (r = sshbuf_get_stringb(inc, item->contents)) != 0) - fatal_fr(r, "parse includes"); - TAILQ_INSERT_TAIL(includes, item, entry); - } - - free(cp); sshbuf_free(m); - sshbuf_free(inc); + sshbuf_free(config); debug3_f("done"); } diff --git a/monitor_wrap.h b/monitor_wrap.h index c2f7f97d977a..f43759b21d5c 100644 --- a/monitor_wrap.h +++ b/monitor_wrap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.h,v 1.54 2026/03/02 02:40:15 djm Exp $ */ +/* $OpenBSD: monitor_wrap.h,v 1.55 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright 2002 Niels Provos <provos@citi.umich.edu> @@ -96,8 +96,8 @@ void mm_session_pty_cleanup2(struct Session *); void mm_send_keystate(struct ssh *, struct monitor*); /* state */ -struct include_list; -void mm_get_state(struct ssh *, struct include_list *, struct sshbuf *, +struct ServerOptions; +void mm_get_state(struct ssh *, struct ServerOptions *, struct sshbuf **, uint64_t *, struct sshbuf **, struct sshbuf **, u_char **, struct sshbuf **, struct sshbuf **); diff --git a/openbsd-compat/bsd-cygwin_util.c b/openbsd-compat/bsd-cygwin_util.c index 9ede21d243a2..c182fa44ad0d 100644 --- a/openbsd-compat/bsd-cygwin_util.c +++ b/openbsd-compat/bsd-cygwin_util.c @@ -198,8 +198,10 @@ _match_pattern(const char *s, const char *pattern) return 0; ws = (wchar_t *) xcalloc(len + 1, sizeof (wchar_t)); mbstowcs(ws, s, len + 1); - if ((len = mbstowcs(NULL, pattern, 0)) == (size_t) -1) + if ((len = mbstowcs(NULL, pattern, 0)) == (size_t) -1) { + free(ws); return 0; + } wpattern = (wchar_t *) xcalloc(len + 1, sizeof (wchar_t)); mbstowcs(wpattern, pattern, len + 1); ret = __match_pattern (ws, wpattern); @@ -220,7 +222,7 @@ cygwin_ug_match_pattern_list(const char *string, const char *pattern) char sub[1024]; int negated; int got_positive; - u_int i, subi, len = strlen(pattern); + size_t i, subi, len = strlen(pattern); got_positive = 0; for (i = 0; i < len;) { diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c index d5cc3755c72b..de5ac2158b8d 100644 --- a/openbsd-compat/bsd-misc.c +++ b/openbsd-compat/bsd-misc.c @@ -455,7 +455,7 @@ bzero(void *b, size_t n) int raise(int sig) { - kill(getpid(), sig); + return kill(getpid(), sig); } #endif diff --git a/openbsd-compat/fake-rfc2553.c b/openbsd-compat/fake-rfc2553.c index 5eaa47992b8d..5197c3b3790f 100644 --- a/openbsd-compat/fake-rfc2553.c +++ b/openbsd-compat/fake-rfc2553.c @@ -51,7 +51,8 @@ int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, struct hostent *hp; char tmpserv[16]; - if (sa->sa_family != AF_UNSPEC && sa->sa_family != AF_INET) + if (sa->sa_family != AF_UNSPEC && sa->sa_family != AF_INET || + salen < sizeof(struct sockaddr_in)) return (EAI_FAMILY); if (serv != NULL) { snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port)); diff --git a/openbsd-compat/fmt_scaled.c b/openbsd-compat/fmt_scaled.c index 87d40d2d38c0..9aa8ef23a9e2 100644 --- a/openbsd-compat/fmt_scaled.c +++ b/openbsd-compat/fmt_scaled.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fmt_scaled.c,v 1.21 2022/03/11 07:29:53 dtucker Exp $ */ +/* $OpenBSD: fmt_scaled.c,v 1.25 2026/06/06 23:53:59 djm Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Ian F. Darwin. All rights reserved. @@ -77,7 +77,7 @@ scan_scaled(char *scaled, long long *result) { char *p = scaled; int sign = 0; - unsigned int i, ndigits = 0, fract_digits = 0; + unsigned int i, ndigits = 0, fract_digits = 0, muls = 0, divs = 0; long long scale_fact = 1, whole = 0, fpart = 0; /* Skip leading whitespace */ @@ -186,18 +186,33 @@ scan_scaled(char *scaled, long long *result) /* scale whole part */ whole *= scale_fact; - /* truncate fpart so it doesn't overflow. - * then scale fractional part. + /* + * Scale fractional part: compute + * fpart * scale_fact / 10^(fract_digits-1) + * without intermediate overflow. scale_fact is 1024^i, + * i.e. a power of 1024 = 2^10. Interleave + * multiply-by-1024 with divide-by-10 so the running + * value stays within long long range while preserving + * precision. */ - while (fpart >= LLONG_MAX / scale_fact || - fpart <= LLONG_MIN / scale_fact) { - fpart /= 10; - fract_digits--; - } - fpart *= scale_fact; - if (fract_digits > 0) { - for (i = 0; i < fract_digits -1; i++) + muls = i; + divs = fract_digits > 0 ? fract_digits - 1 : 0; + while (muls > 0 && divs > 0) { + if (fpart <= LLONG_MAX / 1024) { + fpart *= 1024; + muls--; + } else { fpart /= 10; + divs--; + } + } + while (muls > 0) { + fpart *= 1024; + muls--; + } + while (divs > 0) { + fpart /= 10; + divs--; } if (sign == -1) whole -= fpart; diff --git a/openbsd-compat/getrrsetbyname-ldns.c b/openbsd-compat/getrrsetbyname-ldns.c index 4647b623b862..2210cc255fea 100644 --- a/openbsd-compat/getrrsetbyname-ldns.c +++ b/openbsd-compat/getrrsetbyname-ldns.c @@ -235,10 +235,11 @@ getrrsetbyname(const char *hostname, unsigned int rdclass, } *res = rrset; + rrset = NULL; /* transferred */ result = ERRSET_SUCCESS; fail: - /* freerrset(rrset); */ + freerrset(rrset); ldns_rdf_deep_free(domain); ldns_pkt_free(pkt); ldns_rr_list_deep_free(rrsigs); diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c index ad35148c9298..36e558c2c624 100644 --- a/openbsd-compat/getrrsetbyname.c +++ b/openbsd-compat/getrrsetbyname.c @@ -595,27 +595,28 @@ parse_dns_rrsection(const u_char *answer, int size, const u_char **cp, static void free_dns_query(struct dns_query *p) { - if (p == NULL) - return; + struct dns_query *next; - if (p->name) + while (p != NULL) { + next = p->next; free(p->name); - free_dns_query(p->next); - free(p); + free(p); + p = next; + } } static void free_dns_rr(struct dns_rr *p) { - if (p == NULL) - return; + struct dns_rr *next; - if (p->name) + while (p != NULL) { + next = p->next; free(p->name); - if (p->rdata) free(p->rdata); - free_dns_rr(p->next); - free(p); + free(p); + p = next; + } } static void diff --git a/openbsd-compat/vis.c b/openbsd-compat/vis.c index 0e04ed025dde..c216282e8a9f 100644 --- a/openbsd-compat/vis.c +++ b/openbsd-compat/vis.c @@ -213,6 +213,7 @@ strnvis(char *dst, const char *src, size_t siz, int flag) return (dst - start); } +#if 0 /* unused in OpenSSH */ int stravis(char **outp, const char *src, int flag) { @@ -247,5 +248,6 @@ strvisx(char *dst, const char *src, size_t len, int flag) *dst = '\0'; return (dst - start); } +#endif /* unused */ #endif @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.334 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: packet.c,v 1.339 2026/06/30 00:09:01 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -161,6 +161,9 @@ struct session_state { /* Flag indicating whether this module has been initialized. */ int initialized; + /* Monotonic clock timestamp when the connection was started. */ + time_t start_time; + /* Set to true if the connection is interactive. */ int interactive_mode; @@ -299,7 +302,7 @@ ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out) { struct session_state *state; const struct sshcipher *none = cipher_by_name("none"); - int r; + int r, wasnull = ssh == NULL; if (none == NULL) { error_f("cannot load cipher 'none'"); @@ -312,6 +315,7 @@ ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out) return NULL; } state = ssh->state; + state->start_time = monotime(); state->connection_in = fd_in; state->connection_out = fd_out; if ((r = cipher_init(&state->send_context, none, @@ -319,7 +323,8 @@ ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out) (r = cipher_init(&state->receive_context, none, (const u_char *)"", 0, NULL, 0, CIPHER_DECRYPT)) != 0) { error_fr(r, "cipher_init failed"); - free(ssh); /* XXX need ssh_free_session_state? */ + if (wasnull) + free(ssh); /* XXX need ssh_free_session_state? */ return NULL; } state->newkeys[MODE_IN] = state->newkeys[MODE_OUT] = NULL; @@ -1944,6 +1949,13 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, uint32_t *seqnr_p) DBG(debug("Received SSH2_MSG_PONG len %zu", len)); break; default: + if (ssh->kex != NULL && + (ssh->kex->flags & KEX_INIT_RECVD) != 0 && + !ssh_packet_type_is_kex(*typep)) { + error("non-transport message %u received " + "from peer during key exchange", *typep); + return SSH_ERR_PROTOCOL_ERROR; + } return 0; } } @@ -2530,7 +2542,14 @@ newkeys_from_blob(struct sshbuf *m, struct ssh *ssh, int mode) (r = sshbuf_get_string(b, &enc->key, &keylen)) != 0 || (r = sshbuf_get_string(b, &enc->iv, &ivlen)) != 0) goto out; - if ((enc->cipher = cipher_by_name(enc->name)) == NULL) { + if ((enc->cipher = cipher_by_name(enc->name)) == NULL || + enc->block_size != cipher_blocksize(enc->cipher) || + cipher_is_internal(enc->cipher)) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + if (keylen != cipher_keylen(enc->cipher) || + ivlen != cipher_ivlen(enc->cipher)) { r = SSH_ERR_INVALID_FORMAT; goto out; } @@ -2542,7 +2561,7 @@ newkeys_from_blob(struct sshbuf *m, struct ssh *ssh, int mode) if ((r = sshbuf_get_u32(b, (u_int *)&mac->enabled)) != 0 || (r = sshbuf_get_string(b, &mac->key, &maclen)) != 0) goto out; - if (maclen > mac->key_len) { + if (maclen != mac->key_len) { r = SSH_ERR_INVALID_FORMAT; goto out; } @@ -2588,6 +2607,10 @@ kex_from_blob(struct sshbuf *m, struct kex **kexp) (r = sshbuf_get_stringb(m, kex->session_id)) != 0 || (r = sshbuf_get_u32(m, &kex->flags)) != 0) goto out; + if (kex->we_need > 1024) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } kex->server = 1; kex->done = 1; r = 0; @@ -3079,6 +3102,7 @@ connection_info_message(struct ssh *ssh) xasprintf(&ret, "Connection information for %s pid %lld\r\n" "%s" + " duration %s\r\n" " kexalgorithm %s\r\n hostkeyalgorithm %s\r\n" " cipher %s\r\n mac %s\r\n compression %s\r\n" " rekey %s %s\r\n" @@ -3086,6 +3110,7 @@ connection_info_message(struct ssh *ssh) "%s", thishost, (long long)getpid(), tcp_info, + fmt_timeframe(monotime() - state->start_time), kex->name, kex->hostkey_alg, cipher, mac, comp, rekey_volume, rekey_time, diff --git a/pathnames.h b/pathnames.h index ae01c69e2d91..2f0b9f4f66d2 100644 --- a/pathnames.h +++ b/pathnames.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pathnames.h,v 1.36 2025/08/29 03:50:38 djm Exp $ */ +/* $OpenBSD: pathnames.h,v 1.37 2026/06/14 03:59:34 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -39,6 +39,7 @@ #define _PATH_HOST_ECDSA_KEY_FILE SSHDIR "/ssh_host_ecdsa_key" #define _PATH_HOST_RSA_KEY_FILE SSHDIR "/ssh_host_rsa_key" #define _PATH_HOST_ED25519_KEY_FILE SSHDIR "/ssh_host_ed25519_key" +#define _PATH_HOST_MLDSA44_ED25519_KEY_FILE SSHDIR "/ssh_host_mldsa44_ed25519_key" #define _PATH_DH_MODULI SSHDIR "/moduli" #ifndef _PATH_SSH_PROGRAM @@ -90,6 +91,7 @@ #define _PATH_SSH_CLIENT_ID_ED25519 _PATH_SSH_USER_DIR "/id_ed25519" #define _PATH_SSH_CLIENT_ID_ECDSA_SK _PATH_SSH_USER_DIR "/id_ecdsa_sk" #define _PATH_SSH_CLIENT_ID_ED25519_SK _PATH_SSH_USER_DIR "/id_ed25519_sk" +#define _PATH_SSH_CLIENT_ID_MLDSA44_ED25519 _PATH_SSH_USER_DIR "/id_mldsa44_ed25519" /* * Configuration file in user's home directory. This file need not be diff --git a/readconf.c b/readconf.c index 10cbd04ba1b9..0218ed12853a 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.411 2026/03/30 07:18:24 djm Exp $ */ +/* $OpenBSD: readconf.c,v 1.413 2026/06/29 08:16:46 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -1863,7 +1863,7 @@ parse_pubkey_algos: case oMatch: if (cmdline) { - error("Host directive not supported as a command-line " + error("Match directive not supported as a command-line " "option"); goto out; } @@ -2849,7 +2849,7 @@ fill_default_options(Options * options) { char *all_cipher, *all_mac, *all_kex, *all_key, *all_sig; char *def_cipher, *def_mac, *def_kex, *def_key, *def_sig; - int ret = 0, r; + int ret = -1, r; if (options->forward_agent == -1) options->forward_agent = 0; diff --git a/regress/Makefile b/regress/Makefile index ae45bd463fe4..a6f81bef4305 100644 --- a/regress/Makefile +++ b/regress/Makefile @@ -308,6 +308,9 @@ unit unit-bench: -d ${.CURDIR}/unittests/hostkeys/testdata $${ARGS}; \ $$V ${.OBJDIR}/unittests/match/test_match $${ARGS}; \ $$V ${.OBJDIR}/unittests/misc/test_misc $${ARGS}; \ + $$V ${.OBJDIR}/unittests/servconf/test_servconf $${ARGS}; \ + $$V ${.OBJDIR}/unittests/crypto/test_crypto \ + -d ${.CURDIR}/unittests/crypto/testdata $${ARGS}; \ if test "x${TEST_SSH_UTF8}" = "xyes" ; then \ $$V ${.OBJDIR}/unittests/utf8/test_utf8 $${ARGS}; \ fi \ diff --git a/regress/addrmatch.sh b/regress/addrmatch.sh index 26e0c9910c47..b743c7d558ef 100644 --- a/regress/addrmatch.sh +++ b/regress/addrmatch.sh @@ -1,4 +1,4 @@ -# $OpenBSD: addrmatch.sh,v 1.6 2020/08/28 03:17:13 dtucker Exp $ +# $OpenBSD: addrmatch.sh,v 1.7 2026/05/31 11:31:57 djm Exp $ # Placed in the Public Domain. tid="address match" @@ -13,7 +13,7 @@ run_trial() verbose "test $descr for $user $addr $host" result=`${SSHD} -f $OBJ/sshd_proxy -T \ -C user=${user},addr=${addr},host=${host},laddr=${laddr},lport=${lport} | \ - awk '/^forcecommand/ {print $2}'` + awk 'tolower($1) ~ /^forcecommand/ {print $2}'` if [ "$result" != "$expected" ]; then fail "failed '$descr' expected $expected got $result" fi diff --git a/regress/agent.sh b/regress/agent.sh index 26d4c9ed44b2..bdd08c6bb4f6 100644 --- a/regress/agent.sh +++ b/regress/agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: agent.sh,v 1.23 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: agent.sh,v 1.26 2026/06/15 06:36:52 djm Exp $ # Placed in the Public Domain. tid="simple agent test" @@ -84,8 +84,14 @@ if [ $r -ne 52 ]; then fail "ssh connect with failed (exit code $r)" fi +cp $OBJ/sshd_proxy $OBJ/sshd_proxy.bak +cp $OBJ/ssh_proxy $OBJ/ssh_proxy.bak for t in ${SSH_KEYTYPES}; do trace "connect via agent using $t key" + grep -vi PubkeyAcceptedAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy + echo "PubkeyAcceptedAlgorithms=+$t" >> $OBJ/sshd_proxy + grep -vi PubkeyAcceptedAlgorithms $OBJ/ssh_proxy.bak > $OBJ/ssh_proxy + echo "PubkeyAcceptedAlgorithms=+$t" >> $OBJ/ssh_proxy ${SSH} -F $OBJ/ssh_proxy -i $OBJ/$t-agent.pub -oIdentitiesOnly=yes \ somehost exit 52 r=$? @@ -93,6 +99,8 @@ for t in ${SSH_KEYTYPES}; do fail "ssh connect with failed (exit code $r)" fi done +cp $OBJ/sshd_proxy.bak $OBJ/sshd_proxy +cp $OBJ/ssh_proxy.bak $OBJ/ssh_proxy trace "agent forwarding" ${SSH} -A -F $OBJ/ssh_proxy somehost ${SSHADD} -l > /dev/null 2>&1 @@ -140,6 +148,13 @@ fi > $OBJ/authorized_keys_$USER for t in ${SSH_KEYTYPES}; do trace "connect via agent using $t key" + # Accept both keys and certs. + BASE=`echo $t | cut -d '@' -f1` + ACCEPT=`$SSH -Q key | grep "^$BASE" | xargs echo | sed 's/ /,/g'` + grep -vi PubkeyAcceptedAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy + echo "PubkeyAcceptedAlgorithms=+$ACCEPT" >> $OBJ/sshd_proxy + grep -vi PubkeyAcceptedAlgorithms $OBJ/ssh_proxy.bak > $OBJ/ssh_proxy + echo "PubkeyAcceptedAlgorithms=+$ACCEPT" >> $OBJ/ssh_proxy ${SSH} -F $OBJ/ssh_proxy -i $OBJ/$t-agent.pub \ -oCertificateFile=$OBJ/$t-agent-cert.pub \ -oIdentitiesOnly=yes somehost exit 52 @@ -200,13 +215,13 @@ if [ $r -ne 0 ]; then fi check_key_absent() { - ${SSHADD} -L | grep "^$1 " >/dev/null + ${SSHADD} -L | sed s/' .*//' | grep "^$1\$" #>/dev/null if [ $? -eq 0 ]; then fail "$1 key unexpectedly present" fi } check_key_present() { - ${SSHADD} -L | grep "^$1 " >/dev/null + ${SSHADD} -L | sed s/' .*//' | grep "^$1\$" >/dev/null if [ $? -ne 0 ]; then fail "$1 key missing from agent" fi diff --git a/regress/cert-hostkey.sh b/regress/cert-hostkey.sh index 0c160775388f..a55a1b35b50d 100644 --- a/regress/cert-hostkey.sh +++ b/regress/cert-hostkey.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cert-hostkey.sh,v 1.31 2026/02/11 22:58:23 djm Exp $ +# $OpenBSD: cert-hostkey.sh,v 1.32 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="certified host keys" @@ -70,7 +70,18 @@ touch $OBJ/host_revoked_plain touch $OBJ/host_revoked_cert cat $OBJ/host_ca_key.pub $OBJ/host_ca_key2.pub > $OBJ/host_revoked_ca -PLAIN_TYPES=`echo "$SSH_KEYTYPES" | sed 's/^ssh-//'` +PLAIN_TYPES="" +for i in $SSH_KEYTYPES; do + case "$i" in + *@openssh.com*) t="$i" ;; + *) t=`echo "$i" | sed 's/^ssh-//'` ;; + esac + if [ -z "$PLAIN_TYPES" ]; then + PLAIN_TYPES="$t" + else + PLAIN_TYPES="$PLAIN_TYPES $t" + fi +done if echo "$PLAIN_TYPES" | grep '^rsa$' >/dev/null 2>&1 ; then PLAIN_TYPES="$PLAIN_TYPES rsa-sha2-256 rsa-sha2-512" diff --git a/regress/cert-userkey.sh b/regress/cert-userkey.sh index c0decf065cd3..5d9aa94c8586 100644 --- a/regress/cert-userkey.sh +++ b/regress/cert-userkey.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cert-userkey.sh,v 1.32 2026/02/11 22:58:23 djm Exp $ +# $OpenBSD: cert-userkey.sh,v 1.33 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="certified user keys" @@ -10,7 +10,18 @@ cp $OBJ/ssh_proxy $OBJ/ssh_proxy_bak grep -v AuthorizedKeysFile $OBJ/sshd_proxy > $OBJ/sshd_proxy_bak echo "AuthorizedKeysFile $OBJ/authorized_keys_%u_*" >> $OBJ/sshd_proxy_bak -PLAIN_TYPES=`$SSH -Q key-plain | maybe_filter_sk | sed 's/^ssh-//'` +PLAIN_TYPES="" +for i in `$SSH -Q key-plain | maybe_filter_sk`; do + case "$i" in + *@openssh.com*) t="$i" ;; + *) t=`echo "$i" | sed 's/^ssh-//'` ;; + esac + if [ -z "$PLAIN_TYPES" ]; then + PLAIN_TYPES="$t" + else + PLAIN_TYPES="$PLAIN_TYPES $t" + fi +done EXTRA_TYPES="" rsa="" @@ -24,6 +35,7 @@ kname() { rsa-sha2-*) n="$1" ;; sk-ecdsa-*) n="sk-ecdsa" ;; sk-ssh-ed25519*) n="sk-ssh-ed25519" ;; + ssh-mldsa*) n=`echo "$1" | sed 's/@.*//'` ;; # subshell because some seds will add a newline *) n=$(echo $1 | sed 's/^rsa/ssh-rsa/;s/^ed/ssh-ed/') ;; esac diff --git a/regress/cfgmatch.sh b/regress/cfgmatch.sh index d627c37a3fa7..bdd4e7a43e03 100644 --- a/regress/cfgmatch.sh +++ b/regress/cfgmatch.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cfgmatch.sh,v 1.17 2025/12/19 00:57:42 djm Exp $ +# $OpenBSD: cfgmatch.sh,v 1.18 2026/05/31 11:31:57 djm Exp $ # Placed in the Public Domain. tid="sshd_config match" @@ -155,7 +155,7 @@ EOD done trace "test spec $spec" result=`${SUDO} ${SSHD} -f $OBJ/sshd_config -T -C "$spec" | \ - awk '$1=="banner"{print $2}'` + awk 'tolower($1)=="banner"{print $2}'` if [ "$result" != "$expected" ]; then fail "match $config expected $expected got $result" fi diff --git a/regress/dropbear-kex.sh b/regress/dropbear-kex.sh index 72717fbb7866..9ce366a43447 100644 --- a/regress/dropbear-kex.sh +++ b/regress/dropbear-kex.sh @@ -1,4 +1,4 @@ -# $OpenBSD: dropbear-kex.sh,v 1.4 2025/03/11 07:42:08 dtucker Exp $ +# $OpenBSD: dropbear-kex.sh,v 1.5 2026/05/12 13:02:40 dtucker Exp $ # Placed in the Public Domain. tid="dropbear kex" @@ -13,10 +13,12 @@ kex="curve25519-sha256 curve25519-sha256@libssh.org" if $SSH -Q kex | grep 'diffie-hellman-group14-sha256' >/dev/null; then kex="$kex diffie-hellman-group14-sha256" fi -# There's no flag to query KEX, so if MACs does not contain SHA1, assume -# there's also SHA1-based KEX methods either. +# Until recently, dbclient had no way to query KEX. If -Qkex is available +# then use it, otherwise check if MACs contain SHA1 and if present assume +# there's also SHA1-based KEX methods. if $SSH -Q kex | grep 'diffie-hellman-group14-sha1' >/dev/null && \ - $DBCLIENT -m help hst 2>&1 | grep -- '-sha1' >/dev/null ; then + ($DBCLIENT -Q kex 2>/dev/null | grep 'diffie-hellman-group14-sha1' >/dev/null || \ + $DBCLIENT -m help hst 2>&1 | grep -- '-sha1' >/dev/null) ; then kex="$kex diffie-hellman-group14-sha1" fi diff --git a/regress/dropbear-server.sh b/regress/dropbear-server.sh index c72c86bfd39e..49379a53ec8d 100644 --- a/regress/dropbear-server.sh +++ b/regress/dropbear-server.sh @@ -1,8 +1,14 @@ -# $OpenBSD: dropbear-server.sh,v 1.2 2025/06/29 05:35:00 dtucker Exp $ +# $OpenBSD: dropbear-server.sh,v 1.3 2026/05/27 23:04:36 dtucker Exp $ # Placed in the Public Domain. tid="dropbear server" +authkeydir=/var/run/dropbear-regress + +if [ -z "$SUDO" -a ! -w /var/run ]; then + skip "need SUDO to create dir in /var/run, test won't work without it" +fi + if test "x$REGRESS_INTEROP_DROPBEAR" != "xyes" ; then skip "dropbear interop tests not enabled" fi @@ -21,37 +27,158 @@ else trace "dropbear version $ver (${major}.${minor}) ok" fi -if [ -z "$SUDO" -a ! -w /var/run ]; then - skip "need SUDO to create dir in /var/run, test won't work without" +# Dropbear versions 2026.91 and earlier only support 4 hostkeys in total, +# however this was increased shortly after that release. Test for this. +$SUDO $DROPBEARCONVERT openssh dropbear "$OBJ/host.ed25519" "$OBJ/db.25519" >/dev/null 2>&1 +$SUDO chown $USER $OBJ/$dbkey +k="-r $OBJ/db.ed25519" +if $DROPBEAR $k $k $k $k $k -V >/dev/null 2>&1; then + limit_4_hostkeys=no +else + trace "dropbear supports only 4 host keys" + limit_4_hostkeys=yes fi -authkeydir=/var/run/dropbear-regress -ciphers=`$DBCLIENT -c help hst 2>&1 | awk '/ ciphers: /{print $4}' | tr ',' ' '` -macs=`$DBCLIENT -m help hst 2>&1 | awk '/ MACs: /{print $4}' | tr ',' ' '` -if [ -z "$macs" ] || [ -z "$ciphers" ]; then - skip "dbclient query ciphers '$ciphers' or macs '$macs' failed" +# +# Determine the set of algos supported by the Dropbear we're testing against. +# +if $DROPBEAR -Q help >/dev/null 2>&1; then + # We can directly query the server for supported algos. + dbciphers=`$DROPBEAR -Q cipher` + dbmacs=`$DROPBEAR -Q mac` + dbkexs=`$DROPBEAR -Q kex` + dbhkalgs=`$DROPBEAR -Q sig` + dbpktypes=`$DROPBEAR -Q sig` +else + # We infer ciphers and macs from dbclient and hard code the rest. + # Since this test only supports back to Dropbear 2025.07 (due to the + # need for '-D') we have a pretty good idea what to hard code. + dbciphers=`$DBCLIENT -c help hst 2>&1 | awk '/ ciphers: /{print $4}' | tr ',' ' '` + dbmacs=`$DBCLIENT -m help hst 2>&1 | awk '/ MACs: /{print $4}' | tr ',' ' '` + dbkexs="curve25519-sha256 curve25519-sha256@libssh.org" + dbkexs="$dbkexs diffie-hellman-group14-sha256" + dbkexs="$dbkexs ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521" + dbkexs="$dbkexs sntrup761x25519-sha512 mlkem768x25519-sha256" + dbhkalgs="ssh-ed25519 ecdsa-sha2-nistp256 ecdsa-sha2-nistp521 rsa-sha2-256" + dbpktypes="ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521" + dbpktypes="$dbpktypes ssh-ed25519 rsa-sha2-256" fi +if [ -z "$dbmacs" ] || [ -z "$dbciphers" ] || [ -z "$dbkexs" ] || \ + [ -z "$dbhkalgs" ] || [ -z "$dbpktypes" ]; then + fail "query ciphers '$dbciphers' macs '$dbmacs' kexs '$dbkexs' " \ + "dbhkalgs '$dbhkalgs' or bpktypes '$bpktypes' failed" +fi + +# +# Filter out ciphers, macs and kexes not supported by the OpenSSH we're testing +# and put the ones we want into ciphers, macs and kexes. +# +ciphers="" +for c in $dbciphers; do + if $SSH -Q Ciphers | grep -E "^$c\$" >/dev/null; then + ciphers="$ciphers $c" + else + trace "ssh does not support cipher '$c'" + fi +done + +macs="" +for m in $dbmacs; do + if $SSH -Q MACs | grep -E "^$m\$" >/dev/null; then + macs="$macs $m" + else + trace "ssh does not support mac '$m'" + fi +done + +kexs="" +for k in $dbkexs; do + if $SSH -Q KexAlgorithms | grep -E "^$k\$" >/dev/null; then + kexs="$kexs $k" + else + trace "ssh does not support kex '$k'" + fi +done + +# +# Now filter by supported HostKeyAlgorithms. The key types are not a 1:1 +# correlation with the algos, so we first check that the algo is supported, +# and if so put it in hkalgs add the appropriate key type to keytypes for +# later deduplication and processing. +# +hkalgs="" +keytypes="" +for alg in $dbhkalgs; do + if ! $SSH -Q HostKeyAlgorithms | grep -E "^$alg\$" >/dev/null; then + trace "ssh does not support $alg" + alg="" + fi + + kt="$alg" + case "$alg" in + sk-*) + trace "omitting sk alg $alg" + alg="" + ;; + ecdsa-sha2-nistp384) + if [ "$limit_4_hostkeys" = "yes" ]; then + trace "dropbear host key limit=4, omitting $alg" + alg="" + fi + ;; + rsa-sha2*) + kt=ssh-rsa + ;; + esac + + if [ "$alg" != "" ]; then + hkalgs="$hkalgs $alg" + keytypes="$keytypes $kt" + fi +done + +# +# Deduplicate key types (because the various RSA hostkey algos use the same +# type and Dropbear has a limit on the number of hostkeys it'll load) and +# construct hkeyopts to be passed to dropbear command line. +# +hkeyopts="" +for kt in `for i in $keytypes; do echo $i; done | sort -u`; do + key="host.$kt" + dbkey="db.$kt" + trace "convert hostkey '$key' to '$dbkey'" + if $SUDO $DROPBEARCONVERT openssh dropbear "$OBJ/$key" \ + "$OBJ/$dbkey" >/dev/null 2>&1; then + if [ ! -f "$OBJ/$dbkey" ]; then + fail "convert $key to $dbkey" + fi + $SUDO chown $USER $OBJ/$dbkey + fi + trace "hkeyopts add -r $OBJ/db.$kt" + hkeyopts="$hkeyopts -r $OBJ/db.$kt" +done + +pktypes="" +for pk in $dbpktypes; do + if $SSH -Q PubkeyAcceptedAlgorithms | grep -E "^$pk\$" >/dev/null; then + case "$pk" in + sk-*) ;; + *) pktypes="$pktypes $pk" ;; + esac + else + trace "ssh does not support pubkey type '$pk'" + fi +done + # Set up authorized_keys for dropbear. umask 077 $SUDO mkdir -p $authkeydir $SUDO chown -R $USER $authkeydir cp $OBJ/authorized_keys_$USER $authkeydir/authorized_keys -for i in `$SUDO $SSHD -f $OBJ/sshd_config -T | grep -v sk- | \ - awk '$1=="hostkey" {print $2}'`; do - file=`basename "$i"` - file=`echo "$file" | sed s/^host\./db\./g` - if $SUDO $DROPBEARCONVERT openssh dropbear "$i" "$OBJ/$file" \ - >/dev/null 2>&1; then - $SUDO chown $USER $OBJ/$file - hkeys="-r $OBJ/$file" - fi -done - rm -f $OBJ/dropbear.pid -$DROPBEAR -D $authkeydir -p $PORT -P $OBJ/dropbear.pid $hkeys -E \ - 2>$OBJ/sshd.log +$DROPBEAR -E -D $authkeydir -p $PORT -P $OBJ/dropbear.pid $hkeyopts 2>>$OBJ/sshd.log if [ $? -ne 0 ]; then fatal "starting dropbear server failed" fi @@ -62,15 +189,40 @@ done pid=`cat $OBJ/dropbear.pid` trap "kill $pid; $SUDO rm -rf $authkeydir" 0 +trace ciphers $ciphers +trace macs $macs +trace kexs $kexs +trace hkalgs $hkalgs +trace pktypes $pktypes + for c in $ciphers; do - for m in $macs; do - trace "$tid: cipher $c mac $m hk $hk" + case "$c" in + chacha20-poly1305@openssh.com|aes*-gcm@openssh.com) + tmpmacs="<implicit>" ;; + *) + tmpmacs="$macs" ;; + esac + + for m in $tmpmacs; do + for k in $kexs; do + for hk in $hkalgs; do + for pk in $pktypes; do + verbose "$tid: cipher $c mac $m kex $k hkalg $hk pk $pk" rm -f ${COPY} - ${SSH} -F $OBJ/ssh_config -oCiphers=$c -oMacs=$m \ - somehost cat ${DATA} > ${COPY} + if [ "$m" = "<implicit>" ]; then + macopts="" + else + macopts="-oMacs=$m" + fi + ${SSH} -F $OBJ/ssh_config -oCiphers=$c $macopts -oKexAlgorithms=$k \ + -oHostKeyAlgorithms=$hk -oPubkeyAcceptedAlgorithms=$pk \ + somehost cat ${DATA} > ${COPY} if [ $? -ne 0 ]; then fail "connect dropbear server failed" fi cmp ${DATA} ${COPY} || fail "corrupted copy" + done + done + done done done diff --git a/regress/hostkey-agent.sh b/regress/hostkey-agent.sh index 28dcfe17068f..0e7962e3ca94 100644 --- a/regress/hostkey-agent.sh +++ b/regress/hostkey-agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: hostkey-agent.sh,v 1.15 2024/12/04 10:51:13 dtucker Exp $ +# $OpenBSD: hostkey-agent.sh,v 1.16 2026/06/15 01:55:44 djm Exp $ # Placed in the Public Domain. tid="hostkey agent" @@ -89,13 +89,17 @@ grep -vi 'globalknownhostsfile' $OBJ/ssh_proxy.orig > $OBJ/ssh_proxy echo "UpdateHostkeys=yes" >> $OBJ/ssh_proxy echo "GlobalKnownHostsFile=none" >> $OBJ/ssh_proxy +HOSTKEYALGS="" for k in $SSH_KEYTYPES ; do verbose "Addkey type $k" echo "Hostkey $OBJ/agent-key.${k}" >> $OBJ/sshd_proxy + test -z "$HOSTKEYALGS" || HOSTKEYALGS="${HOSTKEYALGS}," + HOSTKEYALGS="${HOSTKEYALGS}${k}" ( printf 'localhost-with-alias ' ; - cat $OBJ/agent-key.$k.pub) > $OBJ/known_hosts + cat $OBJ/agent-key.$k.pub) >> $OBJ/known_hosts done +echo "HostKeyAlgorithms $HOSTKEYALGS" >> $OBJ/sshd_proxy opts="-oStrictHostKeyChecking=yes -F $OBJ/ssh_proxy" SSH_CONNECTION=`${SSH} $opts host 'echo $SSH_CONNECTION'` diff --git a/regress/kbdint.sh b/regress/kbdint.sh index 7db876180c52..6c29b929866d 100644 --- a/regress/kbdint.sh +++ b/regress/kbdint.sh @@ -1,4 +1,4 @@ -# $OpenBSD: kbdint.sh,v 1.2 2026/02/24 00:39:59 dtucker Exp $ +# $OpenBSD: kbdint.sh,v 1.3 2026/05/04 10:57:24 dtucker Exp $ # Placed in the Public Domain. # # This tests keyboard-interactive authentication. It does not run by default, @@ -11,7 +11,7 @@ tid="kbdint" if [ -z "$SUDO" -o ! -f ${OBJ}/kbdintpw ]; then - skip "Password auth requires SUDO and kbdintpw file." + skip "kbdint auth test requires SUDO and kbdintpw file." fi # Enable keyboard-interactive auth diff --git a/regress/keyscan.sh b/regress/keyscan.sh index 75a14ee0eecb..411c8222fdab 100644 --- a/regress/keyscan.sh +++ b/regress/keyscan.sh @@ -1,9 +1,11 @@ -# $OpenBSD: keyscan.sh,v 1.13 2020/01/22 07:31:27 dtucker Exp $ +# $OpenBSD: keyscan.sh,v 1.14 2026/04/27 05:49:41 dtucker Exp $ # Placed in the Public Domain. tid="keyscan" -for i in $SSH_KEYTYPES; do +# Enable all supported host key algos. +algs="" +for i in `$SSH -Q HostKeyAlgorithms`; do if [ -z "$algs" ]; then algs="$i" else diff --git a/regress/keytype.sh b/regress/keytype.sh index 11ef7d0cb270..d13525bdcd59 100644 --- a/regress/keytype.sh +++ b/regress/keytype.sh @@ -1,4 +1,4 @@ -# $OpenBSD: keytype.sh,v 1.12 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: keytype.sh,v 1.13 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="login with different key types" @@ -17,6 +17,7 @@ for i in ${SSH_KEYTYPES}; do ecdsa-sha2-nistp521) ktypes="$ktypes ecdsa-521" ;; sk-ssh-ed25519*) ktypes="$ktypes ed25519-sk" ;; sk-ecdsa-sha2-nistp256*) ktypes="$ktypes ecdsa-sk" ;; + ssh-mldsa44-ed25519*) ktypes="$ktypes mldsa44-ed25519" ;; esac done @@ -25,8 +26,8 @@ for kt in $ktypes; do xbits=`echo ${kt} | awk -F- '{print $2}'` xtype=`echo ${kt} | awk -F- '{print $1}'` case "$kt" in - *sk) type="$kt"; bits="n/a"; bits_arg="";; - *) type=$xtype; bits=$xbits; bits_arg="-b $bits";; + mldsa*|*sk) type="$kt"; bits="n/a"; bits_arg="";; + *) type=$xtype; bits=$xbits; bits_arg="-b $bits";; esac verbose "keygen $type, $bits bits" ${SSHKEYGEN} $bits_arg -q -N '' -t $type -f $OBJ/key.$kt || \ @@ -42,6 +43,7 @@ kname_to_ktype() { rsa-*) echo rsa-sha2-512,rsa-sha2-256,ssh-rsa;; ed25519-sk) echo sk-ssh-ed25519@openssh.com;; ecdsa-sk) echo sk-ecdsa-sha2-nistp256@openssh.com;; + mldsa44-ed25519) echo ssh-mldsa44-ed25519@openssh.com ;; esac } diff --git a/regress/knownhosts-command.sh b/regress/knownhosts-command.sh index 2ed6fa05e06a..58004b80e320 100644 --- a/regress/knownhosts-command.sh +++ b/regress/knownhosts-command.sh @@ -1,4 +1,4 @@ -# $OpenBSD: knownhosts-command.sh,v 1.4 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: knownhosts-command.sh,v 1.5 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="known hosts command " @@ -38,7 +38,10 @@ _EOF chmod a+x $OBJ/knownhosts_command ${SSH} -F $OBJ/ssh_proxy x true && fail "ssh connect succeeded with bad exit" +cp $OBJ/sshd_proxy $OBJ/sshd_proxy.bak for keytype in ${SSH_HOSTKEY_TYPES} ; do + grep -vi HostKeyAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy + echo "HostKeyAlgorithms=+$keytype" >> $OBJ/sshd_proxy algs=$keytype test "x$keytype" = "xssh-rsa" && algs=ssh-rsa,rsa-sha2-256,rsa-sha2-512 verbose "keytype $keytype" diff --git a/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c b/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c index da7f5a23366c..dc3cf6ee3194 100644 --- a/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c +++ b/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-verify-attestation.c,v 1.3 2025/05/12 05:42:02 tb Exp $ */ +/* $OpenBSD: ssh-verify-attestation.c,v 1.4 2026/06/29 07:46:22 djm Exp $ */ /* * Copyright (c) 2022-2024 Damien Miller * @@ -339,7 +339,7 @@ main(int argc, char **argv) extern int optind; /* extern char *optarg; */ - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); sanitise_stdfd(); log_init(__progname, log_level, SYSLOG_FACILITY_AUTH, 1); diff --git a/regress/sshsig.sh b/regress/sshsig.sh index fe0958ad27bc..695070acbac0 100644 --- a/regress/sshsig.sh +++ b/regress/sshsig.sh @@ -1,4 +1,4 @@ -# $OpenBSD: sshsig.sh,v 1.16 2025/09/11 07:23:32 djm Exp $ +# $OpenBSD: sshsig.sh,v 1.17 2026/06/16 10:58:42 dtucker Exp $ # Placed in the Public Domain. tid="sshsig" @@ -86,10 +86,10 @@ for t in $SIGNKEYS; do cat $pubkey) > $OBJ/allowed_signers ${SSHKEYGEN} -q -Y verify -s $sigfile -n $sig_namespace \ -I $sig_principal -f $OBJ/allowed_signers \ - -O print-pubkey \ - < $DATA | cut -d' ' -f1-2 > ${OBJ}/${keybase}-fromsig.pub || \ + -O print-pubkey < $DATA | \ + awk '{print $1" "$2}' >${OBJ}/${keybase}-fromsig.pub || \ fail "failed signature for $t key w/ print-pubkey" - cut -d' ' -f1-2 ${OBJ}/${keybase}.pub > ${OBJ}/${keybase}-strip.pub + awk '{print $1" "$2}' ${OBJ}/${keybase}.pub >${OBJ}/${keybase}-strip.pub diff -r ${OBJ}/${keybase}-strip.pub ${OBJ}/${keybase}-fromsig.pub || \ fail "print-pubkey differs from signature key" diff --git a/regress/test-exec.sh b/regress/test-exec.sh index 577bc01afa1c..30a2a28abf57 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -79,6 +79,14 @@ if test "x${EGREP}" != "x"; then } fi +# Likewise with awk. +if test "x${AWK}" != "x" && test "x${AWK}" != "xawk"; then + awk () +{ + ${AWK} "$@" +} +fi + SRC=`dirname ${SCRIPT}` # defaults diff --git a/regress/unittests/Makefile b/regress/unittests/Makefile index e370900e4de6..5d482eab4a85 100644 --- a/regress/unittests/Makefile +++ b/regress/unittests/Makefile @@ -1,6 +1,6 @@ -# $OpenBSD: Makefile,v 1.13 2023/09/24 08:14:13 claudio Exp $ +# $OpenBSD: Makefile,v 1.15 2026/06/14 04:08:05 djm Exp $ SUBDIR= test_helper sshbuf sshkey bitmap kex hostkeys utf8 match conversion -SUBDIR+=authopt misc sshsig +SUBDIR+=authopt misc sshsig servconf crypto .include <bsd.subdir.mk> diff --git a/regress/unittests/Makefile.inc b/regress/unittests/Makefile.inc index a5c2e8c21188..3c713c74e9d7 100644 --- a/regress/unittests/Makefile.inc +++ b/regress/unittests/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.19 2025/10/23 19:06:10 miod Exp $ +# $OpenBSD: Makefile.inc,v 1.20 2026/04/23 12:57:47 claudio Exp $ .include <bsd.own.mk> .include <bsd.obj.mk> @@ -35,7 +35,6 @@ CDIAGFLAGS+= -Wcomment CDIAGFLAGS+= -Wformat CDIAGFLAGS+= -Wformat-security CDIAGFLAGS+= -Wimplicit -CDIAGFLAGS+= -Winline CDIAGFLAGS+= -Wmissing-declarations CDIAGFLAGS+= -Wmissing-prototypes CDIAGFLAGS+= -Wold-style-definition diff --git a/regress/unittests/authopt/Makefile b/regress/unittests/authopt/Makefile index a7b8a867da3d..e8accee189ca 100644 --- a/regress/unittests/authopt/Makefile +++ b/regress/unittests/authopt/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.12 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.13 2026/06/14 04:08:05 djm Exp $ PROG=test_authopt SRCS=tests.c @@ -14,7 +14,7 @@ SRCS+=addr.c addrmatch.c bitmap.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c SRCS+=ssherr-libcrypto.c - +SRCS+=ssh-mldsa-eddsa.c libcrux-mlkem-mldsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c SRCS+=utf8.c diff --git a/regress/unittests/crypto/Makefile b/regress/unittests/crypto/Makefile new file mode 100644 index 000000000000..0a99e47170fb --- /dev/null +++ b/regress/unittests/crypto/Makefile @@ -0,0 +1,26 @@ +# $OpenBSD: Makefile,v 1.1 2026/06/14 04:08:05 djm Exp $ + +PROG=test_crypto +SRCS=tests.c +SRCS+=test_mldsa.c +SRCS+=test_mlkem.c +SRCS+=test_ed25519.c +SRCS+=test_mldsa_eddsa.c + +# From usr.bin/ssh +SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c +SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c +SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c +SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c +SRCS+=addr.c addrmatch.c bitmap.c +SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c +SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c +SRCS+=utf8.c ssherr-libcrypto.c libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c + +SRCS+=digest-openssl.c ed25519-openssl.c +#SRCS+=digest-libc.c ed25519.c + +run-regress-${PROG}: ${PROG} + env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS} -d ${.CURDIR}/testdata + +.include <bsd.regress.mk> diff --git a/regress/unittests/crypto/test_ed25519.c b/regress/unittests/crypto/test_ed25519.c new file mode 100644 index 000000000000..94a482ff29cc --- /dev/null +++ b/regress/unittests/crypto/test_ed25519.c @@ -0,0 +1,99 @@ +/* $OpenBSD: test_ed25519.c,v 1.4 2026/06/22 12:28:48 dtucker Exp $ */ +/* + * Regress test for Ed25519 keypair from seed + * + * Placed in the public domain + */ + +#include "includes.h" + +#include <sys/types.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" +#include "xmalloc.h" + +struct ed25519_kat { + const char *sk; + const char *pk; + const char *msg; + const char *sig; +}; + +static const struct ed25519_kat ed25519_kats[] = { + { + "9d61b19deffd5a60ba844af492ec2cc44449c569" + "7b326919703bac031cae7f60", + "d75a980182b10ab7d54bfed3c964073a0ee172f3" + "daa62325af021a68f707511a", + "", + "e5564300c360ac729086e2cc806e828a84877f1e" + "b8e5d974d873e065224901555fb8821590a33bac" + "c61e39701cf9b46bd25bf5f0595bbe2465514143" + "8e7a100b" + }, + { + "4ccd089b28ff96da9db6c346ec114e0f5b8a319f" + "35aba624da8cf6ed4fb8a6fb", + "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf" + "2ec4968cc0cd55f12af4660c", + "72", + "92a009a9f0d4cab8720e820b5f642540a2b27b54" + "16503f8fb3762223ebdb69da085ac1e43e15996e" + "458f3613d0f11d8c387b2eaeb4302aeeb00d2916" + "12bb0c00" + }, + { + "c5aa8df43f9f837bedb7442f31dcb7b166d38535" + "076f094b85ce3a2e0b4458f7", + "fc51cd8e6218a1a38da47ed00230f0580816ed13" + "ba3303ac5deb911548908025", + "af82", + "6291d657deec24024827e69c3abe01a30ce548a2" + "84743a445e3680d7db5ac3ac18ff9b538d16f290" + "ae67f760984dc6594a7c15e9716ed28dc027bece" + "ea1ec40a" + } +}; + +void ed25519_tests(void); + +void +ed25519_tests(void) +{ + uint8_t pk[32], sk[64], seed[32]; + uint8_t expected_pk[32], expected_sig[64]; + uint8_t *msg, *tmp; + size_t i, msglen; + unsigned long long smlen; + + for (i = 0; i < sizeof(ed25519_kats)/sizeof(ed25519_kats[0]); i++) { + TEST_START("Ed25519 keypair from seed"); + hex2bin(seed, ed25519_kats[i].sk, 32); + hex2bin(expected_pk, ed25519_kats[i].pk, 32); + ASSERT_INT_EQ(crypto_sign_ed25519_keypair_from_seed(pk, sk, seed), 0); + ASSERT_MEM_EQ(pk, expected_pk, 32); + TEST_DONE(); + + TEST_START("Ed25519 sign/verify KAT"); + msglen = strlen(ed25519_kats[i].msg) / 2; + ASSERT_PTR_NE(msg = malloc(msglen + 64), NULL); + ASSERT_PTR_NE(tmp = malloc(msglen + 64), NULL); + hex2bin(msg + 64, ed25519_kats[i].msg, msglen); + hex2bin(expected_sig, ed25519_kats[i].sig, 64); + + ASSERT_INT_EQ(crypto_sign_ed25519(msg, &smlen, msg + 64, msglen, sk), 0); + ASSERT_MEM_EQ(msg, expected_sig, 64); + + ASSERT_INT_EQ(crypto_sign_ed25519_open(tmp, &smlen, msg, msglen + 64, pk), 0); + ASSERT_INT_EQ(smlen, msglen); + free(msg); + free(tmp); + TEST_DONE(); + } +} diff --git a/regress/unittests/crypto/test_mldsa.c b/regress/unittests/crypto/test_mldsa.c new file mode 100644 index 000000000000..5bbf1c43b9b1 --- /dev/null +++ b/regress/unittests/crypto/test_mldsa.c @@ -0,0 +1,140 @@ +/* $OpenBSD: test_mldsa.c,v 1.4 2026/06/22 12:28:48 dtucker Exp $ */ +/* + * Regress test for ML-DSA + * + * Placed in the public domain + */ + +#include "includes.h" + +#ifdef USE_MLDSA + +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" +#include "xmalloc.h" +#include "sshbuf.h" + +/* in tests.c */ +struct sshbuf *load_text_file(const char *name); +char *get_json_string(struct sshbuf *content, const char *key, int consume); + +void mldsa_tests(void); + +struct kat { + char *seed; + char *pk_hash; + char *sk_hash; + char *msg; + char *rand; + char *sig_hash; +}; + +static void +load_kats(const char *file, struct kat ***katsp, size_t *nkatsp) +{ + struct sshbuf *json_buf; + struct kat *kat = NULL, **kats = NULL; + size_t nkats = 0; + + json_buf = load_text_file(file); + while (sshbuf_find(json_buf, 0, "key_generation_seed", + strlen("key_generation_seed"), NULL) == 0) { + kat = xcalloc(1, sizeof(*kat)); + kat->seed = get_json_string(json_buf, "key_generation_seed", 1); + kat->pk_hash = get_json_string(json_buf, + "sha3_256_hash_of_verification_key", 1); + kat->sk_hash = get_json_string(json_buf, + "sha3_256_hash_of_signing_key", 1); + kat->msg = get_json_string(json_buf, "message", 1); + kat->rand = get_json_string(json_buf, "signing_randomness", 1); + kat->sig_hash = get_json_string(json_buf, + "sha3_256_hash_of_signature", 1); + kats = xrecallocarray(kats, nkats, nkats + 1, sizeof(*kats)); + kats[nkats++] = kat; + } + *katsp = kats; + *nkatsp = nkats; + sshbuf_free(json_buf); +} + +static void +free_kats(struct kat **kats, size_t nkats) +{ + size_t i; + struct kat *kat; + + for (i = 0; i < nkats; i++) { + kat = kats[i]; + free(kat->seed); + free(kat->pk_hash); + free(kat->sk_hash); + free(kat->msg); + free(kat->rand); + free(kat->sig_hash); + free(kat); + } + free(kats); +} + +void +mldsa_tests(void) +{ + uint8_t pk[MLDSA44_PUBLICKEYBYTES]; + uint8_t sk[MLDSA44_SECRETKEYBYTES]; + uint8_t sig[MLDSA44_SIGBYTES]; + uint8_t pk_hash[32], sk_hash[32], sig_hash[32]; + uint8_t expected_pk_hash[32], expected_sk_hash[32]; + uint8_t expected_sig_hash[32]; + uint8_t seed[32], rand[32]; + uint8_t *msg; + size_t nkats, i, msglen; + struct kat **kats, *kat; + + TEST_START("ML-DSA 44 KATs"); + load_kats("nistkats-44.json", &kats, &nkats); + for (i = 0; i < nkats; i++) { + kat = kats[i]; + test_subtest_info("vector %zu", i); + + hex2bin(seed, kat->seed, 32); + hex2bin(expected_pk_hash, kat->pk_hash, 32); + hex2bin(expected_sk_hash, kat->sk_hash, 32); + + /* Keypair generation */ + ASSERT_INT_EQ(crypto_sign_mldsa44_keypair_seeded(pk, + sk, seed), 0); + + sha3_256(pk_hash, pk, sizeof(pk)); + sha3_256(sk_hash, sk, sizeof(sk)); + + ASSERT_MEM_EQ(pk_hash, expected_pk_hash, 32); + ASSERT_MEM_EQ(sk_hash, expected_sk_hash, 32); + + msglen = strlen(kat->msg) / 2; + ASSERT_PTR_NE(msg = malloc(msglen), NULL); + hex2bin(msg, kat->msg, msglen); + hex2bin(rand, kat->rand, 32); + hex2bin(expected_sig_hash, kat->sig_hash, 32); + + /* Signing */ + ASSERT_INT_EQ(crypto_sign_mldsa44_seeded(sig, msg, + msglen, NULL, 0, sk, rand), 0); + + sha3_256(sig_hash, sig, sizeof(sig)); + ASSERT_MEM_EQ(sig_hash, expected_sig_hash, 32); + + /* Verification */ + ASSERT_INT_EQ(crypto_sign_mldsa44_verify(sig, msg, + msglen, NULL, 0, pk), 0); + free(msg); + } + free_kats(kats, nkats); + TEST_DONE(); +} +#endif /* USE_MLDSA */ diff --git a/regress/unittests/crypto/test_mldsa_eddsa.c b/regress/unittests/crypto/test_mldsa_eddsa.c new file mode 100644 index 000000000000..0a8a38089011 --- /dev/null +++ b/regress/unittests/crypto/test_mldsa_eddsa.c @@ -0,0 +1,197 @@ +/* $OpenBSD: test_mldsa_eddsa.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* + * Regress test for MLDSA44-Ed25519 composite signature + * + * Placed in the public domain + */ + +#include "includes.h" + +#ifdef USE_MLDSA + +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <fcntl.h> +#include <unistd.h> + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" +#include "ssherr.h" +#include "sshkey.h" +#include "sshbuf.h" +#include "log.h" + +/* in tests.c */ +struct sshbuf *load_text_file(const char *name); +char *get_json_string(struct sshbuf *content, const char *key, int consume); + +void mldsa_eddsa_tests(void); + +/* + * Simple JSON-ish parser for tvec.json. + * Extracts the base64 value for a given key and decodes it into a new sshbuf. + * Errors cause ASSERT_* failures. + */ +static struct sshbuf * +get_json_b64(struct sshbuf *content, const char *key) +{ + char *b64; + struct sshbuf *ret; + + b64 = get_json_string(content, key, 0); + ASSERT_PTR_NE(ret = sshbuf_new(), NULL); + ASSERT_INT_EQ(sshbuf_b64tod(ret, b64), 0); + free(b64); + return ret; +} + +static void +onerror(void *fuzz) +{ + fprintf(stderr, "Failed during fuzz:\n"); + fuzz_dump((struct fuzz *)fuzz); +} + +static void +sig_fuzz(const uint8_t *m, size_t m_len, const uint8_t *ctx, size_t ctx_len, + const uint8_t *pk, const uint8_t *s) +{ + struct fuzz *fuzz; + u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP; + + if (test_is_fast()) + fuzzers &= ~FUZZ_1_BIT_FLIP; + if (test_is_slow()) + fuzzers |= FUZZ_2_BYTE_FLIP; /* FUZZ_2_BIT_FLIP much too slow */ + + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(s, m, m_len, + ctx, ctx_len, pk), 0); + fuzz = fuzz_begin(fuzzers, s, MLDSA44_ED25519_SIG_SZ); + TEST_ONERROR(onerror, fuzz); + for(; !fuzz_done(fuzz); fuzz_next(fuzz)) { + /* Ensure 1-bit difference at least */ + if (fuzz_matches_original(fuzz)) + continue; + ASSERT_INT_NE(crypto_sign_mldsa44_ed25519_verify(fuzz_ptr(fuzz), + m, m_len, ctx, ctx_len, pk), 0); + } + fuzz_cleanup(fuzz); +} + + +void +mldsa_eddsa_tests(void) +{ + uint8_t pk[MLDSA44_ED25519_PK_SZ]; + uint8_t sk[MLDSA44_ED25519_SK_SZ]; + uint8_t sig[MLDSA44_ED25519_SIG_SZ]; + struct sshbuf *b_m = NULL, *b_ctx = NULL, *b_pk = NULL; + struct sshbuf *b_sk = NULL, *b_s = NULL, *b_sWithContext = NULL; + struct sshbuf *json_buf = NULL; + const uint8_t *tvec_m; + size_t tvec_m_len; + const uint8_t *tvec_ctx; + size_t tvec_ctx_len; + const uint8_t *tvec_pk; + const uint8_t *tvec_sk; + const uint8_t *tvec_s; + const uint8_t *tvec_sWithContext; + + TEST_START("MLDSA44-Ed25519-SHA512 load test vectors"); + json_buf = load_text_file("draft-ietf-lamps-pq-composite-sigs.json"); + b_m = get_json_b64(json_buf, "m"); + b_ctx = get_json_b64(json_buf, "ctx"); + b_pk = get_json_b64(json_buf, "pk"); + b_sk = get_json_b64(json_buf, "sk"); + b_s = get_json_b64(json_buf, "s"); + b_sWithContext = get_json_b64(json_buf, "sWithContext"); + ASSERT_INT_EQ(sshbuf_len(b_pk), MLDSA44_ED25519_PK_SZ); + ASSERT_INT_EQ(sshbuf_len(b_sk), MLDSA44_ED25519_SK_SZ); + ASSERT_INT_EQ(sshbuf_len(b_s), MLDSA44_ED25519_SIG_SZ); + ASSERT_INT_EQ(sshbuf_len(b_sWithContext), MLDSA44_ED25519_SIG_SZ); + TEST_DONE(); + + tvec_m = sshbuf_ptr(b_m); + tvec_m_len = sshbuf_len(b_m); + tvec_ctx = sshbuf_ptr(b_ctx); + tvec_ctx_len = sshbuf_len(b_ctx); + tvec_pk = sshbuf_ptr(b_pk); + tvec_sk = sshbuf_ptr(b_sk); + tvec_s = sshbuf_ptr(b_s); + tvec_sWithContext = sshbuf_ptr(b_sWithContext); + + TEST_START("MLDSA44-Ed25519-SHA512 raw self-consistency"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_keygen(pk, sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_sign(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT key expansion"); + uint8_t pk_expanded[MLDSA44_ED25519_PK_SZ]; + uint8_t sk_expanded[MLDSA44_ED25519_SK_SZ]; + + /* Expansion: mldsa_seed (sk[0:32]) and ed25519_seed (sk[32:64]) */ + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_keygen_seeded(pk_expanded, + sk_expanded, tvec_sk, tvec_sk + 32), 0); + ASSERT_MEM_EQ(pk_expanded, tvec_pk, MLDSA44_ED25519_PK_SZ); + /* sk_expanded should also match tvec_sk */ + ASSERT_MEM_EQ(sk_expanded, tvec_sk, MLDSA44_ED25519_SK_SZ); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT verify (no context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_s, tvec_m, + tvec_m_len, NULL, 0, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT verify (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_sWithContext, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw round-trip (no context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_sign(sig, tvec_m, tvec_m_len, + NULL, 0, tvec_sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(sig, + tvec_m, tvec_m_len, NULL, 0, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw round-trip (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_sign(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT verify (no context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_s, tvec_m, + tvec_m_len, NULL, 0, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 fuzz raw verify (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_sWithContext, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + sig_fuzz(tvec_m, tvec_m_len, NULL, 0, tvec_pk, tvec_s); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 fuzz raw verify (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_sWithContext, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + sig_fuzz(tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, + tvec_pk, tvec_sWithContext); + TEST_DONE(); + + sshbuf_free(json_buf); + sshbuf_free(b_m); + sshbuf_free(b_ctx); + sshbuf_free(b_pk); + sshbuf_free(b_sk); + sshbuf_free(b_s); + sshbuf_free(b_sWithContext); +} +#endif /* USE_MLDSA */ diff --git a/regress/unittests/crypto/test_mlkem.c b/regress/unittests/crypto/test_mlkem.c new file mode 100644 index 000000000000..e9c41dc4f0a3 --- /dev/null +++ b/regress/unittests/crypto/test_mlkem.c @@ -0,0 +1,164 @@ +/* $OpenBSD: test_mlkem.c,v 1.2 2026/06/16 22:27:10 dtucker Exp $ */ +/* + * Regress test for ML-KEM + * + * Placed in the public domain + */ + +#include "includes.h" + +#ifdef USE_MLKEM768X25519 + +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" + +struct mlkem768_kat { + const char *seed; + const char *pk_hash; + const char *sk_hash; + const char *enc_seed; + const char *ct_hash; + const char *shared_secret; +}; + +static const struct mlkem768_kat mlkem768_kats[] = { + { + "7c9935a0b07694aa0c6d10e4db6b1add2fd81a25" + "ccb148032dcd739936737f2d" + "8626ed79d451140800e03b59b956f8210e556067" + "407d13dc90fa9e8b872bfb8f", + "f57262661358cde8d3ebf990e5fd1d5b896c992c" + "cfaadb5256b68bbf5943b132", + "7deef44965b03d76de543ad6ef9e74a2772fa5a9" + "fa0e761120dac767cf0152ef", + "147c03f7a5bebba406c8fae1874d7f13c80efe79" + "a3a9a874cc09fe76f6997615", + "6e777e2cf8054659136a971d9e70252f30122693" + "0c19c470ee0688163a63c15b", + "e7184a0975ee3470878d2d159ec83129c8aec253" + "d4ee17b4810311d198cd0368" + }, + { + "d60b93492a1d8c1c7ba6fc0b733137f3406cee81" + "10a93f170e7a78658af326d9" + "003271531cf27285b8721ed5cb46853043b346a6" + "6cba6cf765f1b0eaa40bf672", + "7b00751eb9b1253231213f8a14f06f0fe1b7a4fd" + "b7d1cfe44c161e577e5e8f0a", + "3a8c009e8e648ac572d5592e4a92907fae0c1767" + "be41c544b59dc3ffe61f7ded", + "cde797df8ce67231f6c5d15811843e01eb2ab84c" + "7490931240822adbddd72046", + "bce1bf3450f574130b9561ee11565fa41d599d05" + "d2136f10ad2c013eb5d13ca9", + "5f0c5d9f39d3e724b5a2bd54e69e360f72ffab5d" + "4d6cc5e572fecba80acd4796" + }, + { + "4b622de1350119c45a9f2e2ef3dc5df50a759d13" + "8cdfbd64c81cc7cc2f513345" + "e82fcc97ca60ccb27bf6938c975658aeb8b4d37c" + "ffbde25d97e561f36c219ade", + "9bda55b63cffa9bf953993918b18cd6595ea6433" + "b479e89b5cd3c9339e4468cb", + "d5fc96564df6e53622b2db8295a80a44e3bad714" + "7696e2ad1f728639c98791b1", + "f43f68fbd694f0a6d307297110ecd4739876489f" + "df07eb9b03364e2ed0ff96e9", + "2a8b5d9bdcac1b7ffb6d655368e15148308eee98" + "ae34f4105eaae87f24a008a2", + "7f3bcc03a35a0030255264914e5d88a0c93611c7" + "ca21f0609678a88ca42ce1c9" + }, + { + "050d58f9f757edc1e8180e3808b806f5bbb3586d" + "b3470b069826d1bb9a4efc2c" + "de950541fd53a8a47aaa8cdfe80d928262a5ef7f" + "8129ec3ef92f78d7cc32ef60", + "647a81f0f1b3e3dacb6e73e900f7c078cdfaa711" + "9a5ede48c7685fdb7e0fe2f5", + "1cf686cb8732c73a38b35d73b0b28fb120bc89cd" + "a1554d9f12adedc057862081", + "ea74fbc3c546500ed684bed6fe3c496d3b86d2d6" + "dfaf223969b942e9a8c95e85", + "1c51c85ce66d80c1f9bb138e5bce84dd75cee426" + "0c8817e06c6f2bd920601530", + "c630736985fdb7830d7446e18b6b81fa4a707a60" + "58964b99190120de85e7559c" + }, + { + "66b79b844e0c2adad694e0478661ac46fe6b6001" + "f6a71ff8e2f034b1fd8833d3" + "be2d3c64d38269a1ee8660b9a2beaeb9f5ac022e" + "8f0a357feebfd13b06813854", + "811aea11a24a4b09e428415f82ee836e930c3b77" + "867aafc5e6728149e3f2bd1b", + "6a1ff1351c538a5661fc3576c29408c19f42da36" + "88fa16f9ec5ead6a84420db5", + "64efa87a12cb96f98b9b81a7e5128a959c74e533" + "2aaab0444fca7b4a5e5e0216", + "db4dedc1e4d383acaf974fb50ffbf881bd3938ad" + "196fb9aebeeb1bf1ddc94e10", + "41e078d0d0c4fe5df5c6683171d5c1c3f1ef152c" + "4945f9cb299f74278ce4cc4f" + } +}; + +void mlkem_tests(void); + +void +mlkem_tests(void) +{ + uint8_t pk[MLKEM768_PUBLICKEYBYTES]; + uint8_t sk[MLKEM768_SECRETKEYBYTES]; + uint8_t ct[MLKEM768_CIPHERTEXTBYTES]; + uint8_t shared_secret[MLKEM768_BYTES], shared_secret2[MLKEM768_BYTES]; + uint8_t pk_hash[32], sk_hash[32], ct_hash[32]; + uint8_t expected_pk_hash[32], expected_sk_hash[32]; + uint8_t expected_ct_hash[32], expected_shared_secret[32]; + uint8_t seed[64], enc_seed[32]; + size_t i; + + TEST_START("ML-KEM 768 KATs"); + for (i = 0; i < sizeof(mlkem768_kats) / sizeof(mlkem768_kats[0]); i++) { + test_subtest_info("vector %zu", i); + + hex2bin(seed, mlkem768_kats[i].seed, 64); + hex2bin(expected_pk_hash, mlkem768_kats[i].pk_hash, 32); + hex2bin(expected_sk_hash, mlkem768_kats[i].sk_hash, 32); + + /* Keypair generation */ + ASSERT_INT_EQ(crypto_kem_mlkem768_keypair_seeded(pk, sk, seed), 0); + + sha3_256(pk_hash, pk, sizeof(pk)); + sha3_256(sk_hash, sk, sizeof(sk)); + + ASSERT_MEM_EQ(pk_hash, expected_pk_hash, 32); + ASSERT_MEM_EQ(sk_hash, expected_sk_hash, 32); + + hex2bin(enc_seed, mlkem768_kats[i].enc_seed, 32); + hex2bin(expected_ct_hash, mlkem768_kats[i].ct_hash, 32); + hex2bin(expected_shared_secret, + mlkem768_kats[i].shared_secret, 32); + + /* Encapsulation */ + ASSERT_INT_EQ(crypto_kem_mlkem768_enc_seeded(ct, shared_secret, + pk, enc_seed), 0); + + sha3_256(ct_hash, ct, sizeof(ct)); + ASSERT_MEM_EQ(ct_hash, expected_ct_hash, 32); + ASSERT_MEM_EQ(shared_secret, expected_shared_secret, 32); + + /* Decapsulation */ + ASSERT_INT_EQ(crypto_kem_mlkem768_dec(shared_secret2, ct, sk), 0); + ASSERT_MEM_EQ(shared_secret, shared_secret2, 32); + } + TEST_DONE(); +} +#endif /* USE_MLKEM768X25519 */ diff --git a/regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json b/regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json new file mode 100644 index 000000000000..69d0281968c5 --- /dev/null +++ b/regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json @@ -0,0 +1,8 @@ + { + "m": "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4=", + "ctx": "VGhlIGxldGhhcmdpYywgY29sb3JsZXNzIGRvZyBzYXQgYmVuZWF0aCB0aGUgZW5lcmdldGljLCBzdGF0aW9uYXJ5IGZveC4=", + "pk": "FlplaQIgVuYEA04nN9VXyMWK4XDhRhnaGaWO6FqoCtiDr5rL89omEFSIf811XxbbHpKBJzROqBqKfbPgsrMRZjBdHeRn5Oi4pK7bshdjBkXm7yCqPfMC50PkzKI5CFTsw13ikA4UmJuBupSxXDzhEchHLCybpQPBdr++Tr4NKh0cEaDi9GFlDdzLsDP/1d9Dh1N57rHOCPLi/7tjmqPYrCzFspEADbBkKBfwNgPRajzMl8FnQB8qQfMzK5tiO6jKEb+fd0C5UhwOYe4NXLazpqGtsV82Z0IC1DrQvHXNvePyHT/hOASYQQKM7D8MUSs954UFZPYFqvQrh1JyRl+87cFioQGOjfn3tt2uhYpMqzyRyeaywjwq8tyJC4ZAGuTTfDqXr76QdvTB4lKX42llgyIIdBwc4DBjugWYEiVR/PxGmzwyIBSM9PgXPAW+ijfEkyqayX0cPQRFaqi6JKxhg0iWADGTssEK8ofZwz4N711co7LRNSqfcRFb+QT9v3aAQS/VZsxyTybLHLpACDsq9qDCctewHEKZpVazOFRkTZlTIsp/YBd9avMTFWIgaxRjnuKiaLpMek0Hlx9BdvSQM9b7zFlIMGw11HBBtg/R22UfK+x2zNqSZeS3ZN6fylfum2YAm7IrNzn4car8g64DfQ6AMZHePK4eql5d5n8iShRAFTRg8jGv6pkaQBM1OaPcWMba1eDicN5pyCaYgwrhYy2yVN3uTOF4/Z1pxZ8XQ3Dx6zkA79f4P7dNhjGdYnlBH1wAnwTdGeP4epk3aF3jR/JJjRx0MxevLEYKN3DrSE580KWTmGEMM9UQcPz9sJ/+VgNkgRKGRXhw001q8vAzEhriL8mFnZhBaCNvGTbckPTH4ri3qWHbiDpztzjqKg7/bmZflQ7N7y3eX8wWSZ0g0Yh9KDJqwsIc7maoD20LxQRCr2dQZJ8mNOjsr+NonCDPBA4usp9i16WU1bBwRb81p+K6MWrax+wG+m2eBn/n/tkXBYYy1r0fBfiTizFQY6bna0HSzXqHkwwmDYc20ZGo77JE4bBlagKFQ12W74bSe7HwP28DxtvWKW56Is6lMuqZVkg8GQMW4Iz3hX9SKBe6/tw06PegPDbp/RfFAxzq9vcb5FU9kshMdnvTAY6I7OjgVGR8FXN4iZARzU5+BBQa4QblkxDUyiPLSjSSAX3oKkWmu9S9LxmrhsHgd2KOqbZL19EoZrx+eQyseaLjDuF569Da6V133Nqej46CPTZNp6ojwNSAjPY2ai1D0hZ8GQpTaeTRRiVcFUps4UHRCsUbBSTC5RJLVoGqj0eORAhib4xp7DGlKf7s1j88ZH1OgOw/rIbFMsyKSQsKKmI22Bo3FW2iVL/SoPGOKDupMQJvolkieVqK0DjUxsfDLf/VpkrM6fH3FIiw6Dz7vSz3CfUIQ0gDfQi/w08WWCP706VHeDwX1rscAvn2Cc6/q3TbP9bMYoEvS04p5LPGeHtvX/PVyfv9JNqAbrRVmtuTAd1rQhiPNHK5JH5feweblxNOsluNH5iJ2tH70R/3LcbL6jiHS9DfoxzHPnX3arWpVF1ZZ4aZivePAOX8B9J7zbxdhhdU1eUNFt+sEuGyA6VsTsHf8fZeXpbPwy1OBRMmNiJ3wG+VQC7guTMjnhs7kljuWlhZ1MlsnGroX7y51x2l78r3ntwiXkpyfpOBiDezTHPu8kYMNkLaZWeo4bygR04SD75GmjwkYGAXKSvL2XMqT8iCO8wQRrKneIeBgmQKojolj5EQlQIYptCzHjq0kVVout5a", + "sk": "AdjfWRUtikTjmiXmd17xigBEsg5YwsQ0asN8J9FSF2xb6mwkVGF7+0hHnrixO3EamBFrc/fsrDD68d2bT6F9aA==", + "s": "jf3ldp/wzf7aHNAWXPULSa7WoqVbFXac+zkQpMtFRz/dQd8bbXrttS+XKo7F/zb0ZuRfHteGNNoSVnkUvPU0i2Y1rVtgY5j7DlHKGSgk+WncxH+nusXYb4kjltDPZe4A/yvGSD6Boaq/09Yr/edE79gSs1bkNyLL7Qa33BhiZEUAT4d3SDhi2WiPtv5gkiwRGrGs4PiRkkn9gTTPVHDlct1jpfip0lDt5BWXY214k013ZKL0a+55lmMEXmyrdSTi6PdBUEQ61OCiiWEYDateWKRqZgj04qCQFJ4EdyAxVnQkN7bO1+OZdE539uNDNs9nqToegkw1AE+Iew6WGpmD4at8EyKC46OsHbCYgLzXgNBUqQEWuGUdb9JjXJx6Ycir4S1dZVcSSMopyNPfNoNrkVcQrjXuCEh2wcUNq8YcYF8EapDBTZVdcGrkGeg7/kBexN/7jBXbTBfR0dXfX/EsLPXRoWr4jW9IfTPWzaWjZijzndJXb8Mbf+PxhVQAH4fKPzMUYXsnSVLjgYv4/EIqzC4CNXU2y3zEF+0EBVG0sF0KKfzuAWvRA2Sfoy6TLotPvj574MoWoUSym9Fvk60MHmtUvUow4AAQEgjAPdR1zpJsnKdmZUWKrf2MAB5powP7G94qywlLDlH93r9RarI90hGVdhaIoGdEU+e7A+i5Uj65AIQJGcHFxeHC1gQ+gjTlVTyJt6TFmlCAcj8aLlOpQXO4TTq5Y3izgAZs92t2Nrpx8GByKgC7OHYG+aYo3Z+KvIANyfh377cogp8+tW/YQchb/22l96/q3scWIViA+AKVRJnrOOYaaL9PHrCeG81b/QUClZrmFozUiU7yyv++J6orbIDXw5rGYEPaA618km10q0Podyy2WZvldOyR5MH238zql1lu1QIGL19ivHCnwJFtE9mJQJbZ+hUk/OLfdRN025junC6h1XP52zVDu4Eb/syrGu59ox5+JyF8czYVNQhfFjWD7+Dbw5BUemv3388zjgY3q9mOfZexZglIBGvRccBuNaPnPDkxVF8o64gHgV/ydyAUcq7kIKmUfi6geORAXtCjEtLQEDnkxGX/iS7mokZ9mrb7TfygiuG93+PPlxNu9PNG7ISXrGFFAwdZCPOyyiHIU1EquBehWnmvdcM0vt0BVz35hZq2LhcWW74xCMVpScU8CypJZCkgj8ZtDUgl5z7ZfpX9OZ21glJK9s/UQOmfoFZLYhszBB21S4X2nhKEOgFv8JW48SQzVoWLlATXen0UomBn3rh4PY+dmRGwj0gxEVGMDTeSRsF/jF0l0GV437hvP4UlYaAVfc50RTOFargFEBS91YLFNfpcq5PMECgwJc5EC/iK5FR2EXYJQM7xj0a5OH+qtVO+xNVlMJT7AXQ960ie+IxvqAyHuRCXUKyi14KOdLFH5iGL0VsB8VZ1RtfU1wkwHyKkqioFE5LaoZ6MPoYMtPvRf+/nOak9m6bwtF5IxrAS1fRGTTJmMlNK3xzMwwQsurt5KBaFBdE0FYOV01A0xMpN5Wo3YFpoOebnRYxXHdwDLZZ1UAfokYkf+mS53h8xLI2mSW4J9LQaDg/y/sDuZPGIqKTyjlvc/X8zN3UvQpXb8lAHAAfbo3Xj5mkGWUglUDBnIP378angbNEIzLZcuPsfrfcSGU0ki4zM4adptxGY5LX7DinlQ6Pe4FO39BURjnYBrVH+zFQu20WfLrwBthjInasLUUUvdBew+n1/gHaxDKqAIvfBubWXJdZpPqwT9wsHBwcKQhrXxnVDXeQD2n0Vxw4tMXc3KFVUEoLRxTWQlVveaJK3zSo8XZOLS4WqEJoMweOGOAMjny6UUAjTl7wlMHOukwVK5jPCrATL40V0QvMNP08uy76fMkIFOgXvn1UmeKE1+PP6k8iX4UiVxAbkAkHVc2bA7pPHot0Eii6QvEtZGrXATpIEcbN1FdS2FmxZ/Jw+Ln+8uTviKuvlcUBXTte1MSWu2pw/V2HskCGoxsvoyGIP3qRwooxEzPrN7IBLJVOpBj67dzxfoRwFIpGBrldINyQVxT9ENgwWnTCzrI+1yZfhTlNnpw7gugImTMm9TVhFOA9kJKT/hPxq3Hyp/WJDYP/qa+O7hL8zob6UBDuCgJToU3B5TXJNl2YGnmUF6TwyWt90l6kgBTqEX7PoaoFsXUdnAHtVc4BCqMGK+fDYlrZs7PgaQbeCVcUKComEMUvg37D2OByl+kaLUbWTCyv3ajWC7teAPSRTziIArC2YKJkHktKVssnUQWLKCqWmNkX9OzsaGzDFtP+2QOEVTnydi/Zv25WuYPN9QifZmBz59vm/7vl89loTK9LegfGjSk0U0scZGDnc7hMYKbo63mwifYY2hS26qb0ZFOioUfjrQgqoHzdvBcJpvJDaR3IeL9qy5LHgXfWu/Og4f7PAjX6e3mpyUA1XfxIXBT9VsuptCNnJxFBzG6V5eNPi4ZgDa3jEW3ZYs9JRUZbGQtSuTRg2JlS+xe7/HNZPzP8ALwsaJ4zkRdEe55lqNW9nF9XiKaYXoX4FvZIE1a1e7nID2rnPIBO/hdapEtaJFaed3dua6EmJjWBEMQfpjw5EczeHnE/zbyqSelUXKN7EH+eDnIoWAA4vBjurEOWcFCraT/GNiJ81n7pT7hfsxUSDLhOdfDxy9pmttccsA8bjk4avPUOPA/Z6+R5VhL9WS1Vzqr+B9uw7PbZrFsgoYCUmKfcGi9hm0NEKvENnqS8LzTYgwENtk7JCvTnBSx2KwjPLx5HqvvUqCabb1R5OojT9wn0IOGfD1Y4Q1x3PD4ZiqDAWG6iiG2wXL5fSEckqm8VJV/jgeXAZ/C4cjIqiqF6BC7AL1ZBUCgHovQehyxT44K2xCe1KtdCvmpX59y0ZTLBA7IvO8gkbMA07BSrAhiNITMUWJulYMH1D2lPZ2DKMqtTWe4HyPubEqBQAP6J9MPrCgsDuK+GVaFaCAzSj402on8ezdr12mHE3DiuGbdQLXJ/2PNuwL22dnLe+r2BvPaFFbW/scPuxc58V2kU1SQWO8vjfWvMdbxIkZr8gJTHeDBfSo1HDjSoth/kHJw+rbwe1iwyPuwz3fZX/ggsKF6tqZB1gejx/uzkMFx0kTVaOlq/c3/0KRUpgeJWnrsvN7fEtLzx4j6uu4fL4/QQmN1CiyNbe8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwYIyw4p6ZpVOH9qAghOpGxmCwS6dSUaGbwxWhCXBSwStykpNKHmRTmcmD0as/7cBaKsCuyU6hziLYmqqRsg8TYKZQN", + "sWithContext": "16QOR8ygVCYwhcop8DrFlrolDN9WWlr1FqhFp9bNJuFbXzZLoMVKM9aLySZxlCT95sBlqEnWfoxFNAPgNAnZAEAjEWIc0ePRXyainNlXec3gmZNP122ssUc0Li+QQ7k7Bn3DkOBtV+TD5vAjtEZjD+UQFBXy2vpsjCgUyqj/w3RUVQO6+37kwgXQa8D2Cjk4NpdC06dCnQZWQWR4qj1GHGg4lg+FMo3Sr9k7cQ0ULU1TvSKMA+0CIAmdXE1uvp7Ycz2rMK6jqRrCp3AFIsADg3kgqiMwCBz8s22SuZgzdx2jpWMuWNKhJIhhcFLZtfyGEiljs36nubKENp9dOmmo22k4CdGpazZAxbQHHj5dDj8bgaCjlFyvonw6nyBlIYVI1OPpFVkWqcaUTuFl7XhvFb+kgLpL13MEeolw/VqCe0grJm9rgml1VL55Ws4JcV4c2XYJ7hjox0Yd++5uZmq0G86V2cOCZwzNE4osuQHU7C2kiMw6NmfOItfUAX5w90oPT5wld1oPfLvBmIYZOwHkXdvWkTEvBtfzQWJnussprVpzRtvi2j/4q3k6IiZKavDsVYs3x7j6zYazZlWCrQqVqQT8zxqAPo8HH4KRX53h+0vrBaXj2Mn9CLd5PvoMgF04z35nSX5ZykV02s02k3nJ+lte2cAaC0uHr8WohuwN5RK2ZDOSL/631o05F67BLKxBUD8zcOyxPYGDvjKlh/0OKxbg1w62VRdkn+MxsinAytotJIZpOMDdlfwTupe2urYRKG4hFXvBQio31kQcaXSajYoC6rLEavEea5xaLY/hrD7KexP7h0dNps2i04gF0GBz0oAfgoOW7SUnLk0ey+ZLpsQc0O4MIIkghZs1aA62zkv1Kes6C1gFZ6ypHA86yjS0p7C+GJnNCSVLLO3/fWp6PQLyNJuLM4bZD8AYqIIMBumj6bMoez57KsAD6ogBwl2P6bNGIPCON1YlrEav9kR7IsISYF4N7f2Gu2fiHgjbdvDSo2uBu09kcOC8GlR2Ef3adYq6EJl5uNk3OUo2vjX5MI9SheYDBmKXWYpmvJXvofuw6HSo8wKo7Nv63APeSIzP1ZCX0ktz8TtDINMKMcQKin6YigXaJCWJ+TLPPhmkhxPuqQ/85umRmxf3NUlCBoL0TwoR0y4V9/KRdpPkyo3MKx/5vkOTYJZabCRPO7xrMyF8oA0h8toOhKsJOcgtRPkmqx5UJRoebHqgdzJoasxfWd2naenjcfaLUSJvzOa2FWkgNPA5QXZAkQdYDVh/FUWSonf+i1XwBj25hEqv1XgdmqCq/rKZ6Z9yEoWnacW1IEiYRggaCeuPY1KSFFtU3vYjhm8iDgMmeBJO7bKwQeAs8+UkyOumbNdIvc/+VAz9FUomsRqW1UAGnahV2ePcCwNTb/zxnkgIwBA5nPRu9WTrC5pgiqGlekoNWyiNZ0RfCPiP1r6qMCZ0K0luHEtkyp5ObmoGQWJOqq+PhurA+Uy4ISurVBD/OumGpn7fD4rcNhwohpZBS+czVeHTfvRYN/BRgKAu4rkFeC+1b9h+ayp3w+CQqc044k8PArEiw1XB0I7lwsXwlFp4hyvrmPqrV/d077k8BQERxSgvcwQc3jyTY51ofgfDt7No73Ws04EckY6PSt37AMfWF8HoESA9cy27mRAK8j5RUyigWm9vUbnXWjyA2toBrAyGqjhpmb15W5dwYVTX/SFxpZr4R6Els2KVWVeO1hY3LHhIZ33l/FOWQKuRZ+7seG72C7mr35wEUeia8p/CLMD2r/qdi3LNl9M4ypMXVnvyB6bAfjPqLCitDaRR+OQME1RSty+RtWdNrl9MxjH2jxNA9Ur3SNVYRnrtWSCKUPJNcxDAHrgfEZu3vdh773XWOE/Cp9eMEwSsXYD8gLNi0hTeIQG0Cpe3s2fAngfuok6aUBnv6Zl45sq6IZYxQjei0cJO5bMg9ahDpc1Kbr/RoJK2orDlRPL8MVtsk261zg08/YtDTxDi7nBVFKTKfS/T0J0xpHmbmVxvAYOR9WH39hvVsdmlph+P4FClweo8VIS667g1lfS3ak6ih01pCnlB/wF7ik7ExVV2E5bHAM+tzaj8o8EWr95Ob1LNv9AjPuzb7RCsq9A7mTuUV+Zl8yBxC9bpaPXje3pErOHptPUSqs96xboT9XEdsb9KaovUvpuBDEXDrKJVIlR/uzoHCUjTuwP1cUgLP750J472D0Z2QJ7n+n8bUgEic1wzSVLAQL48SohxwDO1Kds42TSFPnw+xTdQeHhG89Ma1tayR3RKZeSHdWoqRkBwuOPZs/Yj6tlSgJj1xfd+9ezzBEAKxr0TBPq9RvepkEj7ujwXlAaJkpD8e59DCpY5GtuQ9lUE2kj8j94jBo4GrZ3H3g3OV2A9L2HlDhTTtgWCGR97YUhQUF9jiTKDBm/kgkDrtJg3khEMAdy3w5Kg+KyFQ1Zk9heV3Pd0rHi0L+wq32pMmq5KqVCw6QLNaYOaWKEx5KhSq56wx1+wY3tYKqIsvWAvoR/JxYFSPP2xX+dj7ZWy881jKoduzXybL42MVisieBHx+TppLv1NviLPIK/vxBbIWOkzKCP2Tz42RGKnT+L38mvpqVuQKC66nlgvjXX3uhsvIi21YzcHrye/X+b16+MS4zQs5lFqMYO8VHTLzs5+QTHYeuGuep7G1VVIFE4xyrpX/6IpKmOwOKlrcTl83Bin3ezXMLRPIZw0IPpT4kwO1pY0OV0ue5JkSv4i/StClpee0WzROCFwuTnUS6zyto7wZayPswbKYngAEe6cDn4FraUtKhDW+i4KxUpxy/4FDYfMb4BUNkvy1e4P2XWfkuGP9BerbkJlcBMLiDVPg3cq2iJnnDHrkOC6oOnX0hsrleTRRthW4dZ0+0hLeYQFhz4ZQXoPQNHudHknMw92ljCvYFzcsEK3x2BRS3Bxy5t3RV9fu+CH/FUHcxpUyWYef+/lLwA59cRspAlebQubUSt5h88JYdk8P0f/zjSc5stBe05+LWvDap2gELbW28+Yh5Gj4wWIRQnyOaOg9AnMguJzy+qLdkj9n93/1VshFwf5uTjdGUBxXClRMDlnJUf3VL7c2MYoEAQlGKULbNAuci0CCxNbe4zD4AsTN5evtMbX4PHy8xksMTY+RUhQYnh/gqrN2ff8AgU1ODlBYWhsbXBymZqkp7Cz9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgUJTj58hwuB2hJl7Dzze2CSxtJ6vPILyue6EC8WWg7EocSMmqVGdGPosayh5fFFCmYnrMRJKER/VVQLyanEE30/KkA" + } diff --git a/regress/unittests/crypto/testdata/nistkats-44.json b/regress/unittests/crypto/testdata/nistkats-44.json new file mode 100644 index 000000000000..af1ecae2c1ce --- /dev/null +++ b/regress/unittests/crypto/testdata/nistkats-44.json @@ -0,0 +1,802 @@ +[ + { + "key_generation_seed": "7c9935a0b07694aa0c6d10e4db6b1add2fd81a25ccb148032dcd739936737f2d", + "sha3_256_hash_of_verification_key": "42e51c8ab5de8df35bd209e57656e1e83f41a6c90fa10bc71b95c4f4f2c70a2c", + "sha3_256_hash_of_signing_key": "af98fdf9fd9bcf1f44c424a15c54a0dd26073f26bfdb32c19c8cbbcdc3c548ba", + "message": "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac8", + "signing_randomness": "8626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f", + "sha3_256_hash_of_signature": "e50bfc6f185ce042313ce4eeb98c3c8fa62c3ddd18917997a104dea224186a3a" + }, + { + "key_generation_seed": "4b622de1350119c45a9f2e2ef3dc5df50a759d138cdfbd64c81cc7cc2f513345", + "sha3_256_hash_of_verification_key": "3f8259e55ddf984d721052c391a81ba3cba1e3d9637fb5f07152fd2d1c25f21f", + "sha3_256_hash_of_signing_key": "7984ce89b5045ad4b37360bb73183c695f3a559147a28da5a76034c27fedf652", + "message": "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1ab2568209e46dba961869c6f83983b17dcd49", + "signing_randomness": "e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade", + "sha3_256_hash_of_signature": "7902f301c1f1a3be2f7212b6c84f8a7105e1642863ae24406edcf494960b1d6a" + }, + { + "key_generation_seed": "1d836e889e46259bcd1ccd2b369583c5b47cfbb919ec2b72c280247cb15a5569", + "sha3_256_hash_of_verification_key": "e7d48befd495681a943bee8f4e5f6b49e1be9b5f13b578df60dee00e84e25361", + "sha3_256_hash_of_signing_key": "364b20d3f76bd412f7ec6af4f0d360cba1662d249e91574d457c9d1111749727", + "message": "2b8c4b0f29363eaee469a7e33524538aa066ae98980eaa19d1f10593203da2143b9e9e1973f7ff0e6c6aaa3c0b900e50d003412efe96deece3046d8c46bc7709228789775abdf56aed6416c90033780cb7a4984815da1b14660dcf34aa34bf82cebbcf", + "signing_randomness": "f333d36590910e7a5a6cbe567bcdd154137eef62b92bf8dc1fdc900e7c194e5f", + "sha3_256_hash_of_signature": "6fc43168ded663eb41778b787dd76a875302e42e05b4c65a74bb6f89436467d7" + }, + { + "key_generation_seed": "539577cb7f2088fbedff1b53f235d607321857db32bba645f8df3a89dd426552", + "sha3_256_hash_of_verification_key": "bf4293953a8947a34ea53107c397d783449c1b2997ba1a93c3518626479a104b", + "sha3_256_hash_of_signing_key": "12e6e576e0095b0b04206aafa1af2d136d4cb4d576973e970646c23b6032efe8", + "message": "2f7af5b52a046471efcd720c9384919be05a61cde8e8b01251c5ab885e820fd36ed9ff6fdf45783ec81a86728cbb74b426adff96123c08fac2bc6c58a9c0dd71761292262c65f20df47751f0831770a6bb7b3760bb7f5efffb6e11ac35f353a6f24400b80b287834e92c9cf0d3c949d6dca31b0b94e0e3312e8bd02174b170c2ca9355fe", + "signing_randomness": "f52a43f5358999ddbe311866dedcf629fbd5ae94919abde9fdebdaf93bb0c847", + "sha3_256_hash_of_signature": "51b56173b1c32c972a1b4a82161341f7127ddccd266df562e2429714ae267938" + }, + { + "key_generation_seed": "2ca59c6cf33c53803749f69ef5abfa9482fcee7efd87fbf17135ecc3ff3fd7f7", + "sha3_256_hash_of_verification_key": "fd89760f974478a48349b3bbba85375786559437cfff806773deffc01d4d2bb8", + "sha3_256_hash_of_signing_key": "4bf0a05d40b6580a32dc09e3b852aba2b55789644d37c26b7fba0fb1b8efd555", + "message": "1cdf0ae1124780a8ff00318f779a3b86b3504d059ca7ab3fe4d6eae9fd46428d1dabb704c0735a8fe8708f409741017b723d9a304e54fdc5789a7b0748c2464b7308ac9665115644c569ae253d5205751342574c03346dddc1950a6273546616b96d0c5ece0a044af0edefbe445f9ae37da5afb8d22a56d9fd1801425a0a276f48431d7af039521e549551481391fe5f4ebfb7644d9f9782d83a95137e84ea3aeb3c2f8099", + "signing_randomness": "a685acf5e2640f2d085efd1c9cebe815e042482a79694c32e28e97fad3bef590", + "sha3_256_hash_of_signature": "2da345196311cac635d4bab01c5debaa9800d4e7cbf05ab12f3b0220cca3ab2c" + }, + { + "key_generation_seed": "e17e72290e49a44c9c534f211195257cf13b0d45405782ceda2d7f982a551721", + "sha3_256_hash_of_verification_key": "2e4a755846f0fa861761e1a9df18901593b4919a7855d61638fa25756ab42375", + "sha3_256_hash_of_signing_key": "04ccfe2dfef4dff93fd9e8a399670522ac6494e6d02dd2857034bda0cb931c42", + "message": "dbe5b6c299b44f8d60fa972a336df789ef4534ec9ba90df92ad401d1907951eb6285eda8f134277ab0a1145001c34e392187122506aa2dbb8617d7943a129eb5c07df133d7ccde94a7cb7f1795c62493ed375353d1f044257da799f7d112c174fbc35687e2f87fefbe2d83d29d7314b30a749fe41b1b81095638f112bc4563420af235280e466ffbe7050c4937c60fc18d1a6025bcbd489f0c538e088e906abe8597e2c8ebb64f01d225c847aae4b77bae6eba9269962c4b94a9732ceaa2cb4093d442ffbcdd", + "signing_randomness": "bf7fe774845dd2519943a685217bbb9e641acf9570468e47fc0b6b908271cd3c", + "sha3_256_hash_of_signature": "e4142a0e5b14aca1e39c99f9edb0960413808f2c90324b62ff5a37b628af660a" + }, + { + "key_generation_seed": "3b7388e675de5c59a78af095481c7dd999c6eea898595b1e7dcda7edc3a2c25c", + "sha3_256_hash_of_verification_key": "41dad024181b1dc97c6bbcdda150e81ff528881e4dd0db1ffe92a06b1795c004", + "sha3_256_hash_of_signing_key": "1db68131bccfb19de9ba7fea38f5e747b602b13194497f70a3b7a0913898cad1", + "message": "0073bee97fc97c0fbc750d474aeb93189f061e1a5cf6600c04fb0464338ec7e85252f94fcbc7b2bd00e438480d9af3add92a92e3e2e8acb55077c3278fc7503988a76e9b6062996b20889aa55b343d5a003c8a8852d738f955799fa3426be5ccd3aa6b6eda04d4884941ffc0b69c5acf12b347a74d0580cc3335ba816200f87674a4c1d98097c70f2f27c74e94a661850610ecf4847ab5b58344f958c5719e06ba396225bbe21acb0fdc512b885d391e11b0c0ed5ce6b5dd8faff91f50025c69d43072f7706d80d9fd786e1104125d79a5f4b5fd838815d44fc8b1ab678078cc174dde970d448b", + "signing_randomness": "83963a577ad1ff81ef4afe4945fea5b2fcbdeb6ac3dd714c3d9422cc5039066f", + "sha3_256_hash_of_signature": "b8f2b85dedc4cc3b6f506c4a7704e5b830c5eaee420ad419fd0c47e4799c4c5a" + }, + { + "key_generation_seed": "dc9f40cabe2e8e4f3d1538fbc1ada27b61b99081455ab0c4c41b5b3da8101000", + "sha3_256_hash_of_verification_key": "a446da30acc101ac4a1f3fb40b81b410c4cda56f2e57b3b0b0e0fa49adadbdd6", + "sha3_256_hash_of_signing_key": "80e74892c2a2046d1c50f77f5ddf6c9d04e7fd3284b86abae9ad8c626c703c33", + "message": "a1586245d81f96bd8ee81aa30f10c0adb343d74cf72c4dff71550c12873af89fa1874d4731c996243c3749af3f6188ffe9fa45430549045134eb29ef3cec37e72904aa082b1c6161e6b52361e49af4933a8d8c0734f21cafd7467b0c02876f43211d6122e3e735fe36064df7a0c91449237c2bc7c3a78ac7bb0f9567f2576f05802c872adf183a87aa3b8217188f2f3535f877724f35b29e545de4bcf258f13bbc7edd8c6587f733c9691f74b4151cf8c060c3ae9e8d49fe7c77bf477dc9f23fd0f0b67320275529034b84f94176730923c03aa50f9584d9c2d60b8dccf85a13f243f30a51abefbbf2cda602bf3d75e849eb92422b808416c7e56b046ce38e4677ad24d23d7237a9", + "signing_randomness": "d18cbd60c7a706d7ce6206aaea7ff817ddcb25d36fd0f800f0c3b38ce5853c76", + "sha3_256_hash_of_signature": "bdb22e5bbc018cef0c5b077873f6c69d50ee4812f1421c5b3bd941f30a902caa" + }, + { + "key_generation_seed": "1dade637ae98c393260f5bbbe288373100dd7af37eba913c528d2b7b998767cb", + "sha3_256_hash_of_verification_key": "aa63c17cc430929c4740191e8ac82281ab4b3394f7012ba983a1357e9a437add", + "sha3_256_hash_of_signing_key": "3f2fb35e415d2956b6f1fbc7e4c9613462b32eef2779f3e8c52a736a7c6e90e0", + "message": "9366ed7b3b623c411448b634446f1a3faabdd163a6cc1e2bcae4a98703cd8cee441405892fba051be2a586a6950a5ef73a255e5f86b0d7212e0c51c3bc79be4b88e76ed6f043fef3204faf044bfb1ed722d61eb5d0b74c66a257e8ac3a2206273c80d2ec2123a4dbb715d60118d99ed7322e38f1562f82379138da3ddb8baa7ce61ab729afc3748c0134633cf45a9973c05c75d04e82f631845427626b5799dc07ddf830ba01e8bc6236bb6d03b37d949dbb29eec7dfe60fbc17ea590956d251539792016e2a8b01e70476961bc9ada43cda682d0caa4fcc58810bba1a673ef8f6bc90baee701e8e4f7c04a346ca56c7b2862ff57756ce6cd1ee22d677bcdaa896eae96f87870e032c18b6c6a0c1a191fae2ed487ce55296cc4b6339eac9e8a742bd0a44c3525cc750", + "signing_randomness": "f4ea973b229c69b772e8fd400091204dd9c4c453ef412830e0b9e3560f058b52", + "sha3_256_hash_of_signature": "2b27d29cea1aa40d82d15ec2287ed9dd530a9f01d508d0f7ab9ac89a6210edca" + }, + { + "key_generation_seed": "8866693cee12b909e32a0c64381796633666417e1246b51a2643564b464b4113", + "sha3_256_hash_of_verification_key": "03592b7aa572dce92ea2fae453fb6835a6c461fe550b71f76d81519632973790", + "sha3_256_hash_of_signing_key": "bf1dd2711673098cddc2bc0f5af0b7792dd643609bbf7ba2265dfe17e3066326", + "message": "0998114c84f84080e7eebb47d248980fac9d28f1abb6dbab3dd59a5cfd2c7cff7f308372874dd5447c7b02e30165501c0c673128e4c543a414222bdf47e7f4e8dca757b0f4a3281c0d10c4f02ab52aaf5b9a715e012607ba310947a60a5f62d6b8cfa96386d27cfa709189202421c078934aa2d955468e550ad4d0d4acdd98b168a9568e232192e92789830317fbc959087fffe353b6c168f3efbe7164444f1d6cba5246e31658c65440a841dba78257e78502843ec1a6e9710229c8eeb85d6cddc7d543285624aa1f756a5dd4f1a5d4fa52db8c5c34880ed448fbb6d254509fbeea0fa022f276b6a66bef7abfea6049ff74291babe781f718683397077b29fa9e2b46bc6b09251e587cc5b182195dd4060cc4a319bfbe251a5b660a739dfe5d0e5b93f3cb7e440194f1c8bda922cb1a3ee3d27edfd61c1d31a7f4534e84889ec83b51f1641892766434", + "signing_randomness": "b640be365c75e15331d37fbe6188f4136af1fde332edb2394f8c4b35718c34f1", + "sha3_256_hash_of_signature": "eea37c2121a678582c06a4d7595b9a0b09e9e47247e74fa9a4805ddef1dc3c90" + }, + { + "key_generation_seed": "d6dad5b2746422f4487b72536d70df88af4b2f9040aa45999f8d7784ef696da0", + "sha3_256_hash_of_verification_key": "cc0d1772485c481aa39b8ab7d714544c867502a4524e34fd1ee6e3a23c9b24d0", + "sha3_256_hash_of_signing_key": "948a8265a1966218ae074cf1fcb4120ac0d069c842e78574f4773a63d268cfc7", + "message": "4cca95cb9f254c2eaa7dcffef662ee03320d5fc626a6484304bf62fc20f341fbe26e1537d7bd20e95440f7cc95ee84e1297c807a0bc9006dfcd5c22a5c1fc0865f5d70e5d63ad677fffdea52bf85d1a4f159f7ed16a745b4d971b620048b5f518eb2dc672ca35022578059e1adad7c07fe910a5d566b8321d9a12f34c250be35ce964dddea23c90ea77c9c1bbe3532feefda3637157786ec7d37775ae5cb0bb92eab45a0fb1e833e8a6f3d06b85946e31a79b64a02b31fa640ed514a85882c89f693a06354dfddb0b5e23e7792134c69c1d3908882df3a7694a05b241b87fb2dbd1a4d9f26943b69f3cdf730301663089d1ebfc23299da21300f735cedf7b109f3e0bbe273776e6aafa7054a6cd9682b967eb7903de549e9558e62dcf3ac444dd7042fea362efb555bb97fb464ad7faeaba3197c14a6740477db50ce3fb8b762f48f880381d510fcc836e5880b48f08bd6333202e838ab73f2e106cfbfb218aab802da8a00f13f78ffb70c", + "signing_randomness": "3e747db13e9a2e367e467c1ac4b72a39854a56a11f040088fb007ec7e1f2ecf1", + "sha3_256_hash_of_signature": "40bbb409f85fb401d994799a3debcc87c4a54acf6246be78a82aeb480b368bf9" + }, + { + "key_generation_seed": "68e7818f33b97ba6166768c395bd010cef7bce9995891d164303b53c1123a991", + "sha3_256_hash_of_verification_key": "9692b0716270b196639f94face2326e8d7ee33cb410e1b49994aeb530c41ce95", + "sha3_256_hash_of_signing_key": "11c96ce0e7108cda3d8cc3f0d943b13902379da9e7d582d7376fd703ea9a3332", + "message": "5c4b2e1a344da1418b0f4be3fd99505fc30f2a1e5b696e943bee2451d7b268f722e04f8e00fdd9e1a470f8c977a6d45a5f621b8815e352fa14f64977d1fa08082a48af495719ea6ac1c0b3d898603b4cf7ec88e68dd7190884382896d953d612cc21abecfb01a04a1bb1bbe8986d34625756396ccd84bd1a6b5454dda98824cd4844d98f356ab485eeb19f9196abb1c3088c0c3c5846c88760b696d91a232d6f4cffc85bff33de1a3433a27a209a461fcf37f2289f98bea7ccf183db1fc42a7edf958e7913f8711dc375e43f09be7c7a2c2b1318ae2a9cf5988fbc2ce0735a2cd9fb6c8496c34406c538c01bd494193240bff947fed47b7cce99a1747973f1faa5223ac564bba0ca8973d1310b5bfa1452cace9110bc22a8d4080a8baaa8adfa3cfb6685679b648484e3a43f9b1b2531949bbb8fae1846f6d45d9272fc2caa2913b5d9f8d322e9b18a685122d74634c60730c101578bef2480711feffe02123e76d6c846559e2ea99a98923ef095630102a5573ef027e0ab6e52555a9ede0d15a73c8b2fef87ca6fd9f903f0", + "signing_randomness": "4e180cb95a825f6dbb010d597cfb10eaa4c03e51001d9de7bb75e87e4d7f36e2", + "sha3_256_hash_of_signature": "e93f9d54c156f766e116ce02304d540f929dd7e3879fc46a66b44abd81cbc963" + }, + { + "key_generation_seed": "35b153a7706109d4a13d7c4b26aa5b56d9e3fac53b47e91b0c10bd4e0eaafc19", + "sha3_256_hash_of_verification_key": "e5b6e0aea435d3e79a1020de078aaa906d7af00740971c587df711349ad293f3", + "sha3_256_hash_of_signing_key": "9ec460261b2df68b95310c40193974ef1d7a4c8fd8ecedfba5412ece63ad1af2", + "message": "49755a7b1a7cdc5c9bdf5149968061d3c95ee67bfbaf02750c45094303a9d9cd23a08f19b9c768adc63ffd1527186d09ca4e0356bb882e263bf015cbe3716c05b31a69dddb790ba82c341ac9b6be68a81b8bef8d882304baf0020d761a0db04412033dc369961a5213b04e81736a580f1162780599cc029e262d67f31b2773afb457a1adaaa292163144f17de384234f3303111fcd89bcb30333c6c6486f775ed099043c34e6c86450b650f1a02d03781b1d20691b767d166dadf1dcc4d8604d976efdc9168373a7316dda9b9fb02a4a321218d9f54e287b7167a08bc0153843bd6355aea1310824dd5d5ec458be694af176119d9e588a29c650ff5500293659ea478b39a62149f819cdb7e7cb32e1d7b1284f159e2ab1b1ea41af4d0ac94ff3111fc1ccd818f9b2cc7a259701405fdf6a51d2d3ef62789297bd16a659f14968ef902c4a23da409bf13a4913467b5c991854b2ca6cc006d3f4197a6aa58bd5dd95c36928da9583332c3fb134fa3890fe7e299f1c17205366c4f4230724c43e4803912e72b816658bbb1b63780865a1f66a2a49b96e93711b1be97b827d12173402828b1a065b94310d5bd6098d", + "signing_randomness": "de9dbae947be3b65b9a827c65b99260c6a17d9cd8c2bef48ce0573f555de0f33", + "sha3_256_hash_of_signature": "8c31497e152c9abc4be1963bb2997e218c95cbec9e45f0e85ffe72775ec29733" + }, + { + "key_generation_seed": "0e1a1634fb2396e187cd8980ef29663c42dc3ef963ccd491f817a84283a11fa0", + "sha3_256_hash_of_verification_key": "41368830bd7a21526204f0fb6151ea80521867946c2b494790f0fd843509a24f", + "sha3_256_hash_of_signing_key": "be13549fbebb9e6938847609d5920b7a8cf1d24678a12a926d4b8a05c8e39997", + "message": "439529df1864297e33956afee00a60099b658a67830a6a6abddc329e87831d9f9b647917fedf1ae182a40402143285516fcab83f447354c72fae81ac26e7005c2aa561763c152e66bd80f14565f47defa440dbb491e7994ab9fe35995d5fbb3800ca030b43df611141637a5246ab9d9cac02efe14af60736b6bdb2babb97cf21e831e5d04d41c00f090b154977900efadd3a9313389a3f84cb3ac38e8b57b70a43dd08a8243f8154013fd5cf29de5a8df0b197c12b17e0610fcfe3625cc94067e01e23d23a243ad1c1f805cc50e1447d1df93c25b8d76396bb7199e64129522462c5fc8b30c132d4ee9e0bf6f52961fce7ecf650647e7064aa5a6574649a323e144d7c5491de4c0a1a76d08f93f87a2fc7f6955fef86991e62e2cb42908e83b0c0a8bc180b7453ced293f1e20f300431ec1d395e8a537f0bc36a673d491f14381dea90d8f176d06031b0a7afb40ea8f76d37fa82e2572b9799a5fc7cf4c49bc20ad78efa8cd989a84d72ed680ac3c0f64155c56acbfd7c7d628b418a489f961357f77bd62204adb079dd3106485a37fee535c9cf82e832d8aadcbf686976b806b02ae733db46db0bf162e973931c3e338cc86db38c66262d1b2ebc7691b8281e0b20bf36305fba996d20ecfdc695", + "signing_randomness": "95a169a6821bc4b7a221c54caf7c9411ae44cbe89ade05cf95fa6d20ccf2d086", + "sha3_256_hash_of_signature": "f918475ba45bdfee3a35567719734c13976b6fee6223a5e37be23f55bcf40405" + }, + { + "key_generation_seed": "b0bfa060f1c1a70f1ac55e321e6186a6613605dd732574b5fe6e14f0ff6f7a82", + "sha3_256_hash_of_verification_key": "ff8dbd7deb3fe2442fc3e32e140bf8873131f217a38202160e784f86381daa28", + "sha3_256_hash_of_signing_key": "edff87bcbfd6c0ed6f816eabda1816ec18330c3125c99f0a1c50539a61dd8cbc", + "message": "8cb18850e27d8416b88a9a71f4a66bdf447814db6c82098c371b53f61600ef5dfd88e4fb34200207c3f6f55166af4878d38fca7e2dc18fe662e3ea491b58a86246cae16090fb7ada53b9a67b3d0e3787d3323ea921274c60cffb19a889bcf0300fe10e242aae025f374dd83fbe9d007c8b9d9d75574c74146331ddec6f0e49c10dbaf15654897e33e2b4780dba484224aa6fac79015d5792faa2d532bb7d239b11d91420b98690b1fbde9632223927e0804bfb284368a426c414c3db8ea82f0d246413861475ed2dca9e80fb4f3c34fef7528069ae1975afc52ac5ad2cdbca1459e140f655556093210d7905a1a1e6ceeaef0194a0b2eab2c1ee853484e715d2a1db551fdc620d5331164c74ca4848b61d408d2f2a943fa09efeb63d524691c99dcc0b22cc61b98e6fb8039e5e0b2d7de2caaa900a44184bd56c9f02141a3ae8afc661e3e898ecd3004fdb0704272ba780cd5de35153b6fe223843024273642dcf8e4b58be2ab1f61668680084aa0b75a32e766c8ae5eb30d4e02a12e6798dea40f80d8ddfad2041a52922701c689f46f49f84cfc05eca6d7d4c356d50b6a0ba61966245d45134d6a1f5197540a1c39c36bb0b78831af3f5156e669fd9213b64e0cf1c5a31e88ae79ad61757ec67b551b9f0a760f646bf81f6b92403a62840cc29fa4f3949b3a9f0a9a4286ee7808a", + "signing_randomness": "9cddf8ceb8c94c72c136072d09d7adc8ed40affe4eb1a5fb3fd7877571975ef1", + "sha3_256_hash_of_signature": "f1efd761729df8d010af617dff49bd8163c04ac7e101bc1f67ff348cdbad0e3e" + }, + { + "key_generation_seed": "a33bc0a7a08c13c0d4c1174ddd886aac4c5666e1f4831f006c9519d36b2ce882", + "sha3_256_hash_of_verification_key": "c6d89daa46ad4689f682e1e96c43458dc0c462a379fad2299f5765e986fe80ee", + "sha3_256_hash_of_signing_key": "0f706c7f7a833dd73e35d06c2d37f6ca03e15da277618707b25662872b31bfbb", + "message": "9b64813c058f07a09a796fd764604eaf58ce144363702896df0ab5ff26d5de000d14bb8fd358ff5532d3b909ab62c18ac30f1900f84ebd3f4f18bd532d16c7b3470f0f8bdf72938c916db18bcf1429dc1635b1c152c5f89a9edb17116c11815a6c06273a889132923da908ff39f4940a840d3cb575dc4d637aafd37968ec61fc4ea04b4c320491a73ecfbdd8e10f1dfe902fccef93dd287ed872f67146bb8ca5a6adcf0350e8bba7f2f9762c4aa748fce19748eb17334146c152fd63fae3dfbb1a2c2b3c78960369551fdac5d54643beeaa59c1feb0c21dbbb19977d848cd82a7ae0005f45956e0fe4700f14fbaa0c12fb8c65a6aec95c5a5c8e79a6da9c4e446872575c06ae49a31b82245e1757c7ce84d6d5df3f642d3434b7e1a15a8b8a9db460826b6cdca69022dbf87595b582ddbb90a81e09a13c2ab1c125e4435ff30abc9c56a00edfa979f79d9c895e800d2dd6372fae5faacd83adf8a6d55279d52df547e9bab39d99076ad7d297371344d35bd584e0fb5932f92fd5183b9250cd180fc645bef6028c405b0ef35daf783428173f1f2482aa1363640f66af0fe8ecacc0dab84abd2a1fb53af44445698cf1ddf4c2ea214dd339be004e75bf76e95ca5c16981aba5540689c1c1f1daf4d0f89d62ccb3496340d61e7d5f5156fd3edd02edfec8fcdd0b231697b0e66f4a3aaf46117532f5ee2cb4d2b3b82b0beae0a45a482ce9a976cc99aa82beb0fe08cb68c4", + "signing_randomness": "86978657e78a20a881689d75650d01083209a9c6a41092aad3eee15e4846260e", + "sha3_256_hash_of_signature": "e1d918049bcd97342ba0067308fd413e9538e73c8a7293d93a173d469921ef72" + }, + { + "key_generation_seed": "c7e33fa5329142b668ccdde1057eb7a8619397537f2b4c6d6755b3b9ff936441", + "sha3_256_hash_of_verification_key": "af5790dfdef40ada2b1e6dad68845b07b90d3ef1e102c97bede1c350a6fd0bba", + "sha3_256_hash_of_signing_key": "3be725aea3273c7792080a19ed1c1551bbca6d23db32c77bc2b76306e6ea1943", + "message": "922320f7439e492f13c272a5738ff7122dd7a6b2832632e1f7a653fef3b8639bcb9e84f482f22a948ea17dde6958489593d2cb268bb52df8ed612f2317bd6847d1622cf0532cb499adc432233b93b6f7b1866b38975ac87859ac49f91e8d235846775f9e6e6d052339c741ef6178016edb3d0b1e3f3536667b3ea2d489f88d254b8582421a31461374f465d7ad62e896be0857134707a70477fabc09fe0a5cc3b3f32911f5ff3806b878205525af69007f50535df05c33af3b0d00e297ac7eaa012e1d863dd5dd5fa47fb09467dbad8bc42edbab42a9625bfdb9fe578343297506a3b71cdc8d5919955af4605fcb0c7164d96a187aff65d0f6210fef2d11ba08d90c4458542be72e084577be9e451b8b6f4909884bcc5d25316adccd0925664d4d91c2e56433c1b68c632b0ca56d856df1edd5e113d1f026b30dac4fd648a504f8f6809c701c97bcac2b99286cef5c1c923200b1bf6141ee1cfc51c5e14554bc02d7e058970254d2c02948360abc4dfb439e66946a8ad615147bd8a6cb0886211e8b15dff3c72b6f8908ce56bbc1b40e838103202e9f188d98e07555db61778f895f76fbd838b6d14209d28eb393668924ac0e61072cbd9f93b864904ff4302dcea131b2ca16bb04959acee096b1963ce07f59ab505fcc8d89fe08fc58751965f2f5ca753d76d58705652d3b1505e0f720ede3142de9776ffe4aa0c8a25e76c7a04843377c59f1002844e89189e22f621467b813a98bf07540a1649264f14a6844d65692617f7a4d93fa9a23829e256626", + "signing_randomness": "d969c4147e8353c80d83ce2b665934ea1f9ff040946cd3f16533143b129b5804", + "sha3_256_hash_of_signature": "c823a18b9b08fa1f54ce2f3a30a0f3590dd955a25f71743e0ae009af7412e73a" + }, + { + "key_generation_seed": "7611b5b7d4195d5f8b97244b6811748efea929ea272e66435a36d0bd16e3bf21", + "sha3_256_hash_of_verification_key": "94ffb0acdf8ff4992e39be475a04a1745d4863e6f405a40da8c4aaedb836dba7", + "sha3_256_hash_of_signing_key": "35fa8d453d41884df503d69c46d1fcbdba116c9ac55e69cb8cf85d5834a6e8e9", + "message": "576289d10ab03d5699eac322d349f55c547101e4424bfa43bbba3747b79f075ae1153a7a0ac8bb51d24fc46b7604e42efe4343fa34aa4eb16d918f25e8a4d67c860cca3f7480e1221ed3ae13a138f079fc252c6d7bebc55cb81b86e74f339614bebcf7e8f4440df8678b01a4a41b3afb1d112fe1c4c8d8c6bfe9d3ee2a335d477c60fbf43b2e5fffe1546f5172ef51cffb2a772e1575eac79b24d49fd77f0be351233e57ee6dcc7e2e29994873abd434d34ace83400c026e27e27888ea0bdd1bde5a3e55aa8b5f2feb57b8b0a96cd831906297c8169d04f15843a3249c50523cf56a4e19492ea16927dba8759b88a99e0d20820e51fc9b6a6863115cf05c5bc3f4c869eb5a87124df5db102d737f3899cfaa5fea4dd62dc4fedb1aaff67906adaf8968020efa5b10190f70e5f2c0f0457e4341bd449201d3a80aeb791254ec1c46ddcebc3896c6df702509ba62cd446d275806438eb4c03132b2e6bd01bd2f832d1d3c053c48c5a9db1c4a22b130c4c9e96a2bf4c2a8f7de0217a52d9aa5aeee5e6a49708237eab60b4019a51390c3ef10572a73d436875bb8d7d78543f96376e4bf3bcaabb92f89215e8d1093f3b287945708b5514bd7e62654d3bdf34b29009c64829a0cbf33c54d7ab0e81b81bdda93028b341ab1dff3d752dc4a1e5f9636a5c46e137ea35919d99e6571c5370c6e804bd2e2abf566f035d65cf8f97e3e8f2ecafa153bc6d8ec2831667a37fc96d1c2da40ba84d0fb041def32aadaef3f98cafa957f6552f79d28a36b8ba20a9452671de1be8af5d66714232507edb9ff657f3d7e5fa7320fc0359a5f99280d446283bc", + "signing_randomness": "a54ac9b7a0a8c85861a188726990e518d287f7c53c8b96ddf7d01c4fc4a6b9c9", + "sha3_256_hash_of_signature": "b72596a0d7ce6b01cec65167704ccfc6628047f2bea350dc20de644d18cc165e" + }, + { + "key_generation_seed": "5a1e3e05c72cef1a73ef98840da035e4fd2552912db8dae28a79011de4bbc1a4", + "sha3_256_hash_of_verification_key": "72a57e21f15f93554710aa4b9ece99f4cbbab0bdc680d58bab44b8ca384c3846", + "sha3_256_hash_of_signing_key": "aa6e90d41282de571f2f41bb422563379f8d959664c81a722d8f415340158af9", + "message": "021e9c06a2e4ef63d1a61958620c40016783879080d44311e04f2a446bcaee5a486d17ff0f356ba70ff1c2b55bf957a59202903ae349878cb822e04275e0afaabc0803bb6cde3741e0bf9fce0c5d5c814977474533dc63f9ed4f32ac3477a3ec9893ef55186728c85b03f4c2e61ca7733e1706766aeb8fea80e233e8761b57fd5a3cef700196674b34a3a55f68b3368b688fb1ddc976ff48ba6a98e2d66023f291a3c617a56ccbdb8732b8c34369ed11f4ccea8fc8f673ad9fa0fd8990bef70af44c617fdfa096695d0c94ea8e17554f4461dc776db2f416448b17680fe4d29b09e57603d8ebf55771af84d8d4b9097302901c25cb6d73932e67c323d12c8acb0e74cb89755f7eb3999d4eab5e1b775e6b5c29d9733697030a26f3b93b3f286db0f2dbda71e1f103878063e77919d8892eb6a34f821b603ed4a898a9f30d00feef20985fef1a7b7af70dd29c269e88687f005d551ef05eb0603fd38745aed4f5bf4c2fc09f0604c98ae3a89e46bbfe907b87a1672de547d651f035f392a8d4db5e7260f43953028e312b95b9f25fff2c0c579218390411d13d9a25f22de4c7aa05fd11781db08977160d48e02372c7d826f5cac37d1a9b4230be99a2d13cc2e9b2b17f0a1044eb9e0a2fba376d35cdd2bc05f57dce4bbc3bf07a09bcde369929e6250efdc61689466b040aea376b09453a2c16813bbb685b54a225c49008ba6811e8bb5b3627f8c281244fdf5533216d126ed0e64fdabec533424bff77fe722cc438ca7587c19d965f0bf085d8692c27c5c84a9dee53256d978948d89abdf9842e0b765be6a507d8630cbc5ca7fa0fbca1cecc78d2e536aa7b2b902c4379777ac0920d69c57cc4e6032252bde99e1a555e80d4", + "signing_randomness": "4ba7fa7a5623bb71d33a6bfdd38828ce60d91e75de165367e31007a10e0b8352", + "sha3_256_hash_of_signature": "9da53a31c89066723f2bb974c25869a53840c2ac63366a8b2bcf9dbdd9c44af2" + }, + { + "key_generation_seed": "8f3920a235eec3659cfcfe62931474204eae264959702f901d461b66d9bb563d", + "sha3_256_hash_of_verification_key": "971476ea189bde159fe70c5876af7a9779ca13dbe15fa9a508afbfae2b644a70", + "sha3_256_hash_of_signing_key": "27bac82c81b64d2c8c3c32be9384b59203509b26f99db4063c690c87494c2082", + "message": "7bedafebabbbfb863ce496475f54e69a905afa45899c3d7c16cfc73e31597d2404ae7014612e4cbfa238efaf5b396b0b7435ada5de817e013188c280423c68924e1fa2a33ca56e6b85b7cca7f00d3a6151f0629c1b92a13573320e0025863bba7f3eeb987ee1b1a6230b10765dfc1feea498ae4b83521188e7503b506259103cefb370e3651b06dd4f08013ff3ab9e2430626b0bd584232948462d85c0f82da07b96fc65f62a43cd2f132d1a1d691c085980dad8796cce2fa0b268395eac3da2cc400f30f75be87316216980ce213b48651ddb9e294f8cdb2ca05d3f2a507e4a03e2849aa8062918afb5bce9e4c3abf2ffd4751dddcf08ab09e36a29b830f3bac6feebea084575472e6f4b239af89965a72954769a83e391de467934237b07d8884a6b14cad034fbf9bd7531d50d742e234e227e1a2daf77a2ffacc579525134b15186d81ae6e5538871024bd2897475d6ee5b11bc51edbb928d98475073785a75b331bf3d2297165ae6cf95c3a05f06df747498462054f58a5ac736f96014b1a8cdb319d030d06dad9cab2b913f35fc392e1fc4b027cdbe775d64b04f1076a7c8f44c360745f98e87b84c18ab76f84f373f635af4c8a87df08dd4507899bad892ff8cc1ee534d3277b5b82095628b84a7d5582149cf46c50aa963b56b4b91966b106b4b2eaa45d83a10993e8f933370ab29c6606b7ccfc41b21c6b99f2b9ac643e24300b350fa199ec10e64e4af19181f78e8c43b2fa796241dc42cc8992bdfcdc39e7bc41be68cdce4fbc47c996db42e8249eedc146c216b514430c705fc939b9eef677ad87f9cee3398551fa0daf774302324a410f4a4f4fc035cfbe960b38c390441e92d9e5624a8745976bc88fa538e398712361b77ad4ca5ff038d9f6ce157eb8a6137420d4e57018275dceebc4e480a5d", + "signing_randomness": "943c364002f410be37f11bcfb79ec1700133d441c7c1e37359bc9559d256d56e", + "sha3_256_hash_of_signature": "c80d73fc568ecc382b7676e79f021a5e13a11909c8d0acba2d29da33035ea585" + }, + { + "key_generation_seed": "0b2b3eb50681403a0b9a99b25041a489c6d45d2a49de0ec83e1fd10922abe2d5", + "sha3_256_hash_of_verification_key": "88eafa02e04fb27f6e031b15f32c7e82e761524b24f5004b54a8e89f88a48bf5", + "sha3_256_hash_of_signing_key": "26f77952c6ea93333e2e7c3fd27884fc8bc1a03980ae9383aba58e681c7cdd18", + "message": "a86ee95388df139f9c5a84108d1e63f7a7842909b818e9a0425c257649abf125386fb5286031e7e6d0eeb85c452e254da39bbda51f0d2167ec0a51992753ddfa76874aa80804e705cf8bbadf3b82b6d7fba3d1cad130abcc0b44d6d893356f3e94bf8e82ac532ef8c5e5f4200207bcf6b754f14e57a889ffb753f516ef8de2a647fad8e449264f0bbb4cf48bd01501736da49509c3426a3d4108b98e6a4aa6c4430e8ee76540051fbd1dfbfc01750e26547f8718ef7d897a0342bb000fb99aa63b781c9a4b831da798c014e58725e03d2f8b1a029c3337f4099239244aa320965b2cb5075052d901b6077a18c1ecfa5f272850a475b5f6bbc83f3c09a27072f80743b23ec6a9870913ee2805b4d296b2f81a9d733e5c8d5c0b477e51f9328af3af8abed960408afecd27fbdd08fef50f4b07959646e0a02104a69674294a79de0b25b65f4dbfa797e5fa56d66e8bc07d5e2e7c7d2e845699acea3bfac60b2c0b988cbab949a5b598d8e2f1aec66196e115ad7f237a1c7fcfb95a1bbd6939a250e7bb0f4a02c23cb1bd81090cb770e3a70cb081d121bd0bd5ed1dc06d61282b98bf2dd7b13d2c6cf833891c67951d7d0f429ebde3f1da943adb8ad285e6f13f798d6cd9a0a06bcd6125ebaa48f8f3bd5100a122f617817e3c42ebc3c3b154258fa26b9fd886ebfad42dedc6a2c4f9986bad88a2a79d7ee603554e9cfc5fe33a3a171cf7ba94fd43228019b2f6ff96a8abbc58d2098ad95a95442f6858eb69e131d7bcadad81b9bb69d7682a978279b631e22927decffbefbe8fb2e51d46a3fca66225d30451cef9953ef94f30b99f2b26ea75b84935ea4fb257dbe5734454b8087b3a4e115c6d31e72709303e9f0bb8c86fc6b11b93b53f9781bb92851a5cb5dc00d0b4e15683dbe4edbe986966fe1f711f24de9a0e1beaea8e835c70cddc589773d31191b74af780eb69867829abed6d3ffa94d577", + "signing_randomness": "8b7b9628988a0842ed6f7fbb4289a23a746df20188f74fd55ced9eae99889c61", + "sha3_256_hash_of_signature": "2ae8d6810b406b4bcb125a0510f0d5f6383a864e353f71c3e3e6a9c1f487e97a" + }, + { + "key_generation_seed": "8217d32cd15658d39cdca92c41b59f5780869a68838a3579dea48b5e3ea768aa", + "sha3_256_hash_of_verification_key": "c7c26c3ec50c34396df916306f25e177b50dc37f5c0387558dfaa8d614f65e34", + "sha3_256_hash_of_signing_key": "bdf1f051441cb0a5bcab303eed4c93840dfc3a76c1298a3cddce26bbcc40ae58", + "message": "f5abe373ce1f6fb14f2014f5bc0071b17ab2c84e8845fcbf4b15c79fbf2e5e06cffe6cad9a283014a975f81c9216b261cbc79edcd58d0e20c586d7c641e0ee97221befe54dbcc56a594df103ec24b52ddbb6052d1644972640f39deb98997fee7a252a65070798b7e46707fa440375b1ba705b3ecc7eac56d9c45297e585299c7d747b430f0d01e82081c70b4a87846f90267d5163181ded63e089a00afd33b0e2b3ace91182d8cc899223ce65a5d84b86bb3e8b34b13949bc800f2145468ba5411eacd6a6c331c340d4442d28efa0da959a2797c7181bd4bbe6e6dffd134cef373ecb0ec08590f06be0ce292d3718e2c0efc7cb40f1db26f5f38fdc82a72f81afbbc16591ee02dc818d63cae69ff0a28f942f7e07f6b0a741f3f0ebe3d0ea5859024aa408462d3d268c23f95d717c0a685a4ca73ad90ee923db57cd6cdd828b7ab0d4afa6a9ad7e32d407a44d7515c0a6af52a66ad72119ba1daec6514de3f8b462ec473072226aad61135b0f5ec646ba9a127c9894e51fdd1b2d38011a2a6d7497a55283133695d0af9b3ff7c5a8fd667231f9e511e3b8c4c3adc44d02de08c47b2382de67b32826754c6be5231ce0fc657341e20247cc6ce574f3d1a9376ac8237b49e5030e877a4e33cde25d838ead659eb1678706c759707fc66ce84cc968a8334c18f1632348824a6985a0331a93b59497b70c1a03a6848f18f5992972bc79f07f4222d2612797f495463836ae6cd3858d5b9bdf744a1cf361b5d454d41ac899a4fa61081b937cbabbf0ffec1b31c162224ea36ca2cd7fce54ec1a504932acc5bd0b17a156da7488f7017e4916a687fde7fcebb2901813b07964084ab0447a94dac3a0d3fda05b9f497cc1555a8c74838e29cb8ce89d304debe419d26ba7f3dc6e9526bd895495a5ff1d7ec83f70d045e306e7c2487a52cd7553f062d31888ef7fd27f667fcffa984afe0b9a4c4e85ca943812cdc157c5486b0b5ea6da05e4bb8697113190321a976d1806da129101e60a28b7", + "signing_randomness": "022e7bdfb6918b065c56e2abafdeabe6de1c76919b7f004ec141cf7a2813ffea", + "sha3_256_hash_of_signature": "70cd691ed6c8fed9753da53f2530d2bdbadd7b24b90a0dc0ecf0509740dbe9e6" + }, + { + "key_generation_seed": "cc625322c9d52898e7f60ae47bc2847e20f3722794de41e30fdb20ca1a093208", + "sha3_256_hash_of_verification_key": "a5f69a437a2ff244c44cd991c5cfa7ca950a5c4336b9a5947d6b0b6976583a74", + "sha3_256_hash_of_signing_key": "6d146994f8fe5032f6be944ddc6b208ed441862978afd013b77b778d3065080e", + "message": "4c4697a7d8195bc7d4b8f2fcf3a7e9419e8fc9ac6bafc5d658260511c697286bfe44e2ce98c21c98be42e5af0fceef8aa54c5770af287a81c7481fe3391a6111ae6243d545b2a651599b45931d7640579f8659a8bd6f77260f235f71476ed64714fddb70c549cbe089322130f7b0a21f530508970d55cba55baeacbedf684c7979078102ecffc2c3f182f710280cabc2decd3d3b5d3ce908cb2307b00fcc0c5412a12aecd041b5f70cc0149390312b9c81592bb0e2ece83d4495944e29aa798de67fd69e2bd0695dc573f78d8bb48e6b8679e1c50d1e6e58e218b77ee51597eb43ecf7301d86f457353d60e98cedc95b4a76844e889bf7e9d03503757569e40d55ab43d63293eddbb579fe981ffd4dab056f85006ffb5e759b9c16f5f6b235d7dd78458a73ef37118edf599aa504e9db9ab5dbc90b8e478f3dc1f35a7c4604a383bbbb410cfb2c5f746f83ef94bdb2f244d421818c26827d5b7d665b8a802181eb7a9ce95b6633e24d914feca7e969f64038acc3009b15168426edb67af2ccf4e859f5c616891d355f7910acfa599c396bbb2d2782cbf1432e6259faa77730b6b86fe0d67730152cd2ae0f9b0314048ccd25772c01fc9773ebf06618a8ce1e940f48663427775990cdc41c4dd3e9ac6eda1ea50e04f1d329e64c8532a7ae32238c131753d60a25810a5ffbeaa9007a6984ef69eed92b777e079ce0ff48c2aee9c18d1db9f49b5419ec6c0e2212ddd2e2fdeaf0fe9f2b84d9c50dde86a70fc28bbf8918a973cc67a36e97ce3027d73891e7aeb24baf4b12a9dc8aab5d6afa380bfac3703d2d32f1e40fbb532fd6d7d710dc0741dfc7eabfe55ba5c311a00e3be55c2ee74155e3a06685071a962d7532ac76d59fc187eff01f8d339f74323732168fa5d14f4b2a72c9164a04a6ef14bf5deb1833e4baa19a55ae590f542d4448e0eaff0e0afd2fb30fd671631b9325f4a0bac9a43dcd2840185a2f601117a625b0dad5503578537be2a535d2f556f371536bcf68c0e01c96301f08e1567dbf9d8504096a8fd89c086db695da191099fd1e8ea94035276d1d", + "signing_randomness": "230612372c450898499f3e23372b3454a7785f330a70700ee4546fcd99619d78", + "sha3_256_hash_of_signature": "ea12d2cdf0099513a000f67a228c09f1614d92170b2090d19f778b799fe36726" + }, + { + "key_generation_seed": "950226d6ab0b774c5f439afcfd0113b5dbf5905960c445f5e6e03e5d5c687a9a", + "sha3_256_hash_of_verification_key": "c1ff649ed22ece99714a9df5cdafab630ac2ace9d89debaf48a3697365fa5c86", + "sha3_256_hash_of_signing_key": "354b8fc29773fc7386c91ee9d0b8c7dfe7fc24d0837c2ca8804d9df8406a8a3f", + "message": "72713ea55f1e5ccd5787f172657c6f6c74081de2d70816e8531497965df02dac04d91c4d09dcf8904cb152e2138f829386f4351015da253a5b5eb92d96e537dae3ce809443ea90332d9c754eb11f4de586a83b5dee7b1b9bd547ee7107530249b14279baa04683d74b69d7bfc8bbcd447fe7706593c01188fe6ad8d0e2572d49f83e93986b380d4169bdd94e3311941dd2b041dfabc5aea1297c65bb5c8352c99ff838d46b93b3e5f79e3cc5be5408fe5e59a10d488dd65a997b086fdd96cefb0247b2baf7b490317e34330a879d04e374c92ada33ee243d84da015fddec243b00bd7488aefe373e8ab1890273a7a2285988e9daf9c4e7c5a17f54ad6195ede2c79657e1bcced0641e20f7ee26eaf53dd8c82827f2d2783d44fb030c95791f41653e628062267a5cf534df00116c1ed1de9f360b97555c65cdd80724104fb1bd4da5785b5d9c24438557e48aee58d57a03e06d553b05b67e1c8d10085c2f153647f174f7922fb8d2210454f7014bddbc627756eb7cdef99b6e3a2779f82088e3f2da14c2dcb5b185aeb5d6acbfad43e286aae8f84a58e8df6abc64e4a8efd69fea18dbfa6808f25fd418de8ba923500b74e34dda3ca6ad8dc208102dc4a876d8b8cd2926aea4b3ae11a546f6235abea152dbdf43e0bcdfcdc83299207f294a707c8b4d1f56aa64a205c718aca69b862afe7489f11b324e7af6be68380d2ca6e0af0e2e20f890f2cf98907a9d43135c03e85e86c9ee417140efee9054b46c110a84f1841ae3cfafe5b4a95d6b2b606d8d0a70baea85c9412bc2d54146e9f866800e8e8615a0d64d1d595677e8c88699e3ca6097d47e9fe64050fb55033fad4d5f226da8eb5ddf99369acc7552927ed3ac7368b9efea2443926df26d1c172858fd8a5d4e1d7d39e7f7df047385d39131184087cdc45b299bd1f7048e918223da3f960608e853ee49ea667465dbbd889cbda20ffbb540c9ebba5c2cd16a22a57b561e01331d6ea6bdadbd6a5d2bd1441ef4e1d9dd11cc62a0fa5bbffcbed0d27b6acaf0889eaa5863dd9bb35920707b71a0805630d1769fea320516e71cb2b125ac274f16f7a6876f4b922c7c006f38ae1f7183ca768715d2af", + "signing_randomness": "3e4e79432e2a2762b04cb428062cfb41a4c410ae490701f19ebc0455924aeaf3", + "sha3_256_hash_of_signature": "3716ce23d886362f2f432bab6f59fcfa8880b15edab6e47f10b53cfd24f25ac5" + }, + { + "key_generation_seed": "a6b534767a6d839fd19075ae0ba10147c46862bf7bbcbe83f2b72f72f1368a1f", + "sha3_256_hash_of_verification_key": "e174509401f8e7850bfe8e1838772cd86f9022865b82fafca922e0e125430bd5", + "sha3_256_hash_of_signing_key": "7edeefddeb452fe7257b1ddca4915a1479e43ecde8f9296b1c8c88eb63625c81", + "message": "209658cd1d801079ffe8e950bafd70a028cfcc35b9fb00d232c5603a1d51ba13e5de59e0277962c4474e9f3f60fcd99c9b79665b3839d5c037b921a4de8e144fa1d38182fbdeecda6934e814d9186591f01c5e23349b34f4439b4d402c4072cb4d702966ab473d2c39443f41fbdd0c48e566d33e076422ee72fb47b2ffd661f367e9efddc988bca02382ef93590d4fe3ece8b1d9d8b3a653219c7d131b43e2fde2851541f467c31129e6f9b9d124221cd52610b9f138eac1d01f193148fa0415b29f5c86d15067eb1e26c9d51f05655e8545f734f8f244854ad76c6b04c230898bea33efdceef100d79f8e3b894ba583466749b82007067806e3a7b3ba954f6fc5abff0e099a24d14d865f6f4538736124acc5ead4169ddf2144ad558da3c74cdabec147d2afa113edfd1e2280766b18792310fb6b4fe5d0d9f65906b1cc43655bb3d6178ef9093ac9c8f1a91bf49008179394eee79e1d8e3228f567770c1ba1e30ba4bce2465ab68f53ce21c0d8ab2f6e535828f211d4db957dc3af8b7e00dabd8f1f74c959b2aff45121c5b5abd3136c6f55d5f5ffdbcebc3cd7a430ff3813d23bcdc1254fe6949da4e7694028b7fcb876099e91b92c65d85c39d4be9325afe81703e5b18cbd7bd9eb59a9bb9408abd966ade9a60303807ad1b2c14c04cdf8fae6950a55b21c9ebb5e94713bf8c2890215c5da94b59cb31edc671093b15ff5014db4cd3ea8060260dc1612e9fd6e5ab40f0656121f689c8e94212269a7b24305c83bf0583418755ce690913cb081f2893fb42bc4750f2c053c48c1552430793cdde1a49ac9e21913210d727c4beb5640ab9b7505ea4e59af417a085394181784bf1bb0bc32bd71cc57ce77541581f14b8ba4b758500694796262b561a38c72893c77b548d779a3833eeb064cddba5471cbffbc769e139946155bf376a56415ab743de568cd21895ed6951b5bfe1b1629dd6510dcd4483f206954964e0517546dd96900a2540a51835818d1730b0c9123e7fd8b28e6843bffb659945a273cea944ff6e83c234b3e43db4630614e0b67778ea760ee341fe68c525e90475a1560821ae6b2a85015292c36eaa2e041ac04fb55922c48204525187c7e0476a9fed04efbba96f369d8ae709506620127fd399613a9796c4ff96d7e", + "signing_randomness": "6e3210335aef4b760e5a4cc0eb4763a8d8e6a6172d4221fe966222d64152cf4a", + "sha3_256_hash_of_signature": "42046ad144f10b95fe452e49db56738e428393156846eef704be7383760f9eca" + }, + { + "key_generation_seed": "103164ed522df0db131c15e139c0f83d9b1b7a1b6ecf7f89a5248cad7e68de8c", + "sha3_256_hash_of_verification_key": "63faac086c60e2949bb3e2b6ab4fdcafdd62b5e982209ef79797077987721702", + "sha3_256_hash_of_signing_key": "e20a4d5c1bc803c496e2678cb97f446aa33dd57d76e9e6b3a329ab5ce4a12d19", + "message": "8f37a065dd696ad437ec82909261b842ec0a3e66f8ac574105a3c82ec8b4926f2466fa550f8ea1b6a9a142c00afa44be6512a85350930dffc99b95aa21012057051b68c48581ae439b9290a163aa4b6afcf80ffb91a3321c7b9abad56d5dc1be4e67e5576c9f3a7db96071859b94eb22a73dd96c66ae67ab11d1ab62a86d826c682dfb8cca3259dcb5b34be635421cd4206e7d92147f14c36424eaa407b441f58e5c187e58a26b2ae144888a3cc1387ac7d0a681eeddc3b7781ab282e8185ccf33fb27500cfd119e0415db1e45237520a868c8457c88a1d3ee97ec9451da35d7e74924f8902949e7eb14ba87c8ac672d7e4f3bec1b2814dfa67a8dd2e2d4ff4661d64bc4c6d6a78d4e489689b6063cdff5a3f1554501b424284a9f4b8fe777fe4e6afb83a85e36200a9ab40b9c18678454b2a3f50a4862ba1e36f0c57ad004ff90192b5619614e37dbb38a1b8a65ac613f7796c70772128377065b84f122540106d1b4f9123c4e009b4c0a85d59b35f72debddd154abec7f3fb25fd1fa04367386098de610b26fa3ecb031a6072d14607e92ffbe195abff71e586a984131af24e18ae94dbab0544fd2ad217960f337111bfbd4046809ea03c7c47b7177757a4a43e1fd0134859ba735a8fc17597e593bb58322136602954d3a21096b0d1dee5cf0ad17a5fcf561ffa21caa70d33998840e4cfa18ba481704a8b82d2cc1c110fc9a6704751365ae9f338afe4cf9c811697dddfa8635a2f3cd02dd1845251014bf2f2d6c02a907bd783207c4773a937048a07c500d7c424b5f65a2c376523740df9a0b60437cb8ae17d64dd51dd4e433af83b20c4b6b890b97976df09e3a86ac19006c229d59fc7a2923245b7b1f0acf7c42e486d41ca1ac1d7051aeef6003ce94182f97d099c74317f61eb47ae18c2bed6a3cb253c21ec835e435123e0a657ed926f880ce8e5de3155272328a467278f52ac50a1121ae818a3ea3a2e1f7401ce23aaf66a4ac289748a7e98a5124c586d8957bb4edd3f091492bb1a64d75efcd45ad51ca420f15da848b20dc6bb765e7b71359b3a9e95e121266ae4a40dc2e9a3d81ea1b1a643594b3d4e6abb7d1202201de92bdf0cc1ed977e2d5851822a01f48a6f23180822888ce345ac9be0cc69bc448d41ca20b79c35b1dad73e6c683e70c4439b404cbf07fcc39b0e5a1d33f3717a6bad28a6da4f091bc7a", + "signing_randomness": "9af4e56c2162c6f7e78be0487f6e2d9a08e228641ce3b1b84ddb00d7e17ba098", + "sha3_256_hash_of_signature": "ed50a5fd6da8786a35ebd325116f84a20d802c0b30a9b54141abfa665c540088" + }, + { + "key_generation_seed": "bc962d978f38881085c1b813bc90eee44ad9e7651681c20ba46402f557c454de", + "sha3_256_hash_of_verification_key": "6370e84bab742ccf7d4a3c8db77a62f947c726cd1aec5a5d937823241016cf46", + "sha3_256_hash_of_signing_key": "a7e0c4b44962821e336cc59271cb45f3339d6192a67a3c9d303023af44a0bb32", + "message": "30d61c6fbd64113fced8c5205026ebac0d9f3522182617cb00b6e70c8da62ecc1bbc8e1fdaf17cc61dd01ce85a9072cc1d9d34fdadba5b93e0aab4c9c4c9e26d3f7f145fcb23673b6e0b373c0fd1a58f52486b72624ef91a539519ee5305772a006e49521744912bcf3cdbad424f00428aa96ccc21d000efb09da5ce652e361a6fb649a060835e3b9dc9cbec660c7531620115ec905dca6ee2a1ce36554c0fc1d6dd6863b8f3843508ed5c214b6923e7f5c0304e9b0d5e5e433bd029116a33a60cb980737ac950577d0594bfe0ad2225cb8d3fa42f192b0ec05a49391632a32fa931c0fbd83a7b6ea24301ad0906e7911f9d900d19ae1247ababb1c0e9b9bd165185d9d7413ea068fe8824cce5b3ad51fe8e2bb2c4022c61b002c1df4852e4910f38613787ca12371038b6364d920e07b4b417401253451ddc25624b5d038b2dfe29b8494ec960f87803caa256a95c9868af819747e4bf26faaba6ddbaed93a7815c795ad5eb7fb4592df678ac1375388cc7ed3a6230cbe80abbb113c80b70c789cf0c66b943e67ce814f12d3d83f3b90a4320feb7fb81dc93b05d7fe2d36584399214d3d7c71aef322a5d04b5470703b3660bf86b0b17ba9ff23e45f7befec3758786d2111c81ba4d81b83feea35a0668e5eb3694963bb4db3acce4fcba6f3f6fed9627580dd2d2dc103ef7e52bb9745bd42a7fbdb459b5c8aaeba67686eb899e3177faf0897c61b008ace3304c41b4c79e2ef9c865e9958d8716bddb69154fb33187d927b5296c1589fb1ae3d553f116ff6cae56910ce6717c446b9947ab2a981a8f5999c1c6e517eb3fe584f5d10059910e22f40fbddb709c9f686f51abf7d7206a8bab4a346b51523c362d749238d7ef6671a89cd86a8540604f134d760267e91eb92fc0fc275cab69c776ef81dbad35027e5307f1d34ebf5d6e4df424d709666a1e649c044c4930098b2e6e3782a93976b55073c504563c7e052b6816c07f0fd54a759d2bc189fac3ff54549fc4de192efb58a9e301863a77380967735910f63d35ef5fdbd8751de4bc6bf2e3095628dc7f67c1f5571d17aa342593b2c7f953c3f0f22da1862122031bbeaf0d00a029c043304e3e2609c4fed8a7404fa10e2ec846a70eb0e37c5be61e698cf2296ec1fbe6fed75f6fe3113c23b29afb5a6d7e3a9e46e2d89d8c06450cea11492c1a97f7d6be8ff6c014930043022b264fd32593952bc606f779598631e48eed86ec2a013d8eb866f311a400", + "signing_randomness": "1f00e4c1b7706d8f575d69cd0a0520a2be98d897bc8249e95d08efeb68bae7e8", + "sha3_256_hash_of_signature": "74a0266e71c9880685d712f6d90e2968fa0dd6055a48e449e0e8e4008752cf5d" + }, + { + "key_generation_seed": "c3de54854a4060ea09ed92a363f71c7863eba64195e9ac79e7ad7eb6a183cfac", + "sha3_256_hash_of_verification_key": "c941ffe05bb1060a8cc1cc24c471e49bc9c37e91010b78375b30c7836c7452a5", + "sha3_256_hash_of_signing_key": "10445d2fa5cff8d1f1403cfb9c54bb6619fe4b54fb2b08b40cc03598894cb593", + "message": "c83441b16b39bd7993766e7260d07751af2f19a41e70689b0eeed0c118d9ef109866aaef31b2d2962a25a3d1ca999214cdf0eb54598382eead64435b7122d275ea8879bd47b41eb64ea908867fd78ecfbe8e992a2636aa7477de5058179565d3a2ceb8ace5c0302018043c411d89975a64927b48cb622a13f1ed85cc1113897a68488161afa1e636ec786a0aa37b928ba88a50164a9ec372523aa9ec8885aa9c95b29f7ca1bbf0652bac195ba94e976d336b69a9f5346b4c7c81457f802dc9757c7a2435a617317340f764c1a2ae131a716318f00af0efa89d3b57d8f31e155598b3944d950d6a1d6485b509358efb3745b95edc30dcff02574f54dfb2d31b259d132d18897df868115679f06d41102cd4eed4ea290f711148b99b647b8555a4c0dca1d2d0871c59ab1382a2d6417e6236d71e2bfa1a75cda54f93e6c087d611878ac7670a04fd7d8cb0993f456e3bc1c3b5898076e22d2d9e0eebc7d7bb8d142bd2b5f6fa42b40bf676fb69c532d7520a4a105ef0c1337f53d6e9b4ba17f1e76af4cfdf08f794752d2bf71e8777e2a209f8891b1a53d7bf2a5786b00b9a0cd0fce79408f26befa2535be188a68201b1514074cd70660971f86e8d3e92790ae7ac591aa7a996149bcdf060c615209ffab82e6000f41b2a5606fdaf4cd08cab0c2f1103b2436b1fd7dec477c6233fbca3b07a0ca01bf3476bfe5334e32aaa2ed35d5747d673e7bb622e1aa7901c77f28a3ab2197c8b8253a1d28c969eee73d17ad71c7919e7f217ba2badbd1ebf986cfe981024fc347028c1109cd4204c7d53535a9b677e39a43193e054d0fd68104d88934dc7ba6cb3e942aec744b935cdcfeef4221784f96798e650ffb0febf2715d75339d0cb6c2e57c1e9d10f13e6786b7f041ab307b8cfa51a2f10b622995230fba54b70d94ae278ec224d9d0950ba97beba7eeb0e2fbc4093e548d9ec09ca1a08e5f0483024d7c1927ff8dc270900d42d31b81b13a29839bd746cbb3591bc33817741a31dea308f549a74f3a4e5478844183b8d7363ac1f4d4a5e907d9ed98afd08fb8baa84c324563495387a4f12c239fb63f0810447131311b2d2ca302c7da2da57c94c3b5e844f537886fb766ec0e977254dbca8fc84ad77430428f0692e55d8e2cab294b857ab51a2ce4a725433df28d9caba86c770743ad987bba58c0565bd18590931e283292889294b607a5f19d9e905aa3940836e2a74a2e94ff3062e85a5c6c978b5eb2b254bbcde128280e6cf02c11a0c2066f349e3c6c083965d5b8a9c000e15ff36c5bf3a6d42", + "signing_randomness": "b1120b7ab8fcb266fad775c13d6bd5e9ec64da2309bdb637f5decb141b377743", + "sha3_256_hash_of_signature": "ce41e5d597dfd12f47cecb41c3b80ed6c12eb0c0a4102d59fc5042fcc2729901" + }, + { + "key_generation_seed": "828b9804524bdd17d0eb387368b01b0e95b4960057ed63fc2289d858201e207e", + "sha3_256_hash_of_verification_key": "f7f17d0dd65f6e426839b47075356160ed5818814448bd52ec19683781d61f73", + "sha3_256_hash_of_signing_key": "88efbe0b661242d9e40438fe040287932c18f5070e1a559ec638b1c2758cd93a", + "message": "86d27c1fcdb8164f8909073f590d0a280e5ef193b0c42863ba518bc8a51e625658dbe2184c3353faeb674c991eed3f1b0fe3bbe50a21ec70e9f57b97c38d6e436d3dd577d7056b07a401ff0ebbbefaf8212b993a39281190e309ed0c50b269e4852dea85432a5941269fdf63766b21d25d8816de5e87ffa051009d232d6b258c5f43f45f2d48be09b2ccd8fc963fad81fb368502057afa7c865d62d932f652802a299295b29411439dcf832e8367a749b4d7adf7e8abde3ebfb844a9b1d32f77b2bf96b5d29fc15dae83ea80a990aef6590776ce1cb81587ada80b9a7b45aca3bbc54dbe67df090104fa196701280b97607a333a9b56a728710cc1cbb7569b79ff034572495181a92d2380a7ee5e9cd1b0f758c2bfbcc4e11464f1cc7d91f117319c30ccbf4c11e60b5dec724225b8d77b71aa58f5fbd498a3f49115687d58393be648805ba1737bb921a08d738243920c3834f8782a8256b7dd22ccd5f4ece86b8a0860bff21c5c8f0be987f2d510ed4df9cf94bf698680b7cfa22a575a3d1b5b431734b59a4b31913019c1f42dcb76a9ff32bfbc6e16d2fade26e3c17bae49cc415e4b370d1fb43ff652be62d18b0affdf286765f4f30fc8d6f2c4a58cd17b3bdfa013bb2daa075be5f522ef9bfc2e1506cc1c4d381b3342edc19c955a5fe48a712af5ace66a028d03fc859711c9d33231e48d41e58a2c2ad81da77529ad5e6b73e1ac96f0c8e53f153faea7903f917492a1d2b1203174a08551ff0f9f91e32bd0f31d606c80a505d5eb55265542db3653c2621e7eb3fd677f49534f261205f834eef1645af419ef6be5cfc16d54c7eeea12d2eb9458831f77fa558e4d5c7fe446ddaac3e1d502c941c95f572ad545ecc7cad21f0dd50845cbdedf589505fd34cd8c00d57243c3aa3615d84c39b0a72c28f40ac72da25ebc6987df5a7e390399463786e75d524ffb6c961bbc9301264bfe3c699101d18ada4a72d193971d54089e6fffa684cd3d77570ce0bb9179a156d3e2dcf266358499bfc158ac9a6913f622ca861c968ebba0a59a12674bfe39389a2125a02563b082259483e80c89a3763c0a9c3db485aebf22c844539edaa28a3fbc0053eec475679b741d9afc16b5fa109399fdd1fc3574df8a1292b8d7401aac1be452d38f97d531813369ee4c50f36736b95ae9c3e4f91ae85e2d664337daa40f75cced2f4a4d210bb4ee25a56dc217dd176db5aca43c002afd63ed8712d89e266674d9736fe4a9f202a81d177970411dccd289b25798272d2647ce6451906a4f7d46e87a46cf6cd048b6bdb62488a24f48d1ebd61ffa474321b929e0a7b6f9d0f6d777acc14815f343e1", + "signing_randomness": "34f2a1e37ff2d2d8bdaa7a828b98fa44211d5c16b783abc86dcd399011ef2864", + "sha3_256_hash_of_signature": "993158efe19fcb7b6b27ade3135453c99a04c2b36b52270e8c00bbaabd413f12" + }, + { + "key_generation_seed": "4a84ca5c3954faafa11ae87fcbe701ebb5afbcc5f8ecae7786d10821e01ada5a", + "sha3_256_hash_of_verification_key": "26f031c2b9cbd810175ca6079e242b53b9108c21e44fc571a998eaff4635079a", + "sha3_256_hash_of_signing_key": "d77b13ae05c363c4f74158bd86a70a184fb9c18d9a7cfd681cc8085553f7640f", + "message": "56ed7708f98432fbc623424c2a3634780470a01784becff01bea5ba192d02c33675084263c4315420a009579ef80dd15eccbb812652421872a9577ef7d07896a727a64141bae7173426dd5a3925159bfa927ff1039e70f729847b48365b4d3551476206aa049ba5ae8f605847aa03965f058fcfd478961ebeed06530abe900042321059c297dacfe76cc12d52311b2ff8ee1231c77049e232d9fdb751fb27eb7eb6a373b4b1c06bd0ff46b1b208072c873e6f938e689839079e48c6d18f678769f5f28a903467f2ff2a8b02cb19df675a8fc7560a7d38a918ab8be083ec4e0ea148517ab90f38394833304f245bffc47f9eca771fb80b9c71ccd05fc3b0d66eb06d24b914b63d9f16ad2f2bc454b591d01ecfc527277ae71e3dc683161a53f129743f3428fb82a89dbd5d42f3eed237cd2f8d76de2e56a2143ac6b2ba811f745cc72132028eecd4412b76fdd87a2e396adce72dc69b8fe053042e798b220974587af96ba419da6888b13ffe217c9d01434347f4162fd554b760883e8eb1aee46c4c26b990c6ba10d2d939f513bf0eecade8b5deb8de2bc8c8894aca51e65aa696e390c11689f1c2cfbb70bc5f72c1872d99babe8de8fe2dbb446a8129af0ab8d9613f0cbf3cfa6ea3cc409f4a97581d5012707756994b6c8d4fe7f64e0f0b85a85d0a5fe23224dfd7abeba8e3fb2e97ad87fa8dd477adf48f64faf486d0df11ae9c3bd3a04abc962c5b02cda02d48f0b52d84d4920c116c22455df291a96e6adff91e3cd35cb8b5b4e70e3da8b87cdc969643a32b1f97131c5e0bae7f6dfbfac32218eaa596d444574ee85ef7c9998dc1088e5813d50a4377d29506817e4234f68b32ad68e00adbf6462f8d4e215f15a19dfde452f0a65360f7c1f20e11c42eec55565ccb23ce248bd62e9dbe8a7d6639028a92b422ab444c5688b5d191a4ba8956f358d131e2ff6dfc607accc5d31af9678f1a226530078ff9a73d681deb697670ddc3e9096ab0fedab664473dcffedf9be62a5c7c54fa2eb5059e9a1d38413b1a4fe6d531b799453bc7185abaf78cabcf65f365b00827cec5f29c4737047e3b2932a78757e9626a958486d1740ecf1ec17a01aae6adec5104eb934f432207ce31d7096acb3a0fe2f5dd7890c021892fe7d3f34596cf20b6b12fd55911acb46d7386f99a9e9ee067a45c6a1fbb463e63d69cb582da6ebd6330f4f80a1fa72f2ed24ce9bbcd967118cfc7e21f6bfb68a905f532bcf8b8befa03295d362b41d25cdccfc9b41767858f651bc56ab2bb4a8675513c5d6f1c943a20a27dd29f941ad141debaad219e056510bc984063fa0f389090d434157438bb1759690c453a2f55f72c033797a4b0c534ea2ea084b3b6f8966ac56b106fcc11ef08902f2ed", + "signing_randomness": "ad050b9fc35d0851c155c9caa3428967c1268e0a3d19319314a91df98c56cfde", + "sha3_256_hash_of_signature": "ce826412ae953cdbc6655eda5f10c6c9dbaec97130b610e8f40f7605804283c4" + }, + { + "key_generation_seed": "3e74ae2b1d49ee6f149076f0bae2d26a5cadfd5de7bef66dfcae6b588a1f4067", + "sha3_256_hash_of_verification_key": "ea696c483ef4fbf33551d4c524fc8a782eea63b0536ae3d56fb02ed3ba30c5b0", + "sha3_256_hash_of_signing_key": "bc3ab2ebd287493c2c4c72371f80dca9f150d41f450fb642fe3bc9c42bfd39d0", + "message": "e42c006f144b0b4e188febc82d63d3d37096deec9d3dfc3b421635dddb73c76f6260ff1c53222a50d30b26e2de3d16e3aa64c78604e1191bbc0e2553117a441159b2a35fc8889499a2efbdd2f30b8b4c6cea38eb5b2575926e6f22ab96ddb4b0c5c6d78c3754a1b6deba49ffbcfa7477be9a0f74ec379d1c9aa59247c091611573af765ae698d78152187b291717a9f03fe767bcbb12f52311215579352e7ceaa8654b5403f18ce82e0a73bfd5fec1063b506f44eb1c9c5a03697d03dcb2ae15c5095f292b4bcb130b55c19ab728b3232ef77d1594611573cc6bdaa254f05934a329dc27cfa6cd8c02cb51c3c295c964c40502fe2b1a81a51c866f7c7380bfbe339b39c8f51f73722a05b5d1e9cb6313557b3656863803c9dc99bb1905d7f729b2db8da23d88200032f36ffd04da11ffdf6277acc69c5407289d00fdc3c56b32d54877f4a8dc70abd37ec532b8617d9f3c535b8e962fb389e976b4d1aa12de5c1c2ffacd50acfff65201104648e0c04cf7c1f880e8bda1d68404ba67c4bf64c9d2aceef81b35fabce58645e0f2f61eb4ccfefde7239be408710d349987d849d40b3ad294b9d815a91848f9ed53b69f78d9e955f6d1fd7e38ec291664d54c2bc359fba241ba6abcbf5fc2502d93760d9f6b1f7fb766040e98bdc23a6047134a35327fe128ae24b4c7d0cdcf1801947a1821ddd7424892df50e2dd5c1e2e6c5bfb4467524fb45c7d977604e7e0f1f98eb8c03eee1d9a5796c8a801f082678940f076bf44d3496730c9a640fefce385865899fc33b5dd34d036f2fd5d07fdc0a40fb725e84ce403b46de712b4b44ca8801a1ccf58233c5da06719769823b5945849ddabca56b0b4ef9327c8b5e5a445e6853e5b66b8d590759d6b2db722c22f8c741cf3c6325a76d93f4fde5872d5732fb19aaadeb7c18094727ed43b305b87ae2dbaad67f90feb86498cf65cc57ea635340f27ae5c5cd60ad3c763223af877e65a005c488aa4af9309e1aa02002b01df8865fd481ea254015796985969997a53b06df0355a6ab3c8219b652b09e1f86a6ca12d27c4bcb9e8d35e6889198c8fed71ad5642f5f9f7ce1df270d68aa05467ef9acd9a51347af1ee9ca7c4a5d78189042900c6d561f68d410a77e79726dc123b196c78829f02cae7d0623bfe9e7b0d8bf84033086295992b77acf027489d51bc7ff006a8d4ab8079d494413a565e7f687af40dd18b86aa4274edb8845df114c0146de3199cb55f773a87ffb126b3a4d00d38835cfd2d6652c07f572f39d0397fcd62acf6ed9f3e8951348ae7e52a669fa4e2bfcda548abb1989a1d74a27b73103770290e6ecac87029359354ee4c87a77bcb5ceb10162dd54499905ac8ed442c173cacde068bc546720d1284015acb90ca19147694b53899395dc663d6683908f3cba29ad37f15cd3903c4c7f4bd73", + "signing_randomness": "fe7b70da3b78360a10c14cae7eef4db2906329d5ed4bd1ec418b43bdec7b3eec", + "sha3_256_hash_of_signature": "374ae07f998c6d40ac1a008f41c2acf2a889396035ae977d32d26a896712be81" + }, + { + "key_generation_seed": "39550bd2782d66fa95380f5f101d827377b11410f8bf3bccfbe0e504fc09ae38", + "sha3_256_hash_of_verification_key": "6081b7615e6208de080fe75f2d132619c48718acb450baa2807eb63a5b57491b", + "sha3_256_hash_of_signing_key": "e4cda47abe2c14a33a032780b2a89c74cb1b6e09e5bdc6cf8e7450c480539821", + "message": "9c311ff20f574cd9b7bce1df705ae7dce6e7a621c935a6e57a59eb31fc443ab1e014ad332fa784583260aa6153c464565c4568108d60cc126f6e8ec3bc9120e5659c86cda8a31a7131936de7b3db39a4692808dc3d2bee8a99880ff9d1d5eff1e825a0f043d908d62a99779e013845ac0c21abe8e4df0ee901e4c6beb8bb36b30228b7756d617a8f30c16351d8ff91786f7406f75d9fb648830f88ea4537f42ead62e8790e9cf11f72c31d718221049c9aa35376ad8fb065f4809f4383a23c2b29425836c2dbce4680450896eeadee6b83539adfdf59aa4fce709d601640eb9a22dc3b41108a8ee1fccde9945ebb1d3f676ec8395255e125e62a32149c73451f597e1c32ad979e5be914ffc7c548d6ae92ed08501831e9007770a0233e5778f22adf7f1aaadf9c9a7c82d2f42989bf21627d3ef8bd0377a5be5c9f5a585a246a73de4340e6b43b36db775b34033962646c16f26a2b7179c40a721fea54805b9ec42177b42160b1a67341235b5af9f30b2703bff8cdeee5bd7ce506b0707a69f84225b6e5a92e80edfa235803dbe2cec47cfef0d9fac95c3379816a39f4550bdbfb45609c76d0351ddf8d61724bd5e8be94673b3013eebe172cace247d79925b12b5dba2f6fb72e797b2da849b79dee3db76775f5f1dd4595678671c7b18bb3749fbb0c6a7135d639f16b3864b5a251114de7e9f8cb02b4cc69902ec8d7d544d98e24a05f8accb182e2eb44bde868b077b1fac4726e8b01cdd0d024405665f7adb60a23fdbacf421246354e824cb74dfb35e57902794e459493905400d0a0bad51d8eb94efad55c67cd0c7cefe7a1b055f06371aec7f490fa685c611d553d8430992ee7b1855a9cb305b5ce53154345d7def6110ddbdb5cb59559eb664c6439e057dc022f8686f2aa0ca81552428437b0ceb5fbb5df254036bd2bae7290d947c963046771a39d2656312236569e775e7d2a041b7eeccec99c1b9d2757c7370e474012ae707ae00ac37b73ed9c8e1a2774e54baceb42e8b31bea734463cc15576bd4f7a33430b1987d62e47473391938312f2481838f286c4dfaf701ecbc6eab1a9f074c1f8d8963457dfaac9a9a8eea70c50ce70d1ba1006760ad3887605ec38861dc1a777d21e46ea169537057cdfe256cc08699d73b1ac4fbc62f863353581cad358b9c573d77585df6544e5d55048d66a352828cd1adf5f42310ffac022a25824430f741371027b2dc14717dc87342a74f0038674187e478d8eceffc16474a4aa8bda0c8d41962ef2a4b64a036c888ccf4ea628e1cb9ee0f9a918fb1b22b9367feeee0218c83cc7e27c5cb2ac64dc7e111e3c85ca0e6bd4f685e5ddd428e028d192142ccee3f0c8337bdf43ce4b62704aa53c703ec334fb56ffdfb81d7d4419535d17e5fcc0e6f558ad82149c591fe0357da15660f61544b4041128218b6de2b75d3801510669a3977e2983bcaf957ee2942e504c29890a81542ea208e1cec", + "signing_randomness": "7fdd2cf4e1e5d5ad2a80c4075ed07b30eb59a4b4d96477f25716ad9549346da5", + "sha3_256_hash_of_signature": "80cb8850112df3fbfb44cfa741ff539c074caac87a33f9fd526bccd94957d7c8" + }, + { + "key_generation_seed": "b18f0fdf9dc4f514107f88cc43fb29190608ebc5a2cd00b49fe20631761038df", + "sha3_256_hash_of_verification_key": "50371586ebee9ca16672f75c6721263a45c783e2cf8f43a7e02273961be39451", + "sha3_256_hash_of_signing_key": "644337ea3bfbc8f9ccc6fe89285375e348511677b55ec7622ff350b4c394f8e9", + "message": "7ff38725f35312d75e58845fbc33e112dd95d5c1cf78119cb413ac839377c7051bf5f17add1484f5ee12f42b0587ab41df487ba5e4d8836777b614a9931a5fefdc4ac451662b342d675c940061c4ff01f747b69cff585fc5317636e2a830140c0007f73c76fcab96195c86db98e5e65c733825db0325407e5bb059490f2e9133f9b4aa328976256eaaed2fbc59d00288d4830d99731a3aef36e5bf5239f2899c500f942b80b00c3b33307450ff0c105bedb7df84231c5d24c3c3475ae2f46336582de93aadbfd385c824f21362c19b1c6a75f56b69297fb3084b6164204e2348cb1d7cd3ab494bfa7ec8fe346251c874085f803bd7f4dde1995f0d3d17033c461d06b49ecceee0d5312c3a435af5bec9808acc524599668aacd95ecea7ef07c4ca3fab1cf964fdba987c345046e6507ac3d372bf07d72cab816ba627c2bd452ab8dc3044a7f0a01d8c0ea47904a5dd66c6b7ef9130d628a4f2cea5a0d05aeab7daf2729c1041fbdb3c2d17bd66ae293c03e77a0837419471c29691edfb20cf69bc6260975089aa437628f140a44fa2e2967357ac1bf1345e4208c33cffede6cd634b371e7745143ff848f77e5130d1e0f51868585509f9cd3b906ee0a5072ca2e908d6765c74d9b5c35b6ba784a3ea59d808acbb1c24d6c088ca6c9e17bceb18337a4da0c1daeb5d51efb35712a475d6c5a2ea51e93fd79f7deb127f3418f354df06489e10b42bc1f20651660caea17f67f306f48e15db7e67a1b56578ba7be6c229fed9567e128d48551e6eefa17af5b95a716555571f44fbc41ab29208db7c1846e130866d5c9be6f73e601c55610dfd0f67d98933d252059daa1dec20ae0e5bed6568a6322322d8a40e6835fa66e317733e1b465434532eea8fa76886b600e06efc1da41f8dcec0a5e8ba8419f0b7879cc0a93bd14d99608b5bea931d8971da8d2d89053e1de40209e257e741bef48c17fa15467f1312a368d4a061bfc76c2b7bbd900b4a34da51b7cb5bd6e2fb08806a53c0d60273167d822fb6982785f2c3b0ec7d893b615724d0193928d0ea8ea2a1dec5abdcaa904c754cb7747449e87221b3d86bd5df26e11da753e768a8b481c306e485ec91074377dfc68be74a444906e420c2d8bccd84be13aa5ccd11115b669c89e9c0ce374bc4059c696e5f8344fee467ac8c8ade37daf614992914c763d971327b60946943847fb6b82672cc376b780953b6f4433df69ac61e110fbf1a35f6272561193d8652ebce3291333fdd4d84b9cfbc60a57e1f8b817e84ea15d440d4a4b4f7e19c08ddfc5949fe8cbddcd0296a62f12f53d48b1288b80e24c756fc38e2fae9c7a3315d1c6da42ae838afbbf5569f633a68289eb7073babcb210f4e08856fa65057bfabc70ad3b58c2c870dfb5e1b0d11b6fa6d5bbb68285d8f9c21bd89669781c9f4dc32eb1ef58b80b1d371334d36fa66a2b3dd4b3e4dedba7aa9fb7e0245f5fdbb66cda653c5232a131ec1f0c21db1c47b990a64a24dc8c4da951f419f57c03ff506e0147c22e99461", + "signing_randomness": "c1ff0e9e3f024036d0b0c1b7db341485685def89b0cbfe051fd31d50401ce1bf", + "sha3_256_hash_of_signature": "c82ba635b60ae1ef454de7d2e6dd10caf80351e874c9600969379bf0d19fd489" + }, + { + "key_generation_seed": "d4fa14da39548392300a41be413ebd53bd7bcbd045b4d3c8ca44abc9599e269d", + "sha3_256_hash_of_verification_key": "bd47c435ae70dc135f8261bec00e540c011caf3bc711ce64029970ae34b7fce8", + "sha3_256_hash_of_signing_key": "b3a9f17fe4f3fa5d24075bc9545610ff31c460702b1796873678c4b16e3a3aa6", + "message": "789518ee21dc99cac94dd5298b2f3eb8f6ab8d0705d24d9aa3012f217464e7f203e08e5cea9e44f54a6f73e88d81592826e243b7f0b2a1b3a06e5afde23a2985183a0e430e01c3fa90e9f1db7e69dd8e7dc6fb802933e04a18834c091ecd46f0dd423f532668cee8a12a06bbc7e5ff3b9488b8f4a87a92bb8d6f313269ad95c574245e06563bb58bff6169b8f4c333033bc128b91cb81dd41b831df5103b295f744ede95fc3a0c72f1134a9321836afcfd563192c343040b943f69c0e98e8d740c06ccf840cbfc6bf777c9561065916f13d116d758a151e8ff4c355363aae8e4f49d2a2e062a2bb213aff25662d95549b4b025e70aa3363b50d25af84a3e5b0ffa598ce074733ad191c86c351592299c26c0a4933573ef436b73dfd0c4eacf93d361afe5f824b91bc178ee8381b9efd52302ab8cad6c08c7e090393b9b8abc78af374fac6e60bd104baaba524e68d75a759b94176105a9cff2e5b9c3984ff61c5afbf22b8e1b9e4f9bdffec0b19c2a5c8db3b8b2c02115d101805c1bd6652f738f02600e38998ca41ba8955094fad5bdc34133d4b523ede66cf483f1cd5acd9efaa69703807410939974d6dc033bc696541357da9881a4fd1385671b6e4bb889c68b544175c1e2ec1395dff4cc87e037087c615caf40804d5f44a2de301961a59818173730a45cf4c2df172614aff7199a40c9ffb9957242a89ff86b36a4f4d60f15db569c2fefaf677b35fe5f12ad5a323397714286e338ff6b9080fca50b657db477a52a93b243bf28ce2743794c361f443ad81ebaaeab2b237ebbc572d8586c3eab1f42baec1c985d28bc58b296a11d96a04b0e1f7f6790b92e450248804f3f62b5865941bfd444a910f31e1d6b79d8906e7e9828618f960ec14124fbeed28e1f58a8bc9d31773442fedc5a220f3912d0b41267d427c0c15bb76f9200c54b5f050307e13f1eb3de92b864c994a3df4cebd1bca634710fa342e23d7c8a5bac1b58aa321e215e4418428206f05232e2bcd1b5ee1bb7e34e7d4c93088991ee9dd643fd08b0185a2f0aeffb0ef0eea3acb4ce234bd5479a4f4296001305826f23083cc9dc99011864f250e77e42a0de26ab09ff6e3f32552f6f913256729b357cbf5dfc825e91bb5d3fac1f729803d431d339955960ead69b1e54536cfd774341cdfde1d1f527da4e738b2e292bdc884687d1016dc193edf34a37d284d026d33698295e864196e0bf16fa83a35f65ff2b38b7030e9e63eaaf594f272e07941313d538546bc84671739af822391ca4dbe6a579a81f45ff51fa5b7ef49beee7beba4ae07452c13366668f02752923ea3653043b26c883799fe6352f95144283d946ca87143b74c8a009c024d073baab9bc4da6c87d35fffd753e1eec7f01944639e566fe17a6f715f4197d1cba58d3d153bda37d7d2d5e19620ff0842527d109333fa2ba8bfc491689f4551bee6c9d13bb9e69ee4f44b782bb05d1e48d293bc15b9fc706d52b021c7159ff7df80e55627dd7555795f1fc616830a4ba2c02fe1a19dabe088e460bf3c5a88313c443179c593458467faa468791ca74e9b1e759847b6939f", + "signing_randomness": "35c3848bb8ed68520a67de0a06f41c58d38104eefba7204a7cffcf76891c46c5", + "sha3_256_hash_of_signature": "d9fa2fc455087db09f03052c6fe447fbf37b9da62895212a7621b70c8b830567" + }, + { + "key_generation_seed": "c796fd12d1feb1df46b162c38292684c09059e4463cb95dbdbf498a4dd4f7f00", + "sha3_256_hash_of_verification_key": "c830762b3410c292ddbaf907b93362e4f40d91bde3e2f220cf139339085c6461", + "sha3_256_hash_of_signing_key": "4bf931e2a3d8a9300f8f1f211af1d022efdffa78008adcb8b6c32ce6f2055a37", + "message": "a4117808d9d05b702483924e99623e778e7a3b7623739ab7ac488ed93e711ebddec383bfb7e06086fd0c374f4668ab744ad99b8af1c75309b60f55dc03ff7be6f23187ffd5cb224068568ce2d06abe441557b04a5a0c2858c416f6f7aa89a96adfc2afc54e0f31416ceed005b7b140b342652dac7bf401fed4d94d475784936fceb4b4f334bb14ba55b1ea9a36e2b0591287eaf4aced997162691a96e7f59853e609eca9a225f615a49a12763d80b5dfe6f8638923c39bd652936b19b944d5116f790e866a61947eb60cd1f3a1f319710d0f40e487efbef51fb4d00f5dbb94810128215f72b1aedd74a1b1d237088de3098417714eeb67d6a3e6bb647b6b0ac6d0ba3089d4cf6252b69c414e2bd6614429b6fceabeba50a4b53c7394652acf7dd9403ae14436ed5fd4d1c9e238a8399a763806fef5c3742c55b7159ebf5a13b271428f91229c191d617808a26af9190f9d445bfd3b273702bc3e7f610854c8e86066be7757960a880cb6727cef19dc7b464c464a7dac9ae85b799747b8488a4123b6bc7f0f7c2a8e53fd4f8687075b4e25660f5107acf22ca688057dae0496ff15a3eb9379a9f6e22fa43c932f137e389478c05db86060686afeafbcb9ed79ae194c4146a48ce5e07eaf585279313851cb864a50075ae46c1aab3b3cb920dee2652f5afa0138051c7c980946e8d5e18c16789cd184dc5598f65875ef43418dd56e11defb5a4a6afbce041bb292e0e2ec563296ba4ea6cbfdcca32a18c8aa395515a83d0fb7819413e5ae056ff0ec2f63f1d52a8be0b334a628d00995bec7e46a34bcd2dca0e9c5a88e0fc8c43843d6ae074c699276293fd8db2be48885155688428c2f5a6c6c91bd4a03cde2126205f9ebafe319d1b4f80277fe99211a09628ad840046eb9aa568ec71252ce9f69827b677d9c0d99546df5a48a8d253ac0036ddaf4d045a70f94ec54bf5f06296b2c2617f2b0ec0b8374dd28de269faf739b1e55ae1846f548fb6c0403c5ecee3cf9d1927e317f0d07e11aeba01c240fe17c6660f7cb32305af1eb6de4312fdea6990da4e9135dbc0b88ad0ae0847e1576f3c2711b785b846c7a4b823688e4218596caed583a90dc46bb9b27e00e4c1110b65f77e602f043a8441563667691c07162e52a53cd76e2d74dcaaa2983bf2e8f02cc30b05bd4f9ac731931c59f9ebc038fafb09fbc886f4c4191352206bb49adaef9d74bd08a5b780ff0fa301343f5ea81d36912eccb0ff24bbf0be6a8283ebdeca79cfb22639da38c9c639c4bd66fe5a75f0414fcc1455702856e6fc58344bf02998e17e967183ae920b7e04f58aa09145d6da79b65efcd18ec55bb9cfd53914f80d73c2b08bb754ac63e4c82d44b72376a544d97394b7c99678758b15cb94e71f9fccf674b29ed5afdce452959be5af510d57f9e5395a576eaa1fa7ba9aa4122a779727071fa485c005b447760410dee20b7c2299b4a0d5d9e5e4e038a19c87806c3fb875ea5bd7f47d034d7d5fec4bf132b04e47574172d392ea7b371516190ab81c67b45fef6332848a51b6c7dba90c410a44e9a88ac082fe296a7435e7d2ddfc645d5aebbc29620525757dad1b0222159d658c7225d02374ee6af479fcf1aa28cd91b", + "signing_randomness": "e23d6768de6e3ab32855028cfb7ae2d7598584cedaa314c70759b608c86edaed", + "sha3_256_hash_of_signature": "dbca4bf5c037e9130a32e26202e654f251372f76831d47145c78d09aeacb1167" + }, + { + "key_generation_seed": "a18a366a5ecacae4732dc9e954333ead153203013bac4e3c50bee15269f983fb", + "sha3_256_hash_of_verification_key": "2439e55fa69a1a3abdd862206e148cd7e7031a6dbfa8f742bb9c09bc494c5a54", + "sha3_256_hash_of_signing_key": "ec7ada37fd4fad0887463890581e35c097a8607a60c1614953f606dfccef3ba3", + "message": "e82f5acc7c1a326d430475357629d568ea3d0dbe131114781d5bf8daa32fde9f3cecd288acd14445678c5ea6d3afafce48ea3957a6af8d8f23f78d84130fb6419f706eadd430cc85aff48283f15602265059abb075e011e3941834ebe70787cdd55f1e604c6b86f761d94c4f5e525791333df6d43869d6f36b212a8f35583d38a21d0947cbe26fbe6a36e189c73137f2f2d89f48566d04d2dd9125d2ea4e0b2a7e5c1e9d2ea036cfadcf7bb28f6df3b7d6395230c9d39d1e7558ea25340252708be23ec6c0c9a0946c5c5af0fe037c254d1a5b2b70b8f916cf37945bef76bdfdfb19a0daac5a83a6357e986b3155cff31024121634c3700ca99e5ecef1f2e411c6621fed6092c1ab59860271ac7f431e568075d59f71aa18096195f30bbeb1a6bac20e034f83c72be0536315879f1d1b7f31d38c12dd8e97819b4803d02becd436b61d1296ceb78ebf857e34087ec8ae8395269b5b0770b3423b39638910d2a3ddfec8502389fd8b5b09ffd10caad1a5c86e7e39629ab09a4abcdd00fbb9821f92e7dd24dda83d1d9762f52a89bed6c20648ea04fbad4233e5920ae83ffec28fdb5e432929a41db782b2cea8feb40cad0b27903050b650477e5d9443a536ecdfdac673952810596f1985427359d9e4797cabccd2fa0c0a2394d853b4e6f8e150b3e3ab5136cf476605ff5ffa9067c0fe58a143b50b18b09256657cf091132d449a6e7ee79aa870e9dbe46bf840edcb983f585ec2856c059808e72b8c901a25d6afd5372f168d533052a6d26418e035d87d0bf818adea19915047c8d824a425a8c7915756673e0f5fccb1b4fe7c1fdfce505f7e18f023fdd32a605906ec48e0fa755b6d87e47711e158d672c5fb4cd3b8d1d13fe9eece58453987cfcdd87b621b870f3aa27e73b6fb7fc0a6757893b978c63b7723c49d1005a1e5b1a4d60c4a2fef392df7ef97f149b499164455633fa485bdf92f804a47c8703d124522d73887a2b032f10f45343993ffb009d69e80fb54b6999a5bdb2760f8bcca648f3c52bfa1d887ae49862db4cbccc7213acbfdc48a57c3da1f1ebbea828182432aa1c593c3e5591c825e5706a5f9503311e91ec3d8f4a9554c3df915b5fbe0516a7a5597ecf8862a8df286ada96c90c9f2783f7f947a18ebbc64c1baf24b29f77521a9ebe09becffdb902efcd024046fd3e6182bf0c84bd3a0a5410eedbabfc60114e5db28b0943d79f58f766e2edb16759850d4cc3a9a57ae073cf6f3b24d36a4365e2bc64674259170b6d11dff63d0deed085b6321c45f218e09351aa0d4155189cc98de5627a03396a067ab3fea2c133062e3823fb1cafa5d592070c8e82abe812979dbdcb6d2e595f33830ad0e8e2f9e6cdc4d9c74b8026ead1815de36772769c4e00806f79950a40c979c14a4bdbfdb79df1de01fdfcaaebc93ddbad62ba166843a121d2b144559064e9de9e310dfc93d624c1061bad3195d6c9f46db64c65a31e90371f9b644e2a15e01c262395269a9ae83f50776f852903f86e5518bd008cf1b35e78f910d48c0b7bbaaad5dff2375c55d56b8f65b922229d5f494edccd2d676361619fedfe6bf0bfd7e4c77fc459f181120c4430c409ba89d2e5a8c36cc6200497611d9d705da6ae1aca4e16b389d632a982e017e1dad95dffbc7a7d7191e7b8fa1c0ed", + "signing_randomness": "77389d1b21d40a49d3c39ada885422bfd31059e24ed26c549293171568c7cc21", + "sha3_256_hash_of_signature": "878eb1cb3c153fde9f51649cd6942f2b4a0e3b6de5c9f2665f64b21d4694fcbc" + }, + { + "key_generation_seed": "585e714d565aa66078bc2b12699f1e86c6ff30a1abc8cbd19563bcddd2f1f6d2", + "sha3_256_hash_of_verification_key": "fee9bd70e05122a8c27d156a5ed98eb4754731013e1944f0f7a30bc64e7ebf1e", + "sha3_256_hash_of_signing_key": "8158739b3c87a4dfb09fa59835121a2e2415e19a44080f56edb7535682362d03", + "message": "743e5d96b9b4c1469e7ad2b3703f711faf60ca335358ff3efc8fcff02cd020a443243b4169f9123351b6c36762b85be5e5eddf8d4b43d82caa615788406a31cdf4f7087d42db21ae48a069aa23a8f6d20a1c0762f973e526f011dec737e986cc324724bc5336d0362525757410e21046a12ac54f2237e68da036a5c1389e46a53ed8c21774906948d4c9e14f40519c54dbd02b7a4acaabd24ffd7f6ca4d6d582ef48940296d2893415e811fe7ef0801b35f1c594e6fea2c293869bbd45618b6f04fc26b55d55a0ae99445aea12f851b7e58a49cc6a0044f28e3eb838cfa6bac5df53b0db78be2ca2bea1bf2deffebd673a783c91a6c9ee710b12042ec2863a9b52eada5b0d32101bba8338f7c75cdae7b7fd6797b25f96abd53a24a7647a1c91610306ffc72a8da4d46b1778146a98bd59cea3173d41d5a53f9a7f9e282b5fda1afb062d8afb63cb19b0e76df782feb9f7fd50902133529cfdd7c51af297895ef6e1871afd4c3de93defa8fcf1fe67bd27b7eeb0cf37a6a8e09af1203922bd9b62672d4756519cd09dd9271ecd0285f92030a9fc81c09bf2fae86f5f50596c628e0be673571cbc2fd76c563e113004529b234fb50e9e3d6d1f814cb8e5b5cc3ea365d0bc7602b146cc0361397d9bee9246fba3a724c462e177d27836093ec009741abfa28379aebcf5ef09bbce00ce449fec3a3302fb9ad0f010ca338363539da545f159fbcd3d6a0482454023587a324f5132fb6f4ca602fab2cf6cd59104427264cc9ede8d10cd9dd7fa6133e65693dbf744443ae920994226e21d98634bc7f0710dbc37c18203efa5adb467b523322e21e4e686b6b85b00cb501ed84153baecd4d6cac9d1183e38b510f7b1dbbe5995bcb717529b83fbbe969dfd8de21183762fcded692b16502834fe8e7a7c46f84acdcd2c9975098cf0cde8ac0efafa449dc26840180dcd9353a2f1b06962677c808b07345e8abe95b8d24f21d751a4edcfa0e02ff077de64e6b992e8c8822682dcc7f03ca7582fe7c74e0a9822a02d888fdde1fc9e73c2ededdf32001e918771e5f511ef8f88ac19b76fac0c812f56938f814d712d99269d7802e47634e541b54e00f9eaf78a421506a88b4bf7332dfc7d79e8c41835031fb449507d19d5a8a512a5c527c95b6f21ee3e41fa43591dd9bd2e4293701bdafb624e0ea290da4b7a173003867c4cc3fd814e117b4eee283c58f5fb33d653e410f68c8962155b8c4fbc13bb750a0343737d1fab36ebc618a6a7c8e6f93855cb24937b01c438fa713d334df335d0745582f680627d8b94cbc25f0d12e3b1c27a3ed72e2558b800c19dc6b719b961e0fee43bfc34e999027ca1969aba4c45fdab9af01b955e948de951f5a1088beda43ac930fe99d8cbb3473475c444f43e928e1a44966265b38fadf9b1183700a95a81f85ea43e5c61dd9b2d67701c95583e8e3f15083717e1722d764b6e624505347c30e5e70163ed9a046c504ff534956e911294d2b9097bbeef8740377ef0d6c4cc8086422902bf63556ce6da8e33e68fcfb42707c00693a995d17680b76293194db217eb5a928303dcf1814e4a881b057baf2553ac4faac8e4bf23fd4074154cd4ae189ff7e204eedb8edd594cdc21b5b7d73a712b511d068f4d217c0f91f9d84c524d973d67aa741eb13fe922afabf79cd2396181143783030fd2d0cfefc877934d8037a4c32ae8e15b50a6fa4269", + "signing_randomness": "151110d1cb8e5e42a3917527ba7a5cec33036cac5d0a84bf0f1b7b0e860bd0a0", + "sha3_256_hash_of_signature": "0349a57130aace120320ed0e208a37f73897d0aa70d64df6b42a5d82e9d80263" + }, + { + "key_generation_seed": "662cf70d3d5e95a9c6a33bd7c6abf0e8cd23ab2d2d9420878c4835de14a6c606", + "sha3_256_hash_of_verification_key": "69dd361b7e64ea895374635e3391080eed8f82f8b27c43254f37996bb6e120df", + "sha3_256_hash_of_signing_key": "4dca9f181c0dde7fe5bca09a42c4caa85adbc1199e18ef0eafdeecc02b1fd95f", + "message": "3382e87ba70ea986a044b0cba2eafc3316c1ac95a5f16f6368c210dbeadfae6cf2382ddf5078ad594cde3bd1a837c517b1a20a2099d938df6aa02b6c0e62fe6147c904bcf3ede51ddda60de7887dfeb2866db402d23e5934a74c9ce4852d4b2f53cc9bcdda312964a548f6f7c8320af1d1bdba7fd32ec6c86bc3fcb4205ed3db092fdcad9ac4d2b8575883e13f69d8c16cb18d1b9284b31823ece917c905c5c8b9d180c1bd87975871014f773fb57d402b8fe16ee312692665824cf0bce4509326a31957319364cd421e9b21bbc1dff663ed850858a2450c2ffe64b65e009a3999ce4504ba5313ba0ee4a8843349c30fa6e59fd3aceca130a37c04f9b64722608768973996112684b64d0c87bf95e5dd60661935831a6a1a9575ebcb2f64a15296be788c775d80523d6bb4267d91b0c71ba5f90ddf1933de898e79fc7e39d0a3d146f185214468da50aeb47402ab542e52ceb768a70cb1f749e4164cf20e549b674ce965ffbb98d874d34b5b7851e575e6c1e4de9c170a10dab84940af055a951260b0119f5acba320b55cdce4f16346905a2073cd9fefba95734e4f4dfdb7a33f292d45698831f1d3e9fbf56d9692c14a8f9887265cbb4441ab331d977e3a68a1bc9f406ae0fb1c6e91205670641b9868e2a987baceee2364fdb089a63b53976d600bd7a8ae88a02872e46927269d281cefa385c98ccdfa6609394943fac32237368c6203aafabde072054ab5a14a91391d5a943f4ed4a4407f275ccfd15fd28f1ae0eb6edcc6612e3436572919e4dfb57c049bd77b344d8e04152863efd4fae8fe3a7230aeaaaf82870820085f4b3eb5215111b6b8952cf2ff468b3d10f3af849f16e190e9560f40b05e6e2204591b58a850e2710f7043aee2a44a6d4a108ceedeb2d216e51102dd08751925de6a7f67bca1980f0789b34e2f86729621f2285c5d3a036cd87c76102e9d607c37ccdac8062ceb961053f3195b5abd88bc64fc65f8be34166841683f1eed291938f75dfdb3af4fd2aa98ce95382acfb5d5dfe6ef243c8a0b19b80584fc0cd533e38bd485d1c52e0eb5bff90c0a947d9b9095ac1c0ce9754eabfc860990206b981235c7b612db61c9fdefc0f14dbf68a8a0ea4986cdc4aabad6c218559e11cceecd804eb98446fb33eae47c0388bd8972ddac02ce807b707d6d188cb31a1d76d44323e93dac4f8ecf77e7896c052ef16009ce4d1147df84fd5785d95d77310783f9aeff1dda693f4bed26457ed82a1cea19d9c4919257e3050b25a7d1ce7561740ddac3fd93a607c79875e050e40498bfbcca95bdb3d0fe639dc7cea80e3dab3ad73a4265f012451c1bcc2fda1e1aebb7fb18407f31e7496e2a18d2c686b47120688240a2fb134a3c314d4cb422811e850524684ec485e061f7365494a6403af170da461a3bc32ffaf9143d5e9b17b2285c56977aecaf880cdd34f26120dac4c950198233a50654efaca6ea97333d2bbc024a5e668821d20333df0b712510100aecab6b484ccb7814178f851a3e6ba0b76f16c4685d5ac8ba48558d382abecbdcf0b919c1acae46ebeb5011dd0b3c22b539810720cfbe4cbadb111e100c09c811e724a67c66a1b89eed1e7218861f55a4dc55e236c6e3521dcb374437a14e8000dbebf0f7f9bf409af952888675c11326d9e3e8a8828bf50caecff96075cf29446cada373529d310660cbd60c042c143e1736fe7afaf6fbe42791a8db01ec0475145257fe2df766d4ea972b14ae5110b8f8f42d659383e9bd76", + "signing_randomness": "7ad0ab708452cee65cd6b0d46ae27bc92b52753064161b4069ad82a50e65da4b", + "sha3_256_hash_of_signature": "205a52c01ee78eab71cc1cf1777386574065714ce81f24105f8a32762ed15398" + }, + { + "key_generation_seed": "1924a71628292aa3d2d34ea72e2bfc2520864205f54ec6f19f7714733aa34cc9", + "sha3_256_hash_of_verification_key": "3702fda95d3d73c71345e1b5aa2f0f920b880f3761fb68d871f34552ee603fef", + "sha3_256_hash_of_signing_key": "4adc19e8d79694b5245a279d56fb45669cfa67ef945c565eb8cc104c6df94924", + "message": "67109894c579974373ca0054ed5f7c373b7aeb810721c3d9cefa02eb244ef6b17507300370adb24ae0173c6d114c51e05f822a770318033c082b6502f70012283eda2a9dc0a1381f145470e5d3729d201773d2aa63c18885a92c962bcd3628835391d70dc36273dfaa4966f65ad40eb51fb4b416a8d0b1ddf39cb932ec4503bea23e3d9d3b4501db426c6ad99c28d415fb565f62eb5c22bb043c8cafc42ebd1c7190dd32a5b14b571644471453740c081f3e3305f9ae70a5bd505874382ec0f6e2188563e763bb8d1bb8b16587ae25a6252f51e4ad02d0483c4a6e8aa2849c44629cf4b7c6dd6a5fecdab0f9b2f0b35e306c7532b64bd5a3ce67a0247d97024aafe5cbc13e375aa69b8287bba9ddc9aaac2bcf41a71e373ee36b13df9f829bbee8f48802dd9e03be42a5e290251bb130e0e2abcc4e096dd0f264e5d29f8c2388a0c3010e78f2a03f5ba1be13aa5e50f2ba67a031ce3f787754b8276ea1af62bc5fb4dd9a9b9bb84217a37eb9fc7aafb517337b30454200d6aae491e50d5007eac2150f60f640a5c4624ce6d8112119413731322bad9762bcf72349ee38e2a41102bc5461d72033072a90e82d105e6fcdaed9c223a4142cd55920196d7b1b9278c84b67a2e35bde3c9ceebb8e9007ba8758bd35c875dd5fa0a8fdaaaa9a09629b9df69afaab456e105dabf2ac5834b8d223b0a406e0d1295c876c447e8e09c93fb09ed1b3ef6e1f3b7fcb029f576a45a12620567e05f218bc3753109dd29ae0ade1370c0f871ab5ad8a9dbaa277fb869ee552e8733e73886d6dfeace6b35e481f37a516ebe191daa6f83e4ff453cf9cc9ddea8ee507af0e62ef3cb8c22949cb828e21c6aaf3fa9ac301e2257b0a054ff0a237f527d53eb757820af637ffc9f983a2b5aff0b4cc493e610314432c9c2f0ff73c4240d520d1d73721b429ce41807b7424b14f5eb1cd23d5562263fe1d58cb1d52e5175414800cb090242e240c3a7acad4c84dbd8abc2731fa2b1d9820da60fdb6baa7ea849b6a146e07af7fc201b3a98e5194bb5826945faca3690209e5726f070a71ee07ae76adb7e6199fccc81c8af7a463633a58873b4f7e65f522fda409979de41cf54f659e66cd5950a3a3e01570526c46417a00ec2e8821dc380abfa21384d141d259cbb9722f267e46272adc5cc4bce382b554226996f4a6a1605287276c18a48c8ff1a92ecd2815ca5452fd6157fc27532680022993535549bf9ab064052e6db4e9f83b5d0d885b94a90f59e67b9df0c321eb0f95ac07007e4ee33ba89aabeeeea01fd1172eca4e31fb02c507ffe43cd0d6c8570769a180e68a70bd344b4c992e7d3a6bfb96ac4d69c2d4f5efaca1d348dc1988de44b30da76babc307a88124f96f26737a85fe6047e7e485c7e4b6b99b575faedc9baca3e080e2b074cffce1f716c6a1d08234c45706d2883c6e5a001d02596cfe5b260de6134c75df3ac8bcf1919759e15576ca147cebe041d04e369bde70cc64157aeda311c8da520eae907c33e30dd89013e24b7b02e66c9f285bf7d5c3fd65bae24ab20d40addb451ab4bc4b9772d0b9039461bca8d3d2a4d71a2e6bfbe7f02325fd571fcae1fb47f855612f382188a5fa3d61c3e8e59ef016db0149c52e1c7dc84030e6c93c4f32da6ce5f3b8196affde834d2adc26cfa05940055401891519386bcd33d85584d74b2f16d8e19556c272aee8397a1741effc283dbad317740c1b67f8f4b7d2d1edd68d6615eac3f8e3cd26ac4f8058667fb388b19c654711b5b2eda75a9ab55174157cbe08c186a3d0963bb3011a9567bd499ad2a8", + "signing_randomness": "c873b18e32e373e33b6299c960eb6db2fe8d9274aac0d9252bcb5394a8242a68", + "sha3_256_hash_of_signature": "545fcde74e9aa94a01368fd3fa7824b0b307a6a11b9c3218b1b959c598c9a6bd" + }, + { + "key_generation_seed": "ef7ba21809ae7e0bc3230b6061c5fee206d805572cf1345198e1ef22a8fe7322", + "sha3_256_hash_of_verification_key": "ba4386390e11f40ddd2d2d3eaab253de08ed1e8e9ef2a9498790f08cb44d4b23", + "sha3_256_hash_of_signing_key": "3ae0de9ccf612c588eda9304d387842f4c4a7f9ef8a3745e3b4b5679cb472d11", + "message": "061934748c6758ecdeddf3a2df78574a470621496ce3f12e5e4555febccc1a46a772fcbadeba8b2eb5231b5b15deda5a38076c737e5d091a8ca8482f84ec4a20a51ddda391088f2c3926f8e1d8b77dd0abd606e9ac25a17a86a5c75adc215c5030355c4a1b307c1cc80a3bc4a7d4b4044fd35d173a2c7c081318f707828a3438dabe0836c2d6c14e1643f05ef8405531d5594411ae4dac6f3992279cae379d7c1762b122037301d3ffe8efd1beb4e027e055527d485d0871f2013e7b25cc26531c2ca6ddb98b31f0ac2c3bdf400a0bae942c9d4c4003f9952b67af67e85f572edc3345a84b6dc3cebbaadb7e3c876ab2da16ed0eacf4858033bf5a4f739f9e083a345c2bb5d8611dae90d25ac45d8b3d39b4de584cbeaccc6f5b6e61524349b50e818bb6b03c7e5b86795d49324ce6b1603791f20b3500a1b8ade82359263470d777b35dba38276096445842ba5d5e960fb2ab58730f970a15aa42d9737c33be700127a7ce7cade024d3abca59ca49f9a7edf44db62ccc07a595016868aa97a140178dc92530eff864c24954464ba886db7d74be7b540baaf807f1aebd014680ff4a51e16e1391e32069ee823f3d23db72244d657233578cb7d29a33e6ec31df1fdd43b51742cc30efc54be83149177e7bcde4450dcd142eb2cb745f8865dfd99dc84ab92750f1cfb0f3944e4e4eaa41261a1e8c58d9b230add792dce20d2612823c0ff9f82e04b61e48dbb83f1a6dd5cc7f92bcd0a37ab3053803d1188029aa1fed9ba04f4c961588c9ad2ba7ef1cfbc50fa69b799898eb0dfe9668260ca5680f91a10d2bef8f108ab28fcab693ecdb942070d2b9b8bbb22609c8395c23d7482c31b69b0f555b7c079d3defaa5fb302ed92619c058adf334e845eb1c6edd903c0de2aedd3d9830943f8bcc5954b65df37c901a17ef13fa75b0f2c8c1d2e38681874aebfe90b463f2cc7831958fdc0de0446991eb3c3612cc00188dfc1078fe458d2e5b80efa7bfce800c6b4ca0e570fa5858859633551da28f36f1ff418a9b7ad18aa89b4612f9d676d5fd98bce6f144cd7458ca9f2bc732a36a4d186ea290a009a870da3c1f60617d56ea7554062367121f3e5e569503aa573b172c6278dde5aa4ccda79d9d8faf41c6c9040c1d1d3cb78b41ffa8a0180395439f0d1b72e42471a9100973ab3bc7aec559d94d2d6402374ba5a584de168395a156324e1e4149abd35c72ae0f79863cb59ee6ba22145e36e0d85d3caf8a427d38c96ce489cd0aea20d7960608c074ce3cd0494b6d6d5ec8895f0f03ce78982ad8fd6784bcf16825286c51325662f34726ba66d3a91eeb598124d6755da090ef863fa31ccd5b08909a3279a35cfdce24d2ba16f42ad280b029a0e27137a671c862b0e6f73ff4a1de320c4daffb5cd4ac3522ef1c10e8a918005535f355ce6366b43a757938594366831dbf7ee72f311be4953edd1ea1c598960745d3dbb7f1e2d882cc063bc0791d18c6376a8497f2f91389a13aa96dab78feca081d761479848a5b4cc2e3d015f343b9000583e95e785a45a06842d7c6c0fe9ac4d70f085503d7ac954516953c497635ac8b7698bb784f73fe6e7f9d0ab9473e828168df4ec142cc1fe18fa067525915adf0764e44292a0316ef3c0a443683c92c4661409589eabd7b4dbd43f54317ae0e3d1c69c35a7868991fa0bc2f83430d89821b91a08ddc2d314a717f5bc6f3d89daf163af73e10c61630139e3feda723feb2edffe6c7f364fba22e6aab75e267065b5e7575946c56265743816b2cf12a106ae21921e3e92bfb7ff80e105468f8409d6698e8660b5b05f3f4bb19a0bd4be3569d24f51795752be74c429aeca5be737de8c01", + "signing_randomness": "12d9e81275b7aaa3ac53c5bb1b67de272495ba5b24285814595bd050cc6bdbb4", + "sha3_256_hash_of_signature": "f982e8ac9ae9a80ecfdadb19272e3a3c97ff15018af0ce31baf43831df965dc5" + }, + { + "key_generation_seed": "cb0b305fb54e1cb23b63ec1f6f4689137e5048d095fb3eadc854c852ca86be93", + "sha3_256_hash_of_verification_key": "2bc31fe5b600a15c06f445318d77af2e48d6ea9ec6c255fffeba40b7b5f8c00d", + "sha3_256_hash_of_signing_key": "5e3f152ddb1b26c546a5bd821a66e8e29840f9f68c397ca01341adaa331a729e", + "message": "ae2638d944822298959f47b2173de7d1e58aaa622296ad4a4cb67ec7ead8220ac2f171605ba2d08af3d6ff5849566eaf96209e9e00cc28eb9a517cf5061545aad24cce143a2ee1ab7cfa259ad9c01860b33b0036f2cb3a5086861212f408c5f055d226ccc77cc884452b2670d89548ec1c6e98fb311df03979cabf725e78956af185447287bca2517f554e9f25e19d93790318efc5d2602fabf262e5c7fc307e5a991e0122e332a803ac4a91b318b30d79394248521190d2be326037a89fe918d139f763dc8daa2c3bbce53f04809f0d97303f2f1b88b572b3086acaf38eef36b4c0791b4918204b0e1e923bce9e3bb1e7baa07135b176e266af174d5df26c44842ceac4ae4c1cff05557da3db8651261be78d766699b1891cb825fa9a418c45bb9f7f2d347f3f92f9529ca6db94e2ffcc69337fb3690f556c5a44cbbd9d79f60aff063de68b14bd2f4b7e8cdf94f6c2f40219d27f71e8ab3d4d6872a5d4b82eaf8e3943a6d425ed04fbc5c7596ae929ad680b245e3d6a7c5ccd7fdfa1d14ef0f72b9baaef05b7b84adc02913ddbc76d5fe80de30527ffad1825ccba34f8587c5b0291471d6957ad99c5fbcf3669b4ae5930c8af68305c2d3e84e714cb9049a9560a3c94aeb95a252f69b68f755dc0e0aab52dd054b670a275bd2bad7ff8ec0cde6224e9a0eb537e95dab992c382d6b03fa045da402ce7c5b55138fb400d9e86afe30923afee82c4528d1b38ce16d33beb47a96c18428d919ba98c9782806d6f4a40b52f7f0989337c724be24e9a5430cfea470d02ea36ca479faead94a74049898d1f1be53d5ab8cc0cdd5438a7c55827131de264aecd18e5f5f2f9fd60e8d2d6f55beb27eb77aeeac2a15432a5f1467483be6073243d0165a6c242fe1bd7b7aa701a0827f286ecb51e4c2626dcbe95466bc94a7e2a09ab334fee3959ca31974b6286e2a2051653341623cf3aca65637df657280b6025db0c0377ec09e6e32010f0f59711a30496695d23728319dfd0ab5f3aa69025276e68808130659d912a53693584188e310b1cacc41af4b19fad8da95d4b35e2569053f553a9dfcbb8fdee1455dfa0e4f5e94324c86a24288ae27f3576ae15fbc8bed49bfd8521d77a61fb523badf0e3cee53799016c6ee4e1e5defc19c7717a5c41ed8fa6bf0e5811baea76676de03767a607735c2a48bede511012eaf1f79e4d2c3566042ff2c63bb82fbb399ce20e1f268d3844bb473ad7366ef86d064c5ba080fc0c01bdd2ad343c5367d80d2a058cf40725268cd34123c219d9109780335611b008ee3f8848ea9d174d7b96bd2fd9a04fa2b550dcf0b301d64c0764299d317dcd0ca05718a1ac008d86fea330095e81567e83bde31a0d635098d7b86176ce6cc4025e8628c73b394d9a45b09b64bfd3a424162b16e1adaa1ab60006847c6d5ca5733237a330147cfe6b9170d7b88834bb79f1fddefcc0ebb1d4fef326e28c41c919607bf12ad112807bf8582933ddb096f1f3e2bcd6bcbd844da317cea2a7688a5fbba14d84c537814ec2b171ade28acf83ea481631b968c26f8d2bf2c5af7d61a93378e1e23fc756e2f0ee79199475ab4ba1fbc55d9adc2b05888b2910049bca98defefe96cdcb67ca9d4aa5bbfc6ca0ecbb78bf29035d158de2a1708d98beb85c70ad1c64b39b387516073e2fe85bd9efa25cb048c224e0ef76547dca67fd66485a97eb5e56c06c78ffa08ec1c9c6f2380912a2585cbcba2cd702cd2b51022f63ec920412989bd743a8a8beb07241e3e8eb38ca14cd400c83dbfa6fc8e04f58529007a1477e9613291af877692e4ca9ae118a1902ae7b4ae7dc2e992a6495cd19df32ce64131a8d8c41969a8bae1d870dd5f1360ba9278d5b76e746faf99d526199e87a4b1d3a5c48a33989f103cfb2", + "signing_randomness": "b2f1c85588d0220312b9c2050408076301ef1442e150d199a6634e34d5bd2c42", + "sha3_256_hash_of_signature": "2c36e6292f8bce8c1d4ea6c1555fa941ea61ee49997b4bf4bfda8da045c8ee7d" + }, + { + "key_generation_seed": "f92ffa3a36f43f9177763ad320fd651d9357c6d99f09549fe6af12943b58be90", + "sha3_256_hash_of_verification_key": "d88a063be84705e8a9031df5741d866fb0547f80631492d52fe8259ae3fae571", + "sha3_256_hash_of_signing_key": "86311ebd6de825936767e9312cc1b39088b1d9e66a49c2f7d8355f7496f284e0", + "message": "9d84e1dd28c513987d5587a4427853762b7d7af668ff9ec2e90211d6cf5c0de6c7e54b298c1a6c67ea9a693cedc4fca1a6adc2c6dd0e5bbcee7266b9c6ac8fa8af5e50078a6151f938161f1feacde4d8079b5a9d563423258cf3ae9e47d8e75740314f2ffa63865a8b30743f773a53e1aedeac45caae01993b75c8116fb0b431631ac001aa8bd02e5b83de627af0ccb3a3d86f66a7e5fb658f9226df31095780a6e8262a247d70f4e7c971d108567ffbd7fed0e16b7ffddd93f5764c3e02a61998c32146564d46589538b2e071af86a26321a3523354f4f0c396b863fc8e9e2e3a173901d0d178a9d2828d0e0974b72cedfb17937d6054f185a81d4f853787e6c3681a74fe25faa6c256a9f9e9a9253f98b9ae4b8fa0068dc28bc7e8d5785cfad20f7ddd643dae6a2ddb02713c9cafc2eb2fd18efdeced05cc24913061bdc38e932db5e8181fc0d3de26a94e2138800b3c01e07e83b3b0be187edc75da576af1cc7b7122367effd6ebf05f4c2eeb0ab6e9f91201a4237910a87de9fef777981d48fba28ab8d64d76380911f2a6621335dfa96b331ae8b3242ea1f2a260260244196b0b9596c411218a17d0a58d3b5735b9ad7b6259655cf6e2d0fe5b37d0a0b02e67951f5d3fb277b6e1ec87528b08229ab0ebd895cba2d075a47cc8100e9dd17de7d951bf0a68d710aac21c8226d8ca95ac49fcbe9d493a8d3c7f93fa61685be57ff422fad036304f317a3dbcfee7a4610c8c1ddaa79e37c19d6414f47230e01ef1cd5c7c2ffc319a29ae6a9c95b06c603f2cfc1d1fc914b036cda6cf9a876946983b06123c2e5c7d09bc190647cdc0512f35db9e214c77d3d7d0234c3f2590941236a367700f9c04d3afb949dca2067571bf28e78ed35fc026bd801c4afee9bf31c97580953950d2e81ee6426e78d6f8134ed19707473f0874367c86c9be170be63405a9bf7c46a420724b6ccff9c21b015e21bb02c5a7aeabca873b46571530de56e47288c3424da398517abb6502a9a6a65d4983d97e479941c44cf0136d225991226f70837e2a7d1e9cb1226f40bf59d52c66549bf8e360096954f5875c466160a0c75a252e5fe6b8f1841fe210bf08520ce74d77b69692086ef50bb64732f19d1a49e5800f077700553290635d418168a6b9e3ae980112afb9d58a18b94f972845c309e86fec7e456191d8760a1c2106036e44c5c9a5f2cfbc67d741e8e937e99ed7820ab0787e39c385356ef0f05cd3e31c44115a8892224197b1d1f554d5098b72058fad49c665f716a266cb4db6204666e1dc07b6cfde0ea00345661e0f94a5025d2ec98483cf482058d2eddb018cec11d91eb46b63971ab29367db46137cd7690d5782e3a3ddc8cabd545fc1aad8a9a0a39542aec55cc3d58a5bb5e4a559db1fcd2932eff6e81c8b8e5ad5b4e0424a444bc55d96df63c8971a5890310fe19dff8acba72d96fd3f32d67d41a2f3d0b343489c7fdee7556012c2d88e2ba9d512b71e7d04f92e6be3a9386565271d755bed752c853e4539f95c3287a275004f76b9a93837c6efc6760be4a39b8aa92c7605ac369472fb29e11acad98fc91b1b9bb3505638d4d46a3ae3c10c8dc115c35725f06649bfb00ba1ef214b9f2fe98be2da99ab23e7b9f014f5c5d0248a9e0e088ac175c8048c6beb5108da59dc234e9edfbe603ba912bea22505c2a9eaae766ff55aac8392aea5c722df25bc6c9fcf9b0275df71206a4e5290fc5e71d79928e357400dcb04efd7cc9bd0b86e04bfed9bdbce5787e40fcd6041adda615b5ecf03c30ab9b2809e3514e9ac87226c55f259c5f157945b0073431715e1740dcb319edddd1b5f2763f0439cc0d6ed5867d9d98c227ca3008f30d1b2aea40dc73ff8289e4a21586eff519520f888e7e2f6d29a269c12607d13d398f437cd7f0a07c94ee1e1e3d8518d0c97be1e250d79c5ae1709ad8a638f55", + "signing_randomness": "048add9ddb845f46a4c1e3338dc78aac49fb30623f649fe4fabe6b9fe23f5b2c", + "sha3_256_hash_of_signature": "0e92d2dc8d0cf1be1d91907b71cc46e40f123e7d2accba9817169ef0b93a9841" + }, + { + "key_generation_seed": "5d3cce926a795abc5f6632cabff8bf66275dcc7e4a4ab3b8399d23e62a28bd16", + "sha3_256_hash_of_verification_key": "21a9129b09c980e2353e83579b038c40b7be141f4a894df6879129280df098d6", + "sha3_256_hash_of_signing_key": "a542cc04e067a41bfc55bd45763edd6cd49cb5469daa693d15d10343c6ea6b32", + "message": "af2860129c08a1a9c7a7bb3120b3e40afa1a4a09050c8483e7511fabf3285544d4ce3f41401dab8c17da547f6777a72519f6eeaac83016fa0e0fb0b33329dd02ab8eb1f291758074ebb5b7c4c102b75ba422821e6755b37b914d689d84808a89cf88f69a446f489a260ba03ca52a4aa14e8bcf4bfe5134dd2918a88d67329b9badc6ada4a3071fd21cfc45235fa0a1b82d91c5877f10ae087464251c8899732aa7fc8f6c0a5beaf4fa41e64ca97932925a06e218272500249577705804c6dd9f0f61dee6aae096be0ae5e67923137933fe4d61e9a88dfd5b3bd75aeeaf5018a5153985e2837ad1aad5eed91620d935eb9982dd2364b5413f490bf251fc783503fa146300e6adae0682e0597c3839c645dbe855919bb1cb80c3dc6e233909017bb31f5adaee05ce442eef594fc15fec3a2b4b81ecaad1340b0677f27009290ab3ab8788556389047f63c2ce9390658e151ca85baae45ed2fe12b6667967f6b772ee683ac2e7347c7b0efa332b3354b5043cb86200f8e4249f68030844d00a86faa7b79a4129ad676d1e9d58828a1af4c6bd68c29cc23002e0a0313500ba717b8756d4a18e41e381df8d7a999a153876db876ca4a508486a4f331cac9cb3e7c416c6329713cab76e1c8b63a8cad46f8eb1e65116f89a3b4eb8faa14a73097ca71aea3220be7fb7fe64919893930445d962c309e23332e4b3ed8ca768ef0ed46eaab199827ad628a1bc20ccd9f61bef67f7fcb017300ebc7493a7ccdaedbfca5f91e80b80decbfd9ead9bf22fe16b563512c7383d34801c504202d7a0e19821ec8495016362edac165904d2bbac484de1d4112c3a3e6ea56a78785b7caf2a44b5bc8becbc50bf4b521c1d086086feb009c06acb8fa0f53e7654fb02ad7898e35e5f3a7dcfc50124ba1f30178c707f4d36e4e7758c4cf82747753cc30a836311794a6a9017f53abd17a1c9647ab38ba56aac83c1812dee8a5a75c5cc958780a3e9c3c1f39729bd365948f7fcd8104cf09660060fbad2be9b8d8e5bdd22286eb0bfd4010681ae7928d0fc008e21c8f877d97b5b9c7a06c02530fbc6a9d6fcedfedf68a9682177757cdddffa6cb9086b8330e61851e2761d84da37635ea8441e3b23fd165ccea562b0a3616b30ee5fae00f76d6801b22f2215d80829e01db2c0743e3074cf26c96b0eddf97d79fb9c7ffe9b5cdb891f9e61fefe7e1cbd28fe25b7858921c8c99c45a84b50a8233037dacc20beeebb9b22089ddaf2ebf0698498da694f75ed2463d09ba2c757a986b8ca556cdf46cbcdf288c078041d497242f66411f47f35a21918855f105f24686076fa21bc1283f17245a7122a848b4bc10d996b2c5161fce0336b2ec747a4a07fa9851ac5423d1efc4b524e795b2e4bffd1c5cd21f5fec954824dcc53bc3883a7f571a9323dfdd2682c4a4c54e8862f347c9a8897779170b257ad26d90121dde722a3f214a44cf6c5a5ddb2452a2471ebe7fc8d0ef7f1edc7920cb42a71e4db49a0168d51843f47d17bade50dcb340e5f7b7e5b6a6c3afe0fb26b5ea172a4011eee838e5634e521483c6edbe9994b0658406ed8f4998c7b4e869845cd16cc4368da3bc1b025a6ffafbf540133c372d452dd831dcad39d61cced0a0ad193fa9886eac749001e3bead5a7962275fc62298a1bd054f4bd97acab2bbfdc355c73509d98b6de5b4cd774bdcaf1398532bb3db56524cc047abde6880c3b282fce0fb2ad7e4c5f7bc138b48d194e8c8036df4b9f3949e912afe5d2734662f27583193d0fba2b73c1a0d012db853bbbe4383f6c391f3220e1b5761c337a054fc9fdf09c01864b87324a90c776efbf5d34a68dee38ebaaccbb61b4c79a58cc848184f605d43cf9d40be90c1fbcf6735270132b59a636b16ed28111246270af32ea2cb7a42a084005aebb6161002e65b37217361bc269f5ed12f7d50613c82934a6d1d98d1308ac82827b7504f3fd351e0aca1c62843c9219023fd092692ba4b83be198ea", + "signing_randomness": "7d9a08d9689af9f8f89166e66d981740376a98d7d38c2ab0997050201319cd4d", + "sha3_256_hash_of_signature": "165b64d8e344bdf333584b14d20b59b39720540604ca1273339c320e6007ab60" + }, + { + "key_generation_seed": "ba2386ba92aa89049c64ecfe60fddbe136815d3874527414b63ed32215f2e06f", + "sha3_256_hash_of_verification_key": "17c2a3bc7d0d621926de8f811696e11865d2cfaaca1df6b00ed72c585ca3d557", + "sha3_256_hash_of_signing_key": "de225aac2513942ec4c81d74ca2db3e30dd914e51c649ebbb965b5c32431dfac", + "message": "eca4505d43235f274d902464f4e763312bd11060f908621a063409eb42faa6bb5e20facd87b8ff41767c20f69b1f7e05d5f3a957f48dea57dcc91824fa48da6ddbde7e3327a0a8d46a47606eda01e67cea1f29bdc5fba446de60541dbed6f73d1fc5f49bd77d45285d3d8ca93f6df25aeef9324bedb40e800acb49794ab05e6d0aeb11a5994fba36dabb9559cd93cf522174061c116cf31874a18c46689fb8c075079dfaf73ea0ea7faadd47ad8ef68c06af9738b41be771020fedb79ca3d0165427b58e547105fcf82a12b67579d1d3aab29968817068732cdbc5a2e9e8d55d17468d03f38d564f5ac6efe1538e4a680e9e15e35ab54d07b6b58ec9ea7815ccf29f4f880cbf1946f39556bdc2bbc78a5134fa7a086ddc146ad9d503a4ca837e0823bf0728453f6b053788c69eff8d11acdf5f07282a75cbd17f2aed58e39d862ff056df17178625234ca7e03d22aaafc4c07e3fb08f4297b511b10579934d2761fbb600c9454ac05fff80cfb93de3b9e0ddd0ab1e494de477da2b5635e48d5bed5ce359e66a3ac845826be2b4bbfa6d825373bb2a4e93aa417648d1cea755aa4978784d6d9489f6738b4da03faedc659408d9395c934af774749a498b1406522351f86838865f53cb0157247484fd37ea59ba72ff3226aff1eee353abd34ddd63fcc89387b947027e04a6f4ecca1ee5f6bd1ca758aa4f796fe839338164b58d8e5d71e6d5cdeef6b279ef15a7bad873b12f7c5b3e2817c37bf00802d2534d425d52d0bd5935bf8658e5bd39b5268cc45d0f27cee5a57300f497e77af5268970782030e6928281379cb14bb56d2acd963d189c078c7a60e98a782f9483ece7b4871a061277186a01e878087381704bd72c63c32cbf2470a561c22a5dd3a1988b7ed0d274182e1b075af277920b362d612dc7ed82057ebfe51a3ca5a9a9a45de015c460be6a48cf67c820813048a1cea0fc3d7307f802b4fb7e523e7c8555fa56dcf66237f176d3d973c47f55af93fc4bc92b98b7de89829b1471dff53b649cb03b719db58daf824daa2de570df6314dcaf5b705557f9d783559277a754f3cd5b783d5a577ebe4a065d320284b01f71540f1986bcd443cf4fd480dbe06ef7710387cb5185deacb5c2a612bca275950b8988f247c4b773d8983d87f47d60f5bf80e6e7baedeb14b5ffbc46893a81c63f99f511d3e24fa8f7b1ba66a7db0c1d9acc6b5010ad725bdc2282d8a24018c975c8b12ed3326f48194d4ff93ebf051204cd224ea39f27d63fe07cfd0162358b412dbfd4715ad049ee5a31638d3111af2db7952f3a973646612712a607ea35826249d14cbde4380d8bc986067b1cc27503449fb128767986a406585c3d40daca75c27bd36117d2487bae82cf639ed1fa016add279d109b8cdae59eb31e1f006cb7af000a267e8582e55375cf6f06d1a47be9bfa21c8428045b9df96808ad74d054820a4d0873257eb318a3dc9b6d9585d973e26d435345b4d699a952c3092eeddd975fb59474212080d03ec489c695f19cba4d1cab1ae8d2e2c730b06e657d33722d24222ff7b613b6e8608e8a6003e11c80239ff431b5d8fa52b84b867a581798833590524c7b84eaf6cda9ca94c5ab8ef55a1262eec5c37467807c89ff7d075606a3902e7247e9c6646839c18493584d33db65d6dfc0f23e68c9d13fd57faf4836c28926693dc3ee372de27a9d3e4ab4229425ef48cc410f1792a51c9f6fa5316a1d9a7c99979884ef350b4882f6045921ca88d4e44b435c69c1aac11660971c2a3f6480c79e6e146c0b5cd2371bf5e7486ad7d0be88d62a2ae8f0d73c17cbac86ff6bda55a880b182a5237498e9cb343a9cd82d7784b72473d222e688d13cb81b2908bba854b9624a11dbe8cee9c3825c1bfba476b4d23d0b0c325f1c498a65a3589ea8e8df8dd9030b279ede30443cf80367ceea4a122dc8329e5ad42491cf57ef47ae2b15f9c54120966b95acd727a4a2b686b00626bc808f43d82d20deebca79b074a7bff38d2531ab2f726ac7087236eb3fb4bec8a2d4207dc84c", + "signing_randomness": "d4eb2f8d476734c94dc74d41d4bef21b3b2d9830db37d326b43de0843e1bd51e", + "sha3_256_hash_of_signature": "5897ffd0bc1e98934e3aa016c880a28499efef12ff3e0be34a7567ba7fcae003" + }, + { + "key_generation_seed": "b4e1af25e8dc6934ba391a89984a358702bdd36838babebd982638703f20eef8", + "sha3_256_hash_of_verification_key": "e69a39a21e4fd3c3a7afa7dc2a38e8824045b268aca4414365228ad631a025b2", + "sha3_256_hash_of_signing_key": "6b175e89bf8e1522a3ee1a3c3f3354b54e4ea797db7880753dd86a743c22720f", + "message": "96e2865a0e602ea4e3c5657a7f761a6f771007989ff885261f5638c14c1bf80aade34cb956d2b5fa1ce38fde831423201d3692e8e6f40e68a68c085dbe3c4cd8e35394f74072f44de98a74e42c9176a86ac06bed8c0ca937db4c3bf92371106b7a68ea8fde1d1e082ccf522a397401ad0f8da6c82bf76eab8afe101c7ff023a0fcf015b40ada0073363e7cb25260c18662d651222a4ccf1b290ee6f7b111b9a963211d67d7674b499449f760352feeb9fb7265a5f2f7f20c0174802c7f48226d92620d3e009e85b104230c21ba2fb0012dac4bdf9fd184e09cb3e593eb1f3eeb418a8bf3173e6cb91fd8080c7e80dbe6730833a4a9f22c52716731c7cea4f70cde0f81d2d9aafb6b60820598a7f6aa1b963b7686528e6e7885ae085c3d26c4acbf9fc15080d972ca841175b343e59fed79ae3cb4dbb4f0d7d463bd3e0c4b2090139145b8d7db5db10abfa51dc909c5cf7809030d72a5090cdc765eecade2b365f719127548ca601ae0d21e402e18050acaed30ee13cddadacc9373a87a218787b585319a7e66fbb13851f7ad0d2bbc1efe6efe4f7ed248d844f58b6a5a21fa9295e0044982af6286de296550f72b5e416373f1dac006687ded1e7d40961e5177c207579f25e77be808a6ba33dce8a2a6f88e97ae98ecfbee5296d4a170e3574d9ba592a384cb0545bcfc32b3831c0b736ab77440722299f192dcad519523995f71f2983ba87aad2261e6e01c19dccae00f8d6914501d1ac3d4aff0c12fa125ecdca34dcdd8407f0045f8e8be0763e19eb007ed4dae36e30afb07f8daa7431b72f4a0a8017b3fde27123ac3e8ee575f8be310f68f81b696db1fe63ccb8d32b899b209b2205956d209bd6e48166bbb4372a607e83c47698db5ac8f9b40d05f38efc4a4a1309d999d5ce1e1a5828d56eda4666995897c8e6362d0b5054f04bccf79d03852d1003c80ccd55e9f4578d8bb2c8e220a4d7a4e2190024c85c718654ccf174ac96c1bc50ea49f961ee7697c88e6bb718679f1d1f1118376b31a4b8c0471f6d7aefc5ab426515d1b2cf0eae66246b3c4132a63c63d7e33eb9df8d8807215d58f46ee832ad3ec893d74e00c73510b9625f62d4eb5b500eecdbc7d088d3d318077a4a0f7d64adb13220232c08da75d23ca7b20cb109c972b7c159863991c32508339558b9383ddfe7e7dda740e5bed0ebd14ed300c634db01f359f81a7133669183eb187c17a2c8ab855bfce73e34a1f59adb0ec39ec0c7573ad3620a819333ee79d5e09cb8449f91923ef4c5e21549eb7f56075c014e1c3ad2805e682f07ba8aa265745cb600a460069678745fb9638f6709d62d2dad8defdd5a4d0c2ae7401292bd1da5f40d4cf5d59a403932ffb677237ad74691cae29fa31b955172efc5e83c225f2dc0430ab0c909a97bfb468ae182ecf91e9026de819f3440fbe69b9de26f812ff3f3ce8037f124ab368b1153c1cc127d140f754c525d4799e1a19d93b90460e6518f0b6936dc6310b7e9e6534b595e00225978214ee5aeb12a6f45b5c73fe86771818843ff7a6b88379c37165d9dad48affd6fbabd11b1fb90aa5a78918b317c5f9b2ced6b9647f130da9f91e1b1ceb84f6e1618248f06d654e159f71033072f1517064bd96a5c138402771abe7f39f53a798c2423b748eb7f310485d6376722e204fa33b9740e7fa68364289a677c5c78a19a7707d2549bf9329334478c64351fea1634388acd4be57e4abe9374a0e999b770cd81b1bf4a8ff300c297b116ceda1a4a1c1bd5a2275581a0589a46142139fc596a1406d16293076527cdf9aea2d0919f9678423b7d95b153dd1d9d62b72a12f6491a36604d19e7bb83c476d232769425557d3480623d40b7ac27c0f67d4ed5ca4d487be915a68352dcb03a3929a4bb795248ebe2fbe0612833d9305a0a31d195718bac193fc59b880042a7f61358104a919c7e7c210f02a856b8b1057dd8527fd4ae1ea81f9e1bf7c614ed8a312c95154873f86632cbd60c65176f13cac695bb4c23675331058397d6e96e4f9deeb859e3937553d94bede3c2b9a5ebf00964a49ab294bccee09e5a97381d2375941aa775a47f726e9", + "signing_randomness": "aadb9c7f9de8a127c541254c2b2b0108175d9b51c50b0547a980f235906bd895", + "sha3_256_hash_of_signature": "ee08c6fddb2c76326b9fc1fdcb523034c193ca1c0ef4bbc4caf2c309bcc48b03" + }, + { + "key_generation_seed": "a62875a3a6d305e120dc7975962552126cd844554857c2943872a4e524a6eeb5", + "sha3_256_hash_of_verification_key": "5a4815df3c49b45ccb607532b7d2891540f4a01e90d9378ac5c9ab9f8522bd90", + "sha3_256_hash_of_signing_key": "7664c97f41c410f865b9f02eb30d90124c4ad54b1a2b8e0ea591c265a0ad81f1", + "message": "047e2d484d798b3829ca6037d6c1588a2349de09c5ddfbec987652cfda01454ed791dbffa3d9da13a35230adbe1b39b042e3c70589658a03f75447c1cf3970dc10fe5a4a9e980f2a33b642b42e5e66e9ac4e7a56888fcd72913a79489b5b163bd37b8c3c8d242ffeb37d0c1ece21034be9e3685798c2ebc6b809defc02c6f0c2a3ad70ec0bad12d57add63ec3584ca98e680267fa514b34de4147c9d901b59914d49ce9e0f885855ed0ce7973f3307b675408f90b51c6a4d38a414d970eec989cc7900d7723e19acc4ef743f6d39eb1b563b8c13d42c0056b6c49732854925b606467f7bc662d17b924fc65e9c3cdc2ae73ff73040011a152b05ed7f96b2ff4cc39a22484af72812ef02b08ef4dcb64c8936e74549afdd5d876027fe2b431e61e52e8793888473f4c1e5c1bed2c4aef8e5e300a735b302474fc6f54869984f1a62dae29c7c9a0ccdecaa55fe137ba14b5c5c121e0c5eb33b035e01f3415529e0826b27498d7a71b0c086bacd140c02a5948aa54799d0dd0ffd384c7e68578247fa28d205b18adac94f7d3c8acb7daf71aee347b577d97ee8e7e865cf4fc1c16640ad1e9d0192aa13ae81a71118408e145b6121abb75b4bffd1d403057d4ad5cc730452475a7f067690bb81e81e17ba8dbc31059969b20d387ba59ca8ce499e59a65c8583f29cd539f4f75ddcc68c7bbbc43c849802d8347143e2fe78c1ab6d7ab6ba9917301c88386b294aac995c24ad680a8c3bdd7aebef21e84f5a1909a2d83a8dfe46a75f4b2b47614cd39bf3ca3460de9bb5c37eb7349a17ab32214d031ce927806fa394470f407673b0cdc3d9a7e3749f09ca895d464a4269682ce6ddcb8fa0ec2f05372c73dc3d06fa6f58090efbbc6d619a7a565d4efe441ad7e018a7f5e1384b88eb4506fc54e0ab0a8b9ee3641760ffc08f6bda78c12396473d1243baaf6ae10316213115441c0b65c7e475b4e1578d066a47d9c6e92fa32d0f2c365fd15f5a2e88a81691f039dc642ecedb6652d08acbe64625b46083ce758fa96c142eb34477e065aea04a45ff4fcc3e3d146acd7041f5f7e4c6b26c8205be7b66db46da55556ce02b48af55a4710bb28b8ce102cb15c1a4af59d9a17a2dda6e2d1e96987f6aa9f4216d8d5e5cbff7e2cb775e83a776063a4aaf937bf0ec84149ec1a7ee21f735d21625e85831b80dc11ebf04f30b13e3a7e4d4784c5f8c61c679e0b6863958f42ed31deaffb4c272a3731c1407445ca7673d225eb6509469dc6c1f0af43eb00f18b3a210aa57d51169f2a9fc251bb338ed4e9ddb19282dce871211d26482e13a8d533dee00d36ff5cea98dea72d9f0b32dc398a3d5537a3373058faaa3926c127a1ec739faf3d57cc1a05d578074a3a72c3f2b1692c2ba1f1ffed943e7bfcbf1e664c4f52f7bf8d86174ca8910c290c06804a7748db21008ac43e653d7fd7e0c982eda9356f68ddec26473956dff281f7b767010c57f4ad09a05063a6b3ce078dd32f3de1f40526c06a2d60e36e2c70502d5bebfd2f3bfcacf8720cde1657b9892406baa3df01e59313eb655b6a545331eba01bcdb9c99e4ad7fef7438ae8715fbe589a2f99cb9ca34b9610b3ce5be38fcf979240698174348417420aab069b8ad5f646f82958a136dc9f2f81e601056bb4ab5e10f4ebc4a00e18924c51d0fd104078471c6805c49d92c78c832ec3f10d8966e19add3d3b4516e12daf4f63fe6bbd228062db743d1f867800854f7bb7ffc2caa0d01a0bb683e368673a8e664bbaa17a8c0c04bcff05246f9c4f3020510a992ef26fd0933bbfde9d042862dffd33a6465f590a2287d8154777a89724fc3df9f2f1b1ed8765e7c7b761ca4781006822065703ade07a6e874e70928e1aba29ee490690d24f6e73d96b85fb53abfd1c1fde439279e08fa232043b2344b267cfe5901c60e7ca14b0c85edcfa2ab90f341821d2b4e25fe23129f2432db932f23b5957706a433b308fb918d1c8d81eeb399babe95e7229ad41f30460cf28671a4508b0bd1c61f48cdc23587bb9bdc6f565e76c86547cb71396661bec8c7fc2223751f765c91c45c674c36b49aedef3df2537f888904b507edcd89155d40cb81dda74376bc9cdcaff8a368f1086c99ede25526bc53f95f4017", + "signing_randomness": "84603efb642ef6f9acf327a4ce66eaecfe39dbfc124e3f73496c21f57996ebb7", + "sha3_256_hash_of_signature": "e9e9592041e57b1e6bdec6a8b55c31b0b77c79818f3523327751c86919c7a141" + }, + { + "key_generation_seed": "76ae71ded1f9e73af77a2feae4eef80f87414dfb7580fb4ae0325bff20d74a5d", + "sha3_256_hash_of_verification_key": "bbaba5b104df1e29135802cedcf4c7ae21de038e2facfb4273d12cbc5a7cf5e2", + "sha3_256_hash_of_signing_key": "13dc73a968379ce5cb4f0870e629cee05476ea0efd31d64a4be5a47d802d4ac8", + "message": "6a58aa820275a2f43d0f05dd0ee484af42b665ffb8f21db322abd256a5c753bc8ff6a2c71467922e09726655f1a7218e736752065c871221c0b9dee6a9d56b78a1c3b7357774396f6980226dca1f91ba828e06bbf324d5cce8d584d9d298261c7149899fc9f74d501e920f22aa34706a79213e35914dbf57b9642a42ef0d8226e31adf89d18c5f3163adecc79172c95650d764e3729edaa08c207d930c26df8ee1291c1cf889283b70af00c0489175f799273c837b281a5d1284e4447ed72598efae23b523274644da19bc0359ba59e5be9e5828ff587c335e136c1d789257864d2648ef9c03d1c4b9809dd07ceabd865254d3d8d597587d71e374fc2dde89c22c2330e8904f6b53f637348434a21aceab9892d5df8ff84cc58229782bed739bfb13448896f7b1064b499087f7547cfc0a49272c2a670a9431b1b5a07284b6749ef834510a3ec0c61a43d5d0eb48c8f487947c4fccefcc49deccb6111d617407c76a1b4a849c9a190310711b102f142f9e9cbb29f46447265e2c8ddb9174b780eb4a51003fb68483a265f2475d5bf6ece18af0cf31bf24cdd56583e777c4340086917b78068dfd380466f43d020e285ceed97a467db96bfaec22d80b4a6ec0dbb98cfc44436a41cadc85a90b214f00990d7b7010bbe4ac94809a0450c9abee5aa4037a44b0b4debd264120e762086b8d6f17afd37086c93a8a368be97e0f7546af16d731c21878063e38df3dcf3ade6dd2daa43c198f49b5d9ff5362333f29ec2f13cbb90dbe4e703edae9a4f7334a1c5ac60d5972c4af2ba61b63c93bf719854e615d16ba4f704c55260a8838679815fa59be08c4243cacc1a584cc1b4e777fcdc6e5a167c4cc9093749ace4836ae058be89cca3221a3f63f07089006e4c44e40653bf262945a640d8c2a24e7cc3529e4be76286c86ca2089cb8d4684508d1fab81eae7d8c731b65a22700bf9009a3190f5ed837ec22f9112383422027aed838f16a7740cf79ec101865d320e380d4aba745acc8eed376dc5b3aabe58debc35f8e983c92906aa2e3d8fbbe237325302e2a23cb1312ea7f532d64e79b9815996d28e0183eb728a37e19cb219987576c142f4b2f66ac6c7c77028ed59a8df27f78acd3910ddfceb88888b4a604e5d07ae1b53ea6df6ec2163ddc4bab422d2438ffa543b22441e50e4087fde4bee6d79d90a2f72548ddc41c5ae07dcc87666ea3c4b89a0b14afe03b585e7ca507e5f29997f2368b0c68c6ab6e344c082bd06ae922cd8089634918d9132df9cbd665a4149c59bf76b0e94f66481766fd79054aa80c02e0ae04a6e2be090582171b2a9af455cd9fc302ca9d1ec837ee26e0e4d0ac8f0692cb9abac979b58ca92e5194ebe46b520125bd0b3ed1ac2bd817d3510e33cfd17058f865dbc64e9b99352b6caf10f0a5a47449bf927a8eba06d34c80d77a0b00b88b25a4c8747aadbb11ba15adf9c959b05c4371cd8439fe5028e004a2e1d2f21190466fc7fd56e9ba0599a0eedd98246aeb4b85994787b7604cb52f5515b42c2fbd4b5e9e372a36cc4e66483dd884dfe42aaa5ee7fab200d8ec6e3556dde0f9e9c7346f9967f8f3cebe1e4d1cd8e6046e5e94bbc74ad3d51db0dc704f4a4025383f0391b9da37bca8ec59e807593a4f040fbb186607280967e5048cab92215dc783d9045f7a0922008628c771778661e97e9f88ea84bdaa8ba61126f71d193a2a564e3acde7adf2c0b3d5b022eb6e0c629782b0025c9079d4545d88aa2ba27d10c5dcbcfb7cf648939155066518878cc54a4f611aac21bd3a1ec628d3352f049915fca55234b9146ece5f78fbe7cffb35695363202edb9ec3501a93b4b6fc81b3dfdb5245feec8aa54195262c2467e15506b7d42a7ff61d75998722d0208bbfea05ce7d2e66900a9b34f44c2a21257c220c03f9d6d7f0312a36f5c12da20fb5290d5cfbc1dec7d05c44820885c479063ca88783c5aa128829417ec4dd41cf83a1d991df2efdfefe375e93f0371695e353ef737f4a75106211a5f70c82b4f360abcd078c9e829c82a6b7a36d22b8d1f6e3101ba009c759fc83999d52e29b387a8dc1658a43ec4c4d9330a4ed2138e035ebeae6343a76a82849e37141fce34e9a41eb5ef88bbb9257017ad8696c3847fd77ae103a082ed1a05de9420984c147aff927e1950244912079bdbe5cc07", + "signing_randomness": "9676de1c72b3c9aad4e68e465639a7e20862a243daff96802342dd24ceb53d23", + "sha3_256_hash_of_signature": "f428f2e3fd70d39011f3f8451058233bd604528f782cfcf6c5d14d769db912c3" + }, + { + "key_generation_seed": "a8f65be046001a6814f537915be3f03f3670e1169e4aaa6d7e726174acaec77c", + "sha3_256_hash_of_verification_key": "bcde9c05c5b9e449df233ad7af639849976e7f0fc58707d54b0175a77a758fe4", + "sha3_256_hash_of_signing_key": "5399fd108d7ae97ae2456bc455bb3a154958567978ca8555c1af1356fd92555f", + "message": "139ba17ed7b476dbb1cdfe3c42b3a57af5bbcb3be19ed04d6c3072fdfe917ecb9272d59ee89ef83522531d83aff8b9934a8423315c350d1481a4b02980dc29e1cb83b76623869649ac40ef297b153b679c327bb251c6e6bc169c48aba2a439f9ea24ef94656a415c3e86d7bcb43cb3717d54d773f1937dc8b0e02d4e6abbb1c83fe73f1b221c9a359e454c19de5e71ea4cb8c560eabf1da133ff20d81785d2ecd935b99f24840761446c324df81484c5c05045c0949df8d0f10f942e1b5b79074b358c25b6ec2b0b42df65d998b666cf1bc568e7d737f22ff541807be95ed85a9980e940e24d2c506bb0f9bee32effd85a2017de694f61bcc2b292595c97ff4c2145e48af8f0f3d71763b4db433ed7bdb8dbf8643475fb2b9155f0cc6a0048c5546900792bc01eba4b06c83a0c447ea0cf05410de55acb8e5521829c89bfbc084cd86e7ca3d701283b70f78e1ce9c3888ad2689e0ef5593d656285066f319e155f86c0a71256484f42a0c40e7cf13af0cf77c6d1cc7231a48538e9060a7863b774c9cc65e321e45aacc002c0170eddd18cc1424159d46bf99d08a28d2dea8917d28d91a1d6c409d945a5eea19413a1adca40de9458fa6bdf1e5308ef9e67e1e90e9d92bf19b5351fc49dff0a31e035038aaec651c0f20f276e4ef0ee35c14bb625eb34205516d95abeaa06a7a3bb3af2f12236406689bfab11e65fc63ebc5b944818dd1d53c0e7b88ce7aebae581d995ae7d8423778dfe20d6cea7ac0b1b4efe2b9d571de77bd8f71e89d9f6a2dc89103b73625887ab376bd12ce89a65e6280515a44a80d6c32799669260167da0a214ad0fb803930ab1952d93360b54433ce8220b29339dcf2702581e88952a5a1549dba11f4ccdb6fefd6d24522f3207796c8d5ba9d1582f888f2500964f2b975aed5d5af83409ff9720edcf5ce3fe9b6b586b08de21956e7970d8dc28f6208a80f5378ecbc506333a1d98c58eb0e2eb0cdece0f5d16a069ffd742d1e589f546c4f2ea3da0a56f984cfd93f5f2912fb1d068f2bd7c1b5e979abcc62e3a0164445398f5c0208e82b99aed1200d36289b1fdbbf03e43995341aed3ad712cc7c7530c751b40b765073ee4e4cdd411ae543ad5e2793f294320e9791ab35ae1697f23ebfa0280b8041859909b0089c101d7cc429408fabd2e073fca7f2c2886031e9f6a32f2b596a799967ba8a47e87dcc8854d45ddb6de39160600eb4235f4e3424d75ddc8ccf041aa05b25b5a3811540ea5b77cd8d7d611a63bef5c26d57475b28e961645aee0b9c8d47954faf634017787a21a671493e7c5f1a4c553e0a68ddd726db1ded4321dc735332fefdf2a84c22097ab3552f878e304598ec40eb349e1c1ae416f94112a2cf8e8702a4c3bde2f58245166550fc238e153d10f90652518b1d84ccd3ed836f150f1ff103976e743137da5a97a61276dfb0c11d071b240069582265a9cae4987b6c6b017dcd1594024d7b1336ff141e59936ec4ce5410e1b73ba6fb42d35f8999225cb1a135260967f4f6ef2172d53fa6ab6d1a2e3174b46c24bc103baf69c2128f093aeceebe8753eb352e2804ee64ae5140df1acdacd8f225b3c9a61264245b8e5cf759cddd75e25e2d790ffae8421515e0cd6f279d0080a3f80bb2e0729c0d2626b6ace31ce20bcda490c7660d04d1d82e6403000578926c52d8f9a4be7103d64e0f03e8f148bb2236781ec30f6d8bc827c107fcc40f26ddad485e6135bdc3bb331be139a07891717b692e23312d0e5b1c41f30c3b4b4700effb481a835ab54340269fff365ff87f58245621acfd83b7fcc6ff108132d8966f9836544354f7e216fbbb851f390dce8a72362f0454730b90d35ab3859763aee35668310fd501c7501f4599563006aaee9b636b676f3dbb6787317885b0f4a64171bf19cbf2ea7a625e1563032c196e1292d82c7484817dbf78d8e9e478fdc4c92cbef48d4cb4f0e6dcdca6682dc0a56c3e45ea0350d9ff88073748305fd7df3a3be8c055cb1c55167560d5c99345ba80c21ce791c4a511e384a02833b78e8aa02b1b877a9b8d806978519d716c611df54ae8ea2691540e87c6e79eb006569e02745021bdc7852e1fa4177e2c3ec89257618b38719cb07b0ba68f600236167f019694959c2ab6fb39d5890cb176f6acc3b9656e495c07027e3d4de781f48c1f1a8aa1b41449689e191e495ff3f263ddaaa8de0df6f1a4aa3ef1f5edfe437bb74ba", + "signing_randomness": "3400c994f2f97d69e54a48514146f45fc88597ba63fd836a6fd9a6f56da3f9de", + "sha3_256_hash_of_signature": "e480c31d9034701c4c8d65eadcbdf9194f12fd6c71476c5e5242a563aaa1b4da" + }, + { + "key_generation_seed": "802e08c14f6e3446bbf7f4666c8ddf7755dc718c3e02b7865ff33e9d8290abec", + "sha3_256_hash_of_verification_key": "9be24d827070decf1580f7abb3c6d40c656e19b918e5ef8d114f3c0d71a14866", + "sha3_256_hash_of_signing_key": "9be567ea881c9d606698d8d5bfcf41f850a434c9e746ef589ef04052362ef84e", + "message": "edd4da833528b0511534f77857ffd16eafb1a2ac87e6844612dbb104b9f32025b7f54e993d65ce85a061b6ac6d70a15bb42bbbbb6e2e21aea55bb8a556120eb15ef35fd9774fc7b5c2894b747d3e4965b77dd8d5b26f38d413662783dcd332765b4de534d08d6514ca9dc6ed7f2bdb4b5c437178710b04491708836cf2cca08f28582107d27ac305ede6030b1f8aadc4a1d29ad16cb4d739d8f813d47da715cad6b5cde24ea95dff4415b527dd900442d9ed1ca712c58b206d6e79f8aefb882013358bc578638225be79b58fb677277f072aebcf8ccd6ab61a9d98a3b260e60aa625d78058fae6028e4c5562a0f3473c3ad530bc4471228f27502a8f8fe2d1f72022103c3a2dea363e68248ed8693b3b066b495561cf4468e8ebf32b454e54df1766468ad3831d56ef7eb9c231e999c4cc3a6b0ebbf2c4f22820e256f67497427f53ad22d42c9293dc8682d0be3517b63c6e871910adbb3406b6b3b1cad980aae47bf9686e80b6e5df2daccceaf9506b4667271779d00b4c1065951e21f2acf6cf3cccb8a633d1114ce9d531d94420e4ae496086638f031c0baab5722a41a66788d3885efc7fe1c3db54bc69e35b7489a0237a37afe5194b5f424f792cc1d696098bcf327d87ebc50429a95ed82105c4328d0095a9775589fdb6c262fa51ffee4d99c6d1a68fa661d1b6a0a2e0693d73b39218a6895bd83fc1d54831b7df146fe7bd2a91b979018787b9904285a35922e22a7f1761bea541eaf21d74e3a2f3c6f2247b042379ca4c553fd9256dd0c63e4c9dea60912d02fbe4ce7762069a86cde02a4e1e311b2afde435da0816aca659bd8c0650c1f118c0ea3622d72a5e96132f8b0ff8458c757648bd46e58195faa0fc4ff8fa44238e35a25c9807b6229000ee560d8e085f27375c2f659baa5fde302b9529bf4699505c28de33ab5dc2b8c02967947cd24c6a599acb5c2d1e7d6bf3bccea0253fbe11d8043fed532aafc9ee1151243bb80b92be239bc4fd1d1caff502951205f2e6393b704e67141e1218963f664fe0759c15e6c0a1b40602a73990f040502867a9eddbd4db0e554aea4bb9597949d5fb32c2e3af92cf7816bedad5ede1b769c823cabdefca1d1b85213c79eb03e065146b58e3bfbe80b4d4683b65ad1e0611372729b99a0b93934d52dde40c19fed5a2b3dc3030e0b5f26b66474a5cca6d741ab294bbba6be516105c08bdbabc97bdec2141d035bf6c3a71553d6f6350229ca2626b8b0b56a24f2d6eece436ecb77a70d747b6a6f830578b4792de533879b174353424e7d0eadf6bd5a74b36a4e6ea7e39a4215559557bce7a00faaf0d1f81016f913a10f3c9f406c7cb53282ca8fd5fe4f5fabb96f891583e0507912ba02709764694296a5248c340a1b9ec3db0f926f438ca96fecd40c4ad8daed9b8a29691601835fe14283762236ef2135443307e5f0082d1c2180ae96ed0dd99a6e9172088e8b94aa2952ba5e128b202b2cbc1966e69b6e6384820d9ab624bc71788ea84b4adfcfaa2efa1ddaa8855d1db3f58eef2d54fe11a8a5d78ed46b58460e6f2fba6cb70640700a4520aa1a2a9b336aefb17cde8ac78d67f194662642a0107ce38b74d731380a72ad4a0a068f09e0878e521f15ce8134780c3fd0cab2dc2473448654f88bf1fe2020901b90c0ed670866b1bc337881292fba885fe2bfef6fe74765ca12372c8cbd698ac41a4c337374587db15affb511d8c224f1743498d7173897ff5b8d070b89592bebe053d5c10dce67ca8542781ae749f3a42fad7e4a2004a565f81d5faecf11115c270155fb8af6aeda138b9c71458d6d2ff63441130ee9107c39260469521e020d2b42cb5a51098027f23890dae8b28bf722af9aba6224e02feb47e40112ccb164e8cf174bc9ac4c11af9b482df9c9f7f5f1b826428c21be395eb1f07de511e8258c84f5f035f4787ace18c190808efe99fcb455a54d366dde2e230b575ed5a4a75d57c9a38dde3d91d0d1a1c4de7f277caf23e0c5dd8e3b693dbc66b6bf1679b0af74a2b9065b64cf0978115cc456af685b22d85135727a8aad96338611dc109b36c85a92e4a0180aadd1d25c5b3d4c681a44bacb953e50f994fcf5281366cdec0cc50976074d91840b5079180cf643184adcf9e4ccb44328e7bb9eb2bd06dbb7a757c35ec3dcf795a5e05ed250159ec453a1692426f624cc0737f691e475804f155e44293151e42d3c0f115ecee53c6eeef69788f7e8e5c422bb102237499f2638244c0c080b3639a49ffc1730ebb0cfd8a46", + "signing_randomness": "64d6c65c750512a619a02bf3e98cba9073ee368195f22185a236fb9e3f713131", + "sha3_256_hash_of_signature": "a85d177e379a5ae401d71f87bf71aa292885458abfebfb19b001407c7a6acdf0" + }, + { + "key_generation_seed": "23d7a85a824df3d904a511281a973c979f67f5bfaf3ab0546e85d0597f91120f", + "sha3_256_hash_of_verification_key": "9a26ab8e0d673fc14470a393d26ddfc30a3aae5822ff890078c15f645f22e0cf", + "sha3_256_hash_of_signing_key": "b89bc9320ad1fff262956dc11e3f05eb5ae0db7c45a49421a9048a2328e3f7c8", + "message": "d868ec985f946f3c31b6cfe4811ba530eacd0ed061ec383c203b2481ac697b8b88bc0f72b635027e443ab1f54478440de16e596d30a0f1252e0af54c0f382bbf5655bea8c6b9a2f6382d003cc7e4d4f223f8e35ec87cc543ead52e0e1ed956cfb32e8075715c07ca4817c4b8dace68c8b0da459271746be41d6102b3fa5e49aee8d443e78ad3246d0b9bccf6ab7cb7cf72b8a847ca16b435f0618594400037179441f3bf524231f747d920e86506e84c61d4d038d42e82d52d97abff896c1db1c646807156324f7b68db620ee435c7b8c9ac8b193b7c892565c3631e297495bd3b59293f9a9cea5e29e23a242b81dd05c8dc9dd669424573298c85870b109c7b593bf864b56895d81386466ca5cb6071005781fb214f1eae9672d0d16351a627a3faac49be4e13d552340328323cdcb4703bbe07c2a39d75d7737d5c1bd04355b8694432dfb7cb4f1901550c7d6f41080c0f6a2cc49d63a69243d137a78260c06e7a53aaf4f4b086e0220ebc5361a6a78c9b2ec09c2ea4ec45a41065b4b2daa866d9babd71c8e6cb378595f068edb258b2ad1f420b304e5924ebe273ad6d00684f75b6a31dc5290a37d0f9a848b1fc4a67dd9a4fb1f9b4c6cd45e87fab4a09129c9ab95c44703b75b54c9ef9e825928aca56527d79b338c5ac639d0265010f3c085d2b09aef0e4f55d080fb5ff79f13e8e4e8db020f4c095140d46a93f2e4811bfbc1393ec24f6b7ef31f13623df0360b1e335fc42098ca1efcd0306c5fecce942f6e299ac9ed81054fe452d3f63991da42d5680eef749c02fcba78db5f4f7c734c6b4d99af79711a0bab723c24364ac85700242878cca93465f286d5f7adad7f68f1d38cd6c6e0575a36f1e5521e420d348d947e745c2355fb5fb0f12dc6fb5e9435cf8e552c174a617151af8d5e7d469ad5cd741e16eb88ea6d7c5806b08571697d22a525c2e30dff608c921b955d2a990d9466829385de0a81875be564942ae740d15ac0af46a876426ebbe481738be19be06f174d975ae8dfb52a94af9a77e56267c0bb62169165ace155041406caf507146a02fb760629cc4c0e7d29108cb7c779455a3ef359bb6198ac75e16148998c16c9410dff2dae5f3c79da61d371992d4a151ba91dae8814c81eea4f78d23871326bafaa349c8eb57231b590f1ac13f599df5b39df36455f05e53cdc4d025410e8f8f8bb74854fefe0c4f790f58434309d36c1e7f3935d4f896368c91af95ec2df292ae3166b83976abd95089b05b461d4e9171cbb4747f3cd9bab04e5a3b98095754021229b4b820ebde63e463f2ee479fbfd83cacc61878773b129cd4b3e9afbaedb27c7fedec2f2d405b99933fe2c203d9949c567a7752aef8a7788d2375900e70315823daccd4f2a674196835c35ef813826b310346abb16b0145cd70fd0a04611ed5ad0b8ddfca6eba6b93445038c3dd23d3d15e8899f9c889af417e5662d538e466447e514a8897c21fe0be2ef18948b66eb04051c0bc961fa485422a66d649dfa86d4b3dd504a89919a9928ef96fd467713dccc1f19ee69ce3935f0416d9c5752b7dcf9272d2db86c3eb6f4897d94ddbef7c483fcc66232e535a8b0a5aa4bd443493fe539a32d433d9e89f7758db5b0606a96455b39f92aa788fbbe43cec8f1d36fea3adfd0353ea5532b49a7286381d985e018e6534005f605bf67ab4aaafdcc499ac0882fcd9d90bd88053cfdadaf466e536f2ffa7f18b3dc254e42fffc777e0339181473e2b7fc844b687eccc0eb543a54211084b1ec06b0d9eb0a0c96b88d6585f414873c13ef7002af2d47d5859a23d12a7d401ffd4bcf642db96c70fdad0cb03a6098437795bc9c7c6c804a26225eaa53f52747f01db4e62471a21dbc1ded9c4de2508812ab11f61f6364fcfeed445ffba549e45e641a80fb4b58ee20677c7d6cf0526dbf4e26d9e5afac5429b4474dffe709d09d766542d65e668d59c836bdfd0f78b846bc412f29da00291871d94bb5e6557d833c8db3d9beb37888c3a70684adc6b063fec3d847c42e0ce20e05482db165ffac5d1f2c661b9db6d19fb3e8909587351b25f2c225cb26bb137bc52d04ad8157f7d634f29a3623b4eb53b4ef9a78945280bca8c5e1882fae373eac69ea366e2f13a9fea75a6b7eb5cd4d9eb14f68a231bac780f84200146ce7795282952382e2393f0c2a99de830d3aa517dac4ac97f2aad3f7f8e3b49b22b078e3708c9cdd1b2a2a129656066c0030d747edd646384611d4eccc5b0b9df4852af7bfa94f6dd7584f6285ca2ea7ed3f8decb534e6d31d7165c609fd9ad235f5af8e4e8e58fd3d248d822c202", + "signing_randomness": "30747c584e1b97911f9c202a319429d5f6e417b80be60ac63c4592d8ad891316", + "sha3_256_hash_of_signature": "bad5e3384909302e17b042eab64fe555f78f03fecf89cc6b98668202ae661abc" + }, + { + "key_generation_seed": "771cbb7c9fbd9fc5db93e3e4de6c034e58be9bade93748c42297142124696234", + "sha3_256_hash_of_verification_key": "e8d5010c507e69d6d2672da0d3546fe608f02acd0df10aedc9d343fb265237a2", + "sha3_256_hash_of_signing_key": "b567b597ad159577a9bd75a71f5631804f22164ef19691bdeae8acfbe7c107b5", + "message": "4beaf8cc3a7c393932cd37a2cd8ed790f05e4038adf1287e2acdcc0bed9bdbf92ce44aae95caf4eb142b858e1421610eafc47de566182835bdacd4c836f19bd686d53c3834efd928487a2ab3402c2e3ab3af97aa802b05223ca6927722c3bd1fe3f8c20f93c3951f907314896cd21cb99306fd7e5b6176945c2898b10c1df62fbb2680752cabc8980b5a0430be39d34bb7de9544bcccbfabab709c11bfff5c958c8763d8d5830235b49ead26c834e63c3f3f2d6ba944fd2688f6350ec99daf4cccc42c6be1cb19dd46514d71cb6e887dba80edb580b27f1142a20ea0d497e0336d55f1ffd4bb3d4b3521f0a01c7bb09258971d1ed4a98ec052b24776623d7b9a83c818795e3989eaeba8c9142a97afce855cc6ac0aba15f0546684ab5c2f48b23bb72a88b6af2ba9c73881103cb6fa99e3b03119eab03bc3b9bc365efcd7b9f49a8bab6a34a00aa8f2c88d7bebba808bd97111ebb192d82ad244e18bca732fe6f72fde5bd533e4bccd3f50332dad3a4169ea85c324d165413f10888ac3b21b91de09fcbb9b636ed00faaa669abf6429b78c3c04f239722f31fb0b1a20cb1a6b553908070ac13521df66772a6036e6695cf66b9a90e2111e499bcbf5dcd19744f43deb943445248a5e84f168e7bfea2dc4e1d0a87fb4140eb7c72d2dfcc27923206054cec870888a79938dacbaacf1f122b22ab5c9701d777bcf9809cebc9b7aac52468134fc4a92c2baa9b8c0f6249130a50337f460a42cb5364a5e7408caef8d12ba6934ab645de9832818f9db71f5eb0b158de6a76619e75245b56020e1664d8faf1c1782de4a688d4055e07d842410600e9454e28676d44357853ffa7740200c91eafa16bca21d0006f47fe8159a733e0e91549df434ef316e1df9bb97da6a2c2e2f20a65b3c00041a903270cbb55ae2432aee25c71ce73bc2322ccb8e5bd0e24820616a890b0851d825d79411c14948dcdf48776d72565422056fe75765e50736c82f71270bbcf229a7b7a45dc88aadf4f84238c896dab889e16c17db7be551ab24873fda82f102d0fcfc139c9febe9fa99819cef0e2684dfc5c843a6d496d8a595d33c51e1fde9a84059c7bc596d32d53e2fe046f23fefa51d13f9c28e227f5e24429b851addbf578922aeb0c5a61bbb666d11d127ba45c9e6378c70d75643de776483582e034e81fae0a3f029c47fb192cfa018ce1f68261d77cfc9e05ef19438e47f3de9a68c8dc09d07b1bdc6ced69592623750f72ec2fb8c5ca981dfb84b4bf0734377ee9dd8ef5ddcd96f438d30ab78f402ebff2163d43345ee8ca119f3208e21aa3a2185de967b475b9abfbc86465275f9a634fc22015e94a298e9c204e9786cb1ff14a5e99f942d42ab5df51ad09654083df0259aa1c26a760ccfdf4a276600c5fd3a54f210b20731941eb48a79435f1f86c45f8181d9758a1835721b87d36c725878375febcb8d48ed2ce8892db50965753a98f4e7110281db40ed64dd8eb51ab9ce41042589152d8cd5876ff30536f8955172a7a8f5c3f5ffd22c9954903136f781f0574f45f909bdf1657fc1cdcb9c4689f41e462c8d39108b10d78b6892c8775fdeb139258f8130bd1d2a1c72b5026506409f9862aa8729b35c652074494feb84a553cefbeed19d6ee94758e800f5fcbcaec19b6a00f33eb237aaa6fc0b3a08c1d8829c180bf95e7d05f919a929933b7a032cd20ace82aa5a45e5b2fb09812f36974b5eda1b387feb13bd49ac374f821341282c8fe2fb0cc5c075356833ff8cc6b648729a4298ecd73bd0ec73957077ac65722d0be23c1536b8db7b0506dae47c0070564e7d7f9444f47b22c679eb8aca4826f974a42043863e498e5301ea162c4e96684acc5ca26ccd083541bc4c1d2fd690e51f07fb08337450a204b0f4f2c17785e037424fd6e78746764584d5f19255496df1e524bff0aac31bde9254429565278a39ece4627c023edf18bc21bb523d44efc259742dee9ff7159d5f700d957ccbb505a88c2037629402c2a322d17647e430777b184ff7b4e8d6b94724abc36a5ccfac08e2479e8310bcb7a617a25fac6efd10d0a07248f7d4597f14309b8064fe3bc4a4479f905e832210d49363d1e5d58176dec9abcc0c5132fd6eccead2b05b56c96ecbbeb0b803e43db2f982ad9efe1e2a49649ed8e42707970c93615d54a3e673559b996e48a3b73143ba0884e918888156ca78f793dff990fd721de0c0b7916a5ced736e31292c5af062d7ccd83fe653294fac8c50cf6ba37b37d5a9bfd1e3b92d1825c1be0795f9b257cdab91ce99c0c51bdfcd6c0ab5a3bc6e30f884ecb4f1f61a3259cd279205b2c21cddb196360061758e67b1c3724f5cb6311eb4fb92e6c0d71e6d1ea45", + "signing_randomness": "b1a71602133377b68a905d8f67b2199dc11b63ef8ec1ca9fa35e7f0fa859d14d", + "sha3_256_hash_of_signature": "cbb5769c923f33c57d0446a801e7c98f6540cba5ec67fdf47d27df0a959e5894" + }, + { + "key_generation_seed": "fa812d8cc3a9631a0239474eb93ad3a2a3480f2d973d3324228ef92a3b043163", + "sha3_256_hash_of_verification_key": "cbd7da56852255a94bc1ff7c838bd871fe5ec7294d87e2c80b0778566e3d51b2", + "sha3_256_hash_of_signing_key": "97d18b1544fb3885ae77fcda278eaeb303f8e898e2ff65f470c9c432805a6063", + "message": "0bf9a7c0f63cdcf3f850ed7c5db6191eeefe29e498a19f9d89be4698821abd72edc34317b4f8ec2736dc83c24ac195bd55aff00e797a83dffadc7970fe53304f16f5dd92e6ec362b9e283e41ebf121fb2fa2a3f60124ef3ebf836ae51fdd55ca9f59b085ddd660724c072b86041b50a3a446cdb20a45ba65380adf007e005df2d9aa16a9d22b11dcf6f0b1964f04f45441a923691a15d80dc85003b9ae281f2b5983dd1a04d80a4d9c4372d9820bbfae3af7735e7c71e9f085c0a6e4bc107d9e4ba222b38fb236b2cc3a19dd6067beac460383ff2bcc771a7f1aaf092fc72c292fc1d5c6fc6b9715f1e1272eb22f8e0b33a2830e31bd6c531677902f6a95cabc3e9c1ae36f77037a785fea355137a581fc14e6bd5f1f7ad1a5dd19dedd448b47b558c22dd0fcbf296a812a726e7d1b57f4688d3f577104cfb15fc63c27f7b6051c7aed7d645186fca63ad9c2d68bff442466eff76bcf0e398d2bf54c2ca4cc614839e9bca48ab2cc53865803710a98d313aff1ddd06a65680eb83c640052db807eb2f38ed0cc211128044d331fec3e6b0b2f3b675c631fdade62c16d1719278413ea3f8e54ba34ede7e73f3d94802d2f9cb9794d257c46679a3f00015945903190b97071f8fb55f8696253aa3f39b3fad344fb88224f5313b43889b768171895f7aabeff25e21e525ea01a996c764a3acf12bffed08f3f751f5cc094b50b325f8b62c7a5b3256964d48543690538e634e5730354358534b65eddd44a526bb4b15e2042b6210f503eee06d00d615ccad10d73cdcbf5264b526674d85c0ed31ba5ee584f21fe6d13f883ace4b094768865e43099e54671240e8e2af8a7d7d22335b3974ce860e7238a7c1ca8a009eb51c8636f0659189ac8ef01c871e9008957cece0a367b63bd2852bde8690bd74c6d956435d0ab82f94a90cd00fc840dfc7036b84d51f1ff5076ca0974db6cf25af42ef7dc8c30c2b04ceb2510e86ffc510bf4c931639478fd1520ad571fa17958ccf8e37f5f6360030300ede3a33871e9582808bda2233996c5005fd0c23d99261f570ad9027767f6fc96d18ba98e8ddfc2b79ac12cda5f2367b4bb6b99a3e07b59882e49a92aece85339bbb18ab9644d20a3b2a795240492ce4eaf09d9ef728fb82b1de7b64b5d391251ffb0699335ced8c7ce642ff1a79f04c3ea0dc37ea101188361afad236eb218cfbd1d0ebd784ce27dcba0266ddeb87b59b66a4f75bb44665643fa358dd3d0b69b49f45a752b5c410e2299a62be4b57b32b0924a069a8e8c15d754cc34debb0d967e70693a6ffa58cf7099c2c2458b437c7b205cc7e815f6cb494080f9eaf3017e5ff918558dde415ff72e954ebc2ed4c20c8ece38cc916060d22e582d54f74c6c181c2601400110a683f4a365e45ff1387bce4e152a740136bb762b03a99fb68f6ab42620b2e3c00fa8d150944230a6330409b27e4aad1693e2c3dd12216c4e2ddbc5e9cba68b8b5417a7b2edae7eb67d25f4edecbb087f93dc9c927c33076b1c71a2b83b33870d602562ed378805a690dd2a427d86c2c46ba4741f3defeb91a05eace975c836e52868cffe52ca92f97de94768161a3e953bab6a28016782909ec53c02f35184aa9ccbd5b793b525204b72deb63e104376893b9452c3f2c492f423cbef1ec87c85788cf3073ffbbcd67ff79bd038672943ae4bc68da131dba8d7b41c83b4e9cfb6931987b270c74919bbd40612f823114e4bb148671f1aa62bd2bdfcc8b0b24010ec112e883aec9746d0f5de467addaf51f8c070a359108b1f91643071438f098233ad9a94d0faa665a39291a98d14a861905ecde4755d00e690429c57580dcb6d51bb6186ce72ebb1fa8413892cafb8713e89775013e546fda30aeb8af9f7155c08b25810c80ccaa5e700c124cff59fa32e0293adadbcc7b1a99f67e66b28da614c5a4ccd706afd05388c65ebce07a543d3dc1e5a5d1f307f675728d4c629a04e9e455b4da35236c677f26edc622c1fbf29568d509ea0690af4cb5dbb4e418b6162888e43b458774a31324bfd5ee8d2152e4ad43a3007d7d4af5fda172c2779837ad3a09e135de953ce966727a7183bf77adfc76430666b526692991d3c9db5bb377552a7801c548aa63f6931d3ee91b875cdbcbb7441a4ff81f86762332d7192fbc2f7b69a58db6ccd3558047f1940a1cacd6fa28a000b9795a2860394bf05f0120e6d85f96b1fe9de14e3ed66a31d747924b6ff2620778e0714aeb34b79a5d935a0306e55c36506a292c5dc568403551907e49a43a6263d2915108916f1e27cf3529d1b7bd1544af83a7cbe58547f192a93ce5c5bc6d652405ffcb95345f522b2d34e8ee0960bb85537a46121bd9a408d283a125eaa745bbab04e2231c19ae95e13901c69e5c9c4d70b104478f4a70d64f81269a8", + "signing_randomness": "331c19cae713f365f5d17110bdb0a1d64b2ee06e58693c60a02556bf4e53a580", + "sha3_256_hash_of_signature": "78018850dee985f16bc971ed19fc5cd20f3e3f2d1093ab709b8d6e2f7970a9b5" + }, + { + "key_generation_seed": "c660b84d558a7e6b4eac47c7b62135668e0ef0fbf74d514eaa3d0d428014282a", + "sha3_256_hash_of_verification_key": "bb4b91db60249a657553f18a13ce9f41c6840ac25b6328f3a38397cff4605a42", + "sha3_256_hash_of_signing_key": "33887036585ee0b590f4a982dfe52a1d94408fa96e3a739d30b930335758899e", + "message": "dbfc582ae98d8fd326fae96a1849efe729a1173339d90c48c3a2b867135f1dff5b497d05fd55130694b5f9c62d136647d767ae682a0f05c670ceecc03475ffd39e0bd4e45b720d9d7e8dd04e69c969627682ad83f48609f6e66d0be99064988e4654e3913b7caf1475622e211bc247b98e5baba1b804e2bf651713197d8a610cc111ba5fd98a053408ad155dcb756d28a283bf3b20e6f3785dd5f105f8d7d9f2956064860b097c675630edee1f17e2eb0b26b6c20e260f9a5915d63f1be2c74fb0b37013244481a2d0c581c4ee12516e0fd4701e9835c8526a490cb39e99fae07c40236808f9605a63a5106c19517c3711ca4b9e8eddc77b242575d904dbe64223cf14a8e39feeda9d6c5f9cd0d0719a7eb5efa71453636f78cab8262636ff1e136c787e38a43faf02699c1f260ec45b068edbeebbb8a0e08ce282bf47d27a33216856f0c59e743deb13397656ff17fc4b3c694b189c35e516be719cda6542260d1301df93a5d93ee118f7cb0ac94d0364c9ea66718a4bc7f3d7acffa60afb7100f7d97e98dffe167d1d8e46c912d41ea057362c13b078cb1d9c443c1a57ac18c4566f5f5388f47a40ca49cdaaf34bd4c9a597ffbf7ab20d7ce88dd76a639e09ada323c588b08140e9350268c1ff76079093a05ccf5e1613a70e6e37cd257875049a767332e5f7420f319f9ac78f97c0c4fa40b1eef8c8b48045c78f73584590fe41f9f274dea838de75dade66d04e9d9308cb0a9948320d28d9ca8f1f51e39ff3de20fd5a2a267d127c317acd51fb779e597a8dc7359d920548b8bcad761c6b8012304e12628a2652d12a8161e538c20d582bf567e9c2b46b4cfe2d2da31120c6df50df45c80513aa9eee9f2613a221aa1d23f861c7f26aac7813b7ed7278eb420a5c44f2a5879a2f1f9f11e14602762e3389b152c014ea9ddc9ddde9ed1d6f74e7526f690ef37e71d448342c012e032c00e480a699ade617434c12da0e69139d0d9036743b9e2b9134b5086fcb96b193330ace8e4f77148ad0f532e72e1792795080b54d7172fb9af1972d00ae24d0b3d86528675b3bc8c7b80598d855b95a77667ad0f671f00039c08cc99f5644bb006ba9356b9c02bc935212c43490c741b0845cd7b4247592374aeaa1b589e670ac62777293870963b5132dcc27088f5da5b831fa570766fa81c2a07b88bbd45b81992edfd2a7fe934219b1f648dd8a414fa03eafcd39e72bdf7d4f6b9c1f31a0a67df03f6709f2be0e7d1b1690c92ce7b8c6b1054270d796b16d6e445d24cb11229cb0f92dd81190a37838951ad28be2aeee6c5f63da60a911ae0a24b1d05ef2f814fb30aae8ca3bd9f01d4fabe5b279142af948b0e6bbccf7560107c161c816a0d8e61dd908445079baafb78c14f68b8b2bb241fb03c237a4cb250911142d0b460acc75e6b0f58bf28546a4779ea7342238826f636a510cc9cffee8bb0292a58a07694c05672b560b26158a8566d01d0eea0773e81f3f84376b29ce375fc56a0689a7ca5ce94b91814b62cbb61ea2efca0ce6712a941d612b0f700c56b46d464c2aaab3f64a89caa8561a1dab2869d79da1720274d031946c4c7715fb9c243dc95cca7aecff55eba4044467eb922e93f57e3e39b93876a03936dffdd2af48d055c6c188f2f229812ec94f3fbdf7d7db62e4274dc91718710eec2ce034aef266207c5ccba21552d6fb8ddbee8e931067010594a9e0cb37250f67281c0a369965367424d454cdd05d3c8f35a15f76b4c8c3fee42f4c9cad68849837ded3be58730b94ae3a5f9146f90e03b4c0836381b3f9ccb5de6bd2455d241be9132eb6d4937ff27663f4cadaa9cda193919f4cb0d0f727f6c7b26e831c3ac8decc234d79d1b3bd28305e3012a3733ad718fdab7dd1a6400bc47f47d20f627d2449dbff10e37a62299e22e408a28a806d403cbee19aff6fa9b1814b35b9573adc86f829a08893cfae4a0212293447d3086e21bba28049f3ed383519917b169e8a1b7dd64cefe0da643a97950a205cbff6bd9334180556e84199f0b60738715cd69aad7c882430578f6fba4579d908f863ca54d0b9862eea6abed31301d183cf465b1a256cbd597a629307a8a890f11c23dbff895b932e9cd2f5f06a4183d6f2d61117126fcd2ce2b86bb44a9a5b402e3eedbe4ed1df11716e91a2302cb72d8f0dae132e16311c80dca041694af1ef63f659959fcaa133d9e5668f94d0489311af3bad379de17793bb3ee8a284529a72cdec474b3a82d92c6cb21c63017f262e0d7dd47aa5c58f5e23f8a37f00d5438717f05bb974f18a5d3e1ca054ea053c30b34fbfaee88bc0195f061ac32f5b71b2a8a3ed4b8bc4edab40a6396c052dce72e10768526c00610e96df38aa70938cf844cf445d8e2bf73c4f32a742812d8c1db53afc6b6c0a4bc67c3cf7579702312d6c89bf14e9585d2c624d07feb4b5b57f8e4c5cfda69a5e922cc1e9", + "signing_randomness": "ac6e80765afc5d0d647b5e4472b83b585f3a173155d444a4996545ad84e11fd2", + "sha3_256_hash_of_signature": "d88bb1115906218f670b09b0c2ded05d427924431d70f383c10487e91cfdfc81" + }, + { + "key_generation_seed": "929f309ab3f90cdd9c21eb77a7ca762ca3afcacbfe3e67b056290835694ba3d8", + "sha3_256_hash_of_verification_key": "f64c1aaaccf3f7afc95af660a7df9705ab165960f0e3c8fc205d83b5c50ee725", + "sha3_256_hash_of_signing_key": "a24ff8637a69b8c0016f5206f08deb5de1909e02fe0c2713f1b5da862e3679e9", + "message": "6103e5b22f934203b5ca87337095c9a19267afb9695d309beb8a557bb7cc90332c4a03e1d416d397b945b607268f545928104cffd71b02864e010b666cfcb68b762fa5ec839b5aefd0407419441b38e6d881bd5218df73c675df101bf2c53d90ff86d4a3c7db19ec9cac044e0467a36337aaeec32217faf86cbd7bc2b663421754cff1200a8a66e18f812868bc8d1c8ca495e6462da4b8b96d4167f040f04927a7c27ad35cf174d42684ed55ac80d14cbe4cc2570642ddec4f44880d967e9af77ee27d0d3dbaec9067fb6fc957ac4a136c1d564e17f59ac4938d43fb9050d810989907125c47fcea6c162c723e79f68339cd1b3bf596988bd6e215271385cd50616868c6bf40fdc34bd30e5a00773e2c039723f2ac3a3fa45f4ce870841762d7435bd6ccc5fd3d58fe059ee455a806fde89155c84797fbb73691a1fc6921859e99066a3239e31f28d1a46100db1917621d9e61473cf1e71f9850b584b459d5690941e676a7dd56796313ed9abdbe03dc75afc1430dba27fe0f8df48ef7c339f462af1a6d30a5f8b480dfbbe860c4c0bc136393c8fa0875af454273c3cfdba7eea44eef1a4060136948cd98b9d2c19aea4934f3455f31dd15be6545134f17a195b6bc409159c0975e592a15e86ca4943ccacf4b46719a072db8c629b67768f1956f8158f179a0b645320489dee404c8d0c4e786cff39b324053f102c118e7d51173cec0fdd017f213b2b07ac6b2c7dec04172dd5396a020edfb74ed86fc31952d241a7c3d139def543d90976aa70599792e73cf73ad0bd4a359bf60dfb2ce96a784d8de5e23a95e831ca6ffba6b187bc5f29a7757185ec06ac882572ec6283a1875b54fe4f295e1970bf311dbabaf9f894d3364d68f529c4ef9030ab934bcb09459d5aac61919946fd28df1ac85876f979e8b8528e9bbe69f03deef136eea6a8fc86f31bd64285c8c9f49adf53a8baa7867ce52e72dc4a63929df3ba2662dc77d71f88d8af42b8d67ad54884ee11f5a6b3b794f7d5610909b0b740937587cf475da903159994a262b6f32a3d1723fdaae65e636b71cb0ef0a744f359bf08ac8231ed2970ce8c451266f703da3b57f85aceed4c1c174c50d9c226f028e972ac124faa6f60518699cb4c499220ea51a538f9ede67d0e98e1bf8fb4b24b1d8ef50a28a93e20076f8fb812cdab04871d331ff434ba66dd4577b18dc3f471b3e96a174b58a7ac2470eb8463a71ffcba2d064470fd2d4e15f9491db09df3e3ba376a3ddcc437312be5848db3b9079f2ae046798473bb970d725e1d7c6fdf405ae387dd7cc1735a7fc27d1a476592a514b87c9017e1e5d37e338f37916f3c72c5f2af75185b88694d4e8e0a93fbf20ce81a7a0c10d55737b6473fbd92bbb39febc6167336beb9c235997796b9c0dc18c353e80305175bb412acc29e647813d0003f727ed0577a7c14bcf67173da569320e887bdc8f5ad27fd8864261e802a6753c6f9bac844b5900ed0d4274c0e6ede42367079188b10bed5999501164fa4c5a818ed6ee229c3e0e0f7804b19eaf5d1132be1d7fc18be834c842b21f8ddb11f8cfaac10d2e124981ed698ee7caca211c5624f09c62e1d451429048b55ed0f8a714bb77a0d4b40f0a446eddfb27602b7bf894805c4aad9252658f6b21a05dc0cf6a3acdc227fa867a4e5b1db63a14de26a79aacf1900a7b7d867c15cfd1daa712f2a1e2a6c7b31b121465539cd0164e3ccf79a978b543ae9602996448c6f68069d044fc958911ef40b0b9afc78ed014d94571f6771ea5e2306a7cac32c135fec0bbf1dca3cb0b57daa239c01671718017c907048e0d19515cbf430d4b3b4ff4fc9a391d15a38b39c4e528fac04ebd3dc69144c98afa75102d21ff961bad2e1f25562af92554814405c4ec08dae4a0cd28be592c9c9bf997cc0fe31502dd541000d4640d59654d26ca2a17ba4cab0518ee097c05b2984ffc56e8182368e216768e0d07e17fb64003e95194d04c6e00e08386084febb6cbc841e8f3fe2a069c45554bc502c27591ca3c1dc9e6b1694ba2c1bc0713c1cf738db22ffeeb7443d72d5bdb975d192976a58ab33db58f5dae497a0b24011e15e3256ff124dd99af6fc300d1fecdcee18dd4fbf25e901125d4e80efa8e2a211701b74fd992e63376996994e054cc00e7e1de7db8e7d2898a735ec4920dbefaaea66b456cf6a12324c5d56762313a627b3523ab1e2c1c82e4fbab136ae4395fcf2672a58011d96bbdcf2a7478305756d66b30a4ac44e48b18a5964aa89f14187ea114084d52b4ba77755ba04c34777409bdb782b7b645e93b4db284525e2f9c9c38d73b475dde2251277a2e6c3183d5dea78414e22cc8fb4b2c7efa797cd4a87ac81d3242ec8d2c2efd6bcfd69c39f14b0b365f3151a96f75454a3a1400c76a4390fe9f2e7a22a0cfa687a5bef1c905d3a893b0dfd35bda184f25e62fddc2a52b6a67e76f550abe4cc8d1d63cc8631e4cc315e46d3015c3b8636b92b8d07075d401c654fb4a", + "signing_randomness": "3ca92fcac81ba5d5e4679e71084f56b85c718cef79cba304573a15ae9d814944", + "sha3_256_hash_of_signature": "5bc39855081e5d520675aa02fa0459df9eb9f77a57c7828cc6522b5339d10889" + }, + { + "key_generation_seed": "dae1eba78ad1568590348088aae88c1abeb59626ef65991cd76ab81198e52837", + "sha3_256_hash_of_verification_key": "2fd7e34229febc2eadeb77fffe8f4e17701b993062fbe63360b471d10a979abb", + "sha3_256_hash_of_signing_key": "3345a35d3c37a7b43e5fcf807b67e07ace99258d5e87ac6396532726001499f1", + "message": "3eac87b3d642ceaa3dc904ac3c4245cb2a260e4b74d0394d33d4b71024144180a727f80b092305f31b2526998edf6f98e46933fdaf0e8709e98d54f13c2701c58bbe35292fd3334c5e03d345a9a2ea1e01b2c4573567ff1ff3ba7406a16f5a5805edd760ac78a3ab8602e415f67c7cea5b36421c79f83cbb14fa775448a832a4b28851ce215c11dcbaee652cdd7342b6b1204727479e6208fb556cf08bf7ee230f32659e829ce4fbce0955d01d36624bbac18c1d25a3e187722f8f74c88b56e518cf0e78b3b0eac56d8f13c4afc4da3613a41ccc2b0b0e2ebbfe5799e479f81335360d483596e9ae926751ec9b956555f271c2ccd85f0f6c1bbb2c326c29b5ddf6b5c4c11f8eed15c0143993feb626543e92ce4d66c0bd28c79ed1ecb793a3091d6b9ab510b0d41aa42d70c2d8f26ea0b826c8c375e1dd89b3e2a48fe5d88a462deac33bac35aa32ebc010af7e47b77ad23653d747760914e0ca12864cd401787efd96f30d82d8907dc68578067703dd19b2377df319eb540e8ae78b2be86bee1c915ff3b2f4b25c0ac22ccf89bd85371961944d8a4e6d20e2d3e9df3a07d3bf6986898786f0667545275fac3eb0f069b457d8ebbe5f60125f94756db04ea203451a0de160cbce2a34650d92f200448b097691a61361ac487fbc3c82b2bd7c1acca02031311971c3cf69ba459a0b640a702db4467973713a6f2466560ffac0592d64ff1d4a935220826eb559cfe0144ea4b8e54eaf67ddf91988dd4b3749c865008c0c1cf98bbf76d929b85c8c426c15fa56706984e0f2e90658fa3cc33ec9fc700976870c94035ecf9a0534b18d07f55923663835416e40235cc2550bd9822f0912cf101f86039830ad9102aa4a3b6777edec5ebe621082fcf81a1c6a528f0324ec9d39fa80b6e87d6366e7edaa0e14337d6708f7c3d2fb1978f4f5cd594fd35b267f9cd09370d3366dce286ccb9647a1944f8d8be63e5ef8f6108cc5e9afe9127da84e1913439ec35a4e17f7782df042dc2f7c5cad8a659db282e61763539b56c2afa0f2b507d549ec8c9e76c7db306380cd7b46c9699b6db8be06cca15e8e83763137b06bff02de2738a46c61b70edf4f394d54d0453dabf689fb6ba41616bc589cb9847224e74f919b6e03672ec6a52584fe81456d6e648dd6f0f9b068eb72241f067bf6b891a498a9a59356c735e10efb37b3ecf47cc5620a35442dd81e25d2c6db0e9e871301add193d628b30e3b4345751bc17e0b5b05af758a653de7bed3763303ffe1af05e407f296c736ca6f4c348b25718c7a814bd0730affc057842af3d9b9adb12fccd740add16218aa57e43835821a2bcd70f1027f3042d4a92f10d0a1fb8323e87869bfa8da24da75f8743fa3038c24fedc0c987065421bf4b300be3ed3f6d6d590968d3ee32a8f5e20ea6168756aa18bb78b6aa48c299c36d0e78b6f84cacab5946c69179e461f4c2dd201d8032a29ec6c52942ac37d9c76ab4a401c9aff96284e1e9e39bff6d912ca33b6118067605ea65d7f611dd963f4f75f97346fffd1df84c79ccba06804b3017775d8c0bf614fcf4d824709557937b22e1805a0a961ecf226f26e3706362bf6d8d1dd30be7eeda481a64961641dc57b9f0211f8ee43578e4c2b6507114dfff3c3f884586bfd1278d117f7c6014fd5980cdf1e2fd1f34ccad170842b9e819c22fab9890ae265c3bb6946fccfe218544d00a6ba5bef5224eae24002b6e83e0b35e98c2322be2eb3d8234be8b048c54e40782c9a24d7a8b461ec05f38a94aaef3da3b46d0d85b0d949cf1089408189ff97c56c7dee50a004aead82c15c7c0d0965f3c65a9a715a65d29cd3614954ebd91eeb4e74f862fbc944c56f2edec4d344f92e8154708ad0f5575880503ef0f107a9a9db99bae82357c16578f3e6cbdf9b427da88dc322d11c6ab2a6ae6f5179c94454e09df5caa6a519a4c1903c8f2925639e12af793695f256bf0e55e0d45b73880358f09719ed89a4a1a07868bfbf16095a20035d5d4f99fda19ddae3e21cb98308f4508b5cee706c27898f03a2bf14f29acbf055e4ab0713a7b6fc1a7853efd36e1290e69587fec15d492a66b9a4fea6e2bcde61e02fe18e06f59a2f4e06f177b14ce4c1cf1a8d1f49c554a8a4c68b9937b4c230320c80753d4b071bab2deda89c9181820336f1e766e447ea1c44e15cbb7c002c1813d2c1726db0e4de289466077da9610e5f3aa313b1b01dd79a4056a8bbe9d843ce5b0439325ffdfe91fdaddec6cb86d5cebb68d8f9c0ed237a4648c412780acff48fd9ce817ea70d950dcb989ea6b11fd87ea4f30347a27488c5c15be7fd6d1280fea3a7c022f8d9881fac93176db2025b4c7914a51099893a791bf5be851f325347484ca6ed51b2ba71548a6046ea7ec85b31a9967e7d119d2ca3a51c1e14d5a3eef0d41bdd615da01d45979007a1997de281bc340c3203d5bc0075b1aa38873a9dbb9d18e6e26971e70b54e41e2c8c91d2e60fbf85435c1ebc4893c45a201b1d2391549f52a1ca3e0440adfb746fbbf0d9933f9fa0220b3e04ebebb29d2a9ac1", + "signing_randomness": "539bafd63015b77a86a4569148f6c9b750d236b1bf8893bd23b56651c47b2b24", + "sha3_256_hash_of_signature": "7b6e0be4957c32177ae1a79ebe9f36b5ea732956afd7bf7692fc0feca015b700" + }, + { + "key_generation_seed": "15ed428927a7eb0c7c2dc7a98cfbb77bdd773fa8747b8232a6ec4b87cd7dbce1", + "sha3_256_hash_of_verification_key": "bcd8fb2ae527505aa9a2e8a96a5b11e0fe8cc11c3df38d3decedee61c1f5f376", + "sha3_256_hash_of_signing_key": "31af63268b3c202798124df5833740f45929f69c7a71308dd778bade15bf6a3d", + "message": "baa4a41e4b68fe333ffa5ee97fd3de18f0eece8eb83e46a8e3505e2ef8aea2c4040ba3809a764b681ec7449f41a2463651a8cc6def0e4a058eb843ef016e5cba8d55f925e66524be55cb98fc3169082e52e0d6cc3600c4e8a560b6d448a72ccc95620101323f98b43e28d6357414185ecb0263c7bb94e7f86146661fc897844cf52873114d39123260893def13516f982783b927864b61b56d3a8e5b4705da3a95f6d12a6637c9ced02f07b4aa0b08b4924103036c2a93b31c91ebb6c5b77de090ebf60a04191eb6ce9cc9b550f5b0c9104b74d15358854181c0c5640fc74caee14fed6577fd75eeca14070b6d02a9a421247a5bb262d6e62b04649e75bbd3ed8e72752289fa7c1a68096dd96a4bac8a2dc27c44881dd2416387d74a005680a3d229d562d3daaf8dc37b4c87cc86a8c991e9327cdd43ba930cdd8d1e44aefb084b51111965c5dfb0ee2f09112b070cbfc545119aba823eb3f65f26bcc025b39f79be42c0396c5fc9fc924ef1b7ee9ddb71b6e69b579c0a64c5b020206cd3515b8d5f4ff29378b9580d282f7e5eceeb5ce9c09a7b334e62151100cd658dfffa66f4091231bea6c9de8129ec4f5fbe8be0ff4bc93367dc69d9e38c177b23afba5c27fee3e2b73c0037dd7c419c854df7c2412349bab43869469e80527c3ad3a7103152f9e0b03353a596002ff54aba8b14ac393ee52eb5564d63bc2738d571fa3c255abd20102bb299441b00eb988f3a5cfb238ef8c49963b4ae8877e6b317e208821510bf446ce6b06c33717c91c460924248382159198f09d0f5a25c1611b2d39cc6d2ed149fdf0e09a0b0b2bb77067182e386f5f6a55b68808dad98e5ceb0fdfae6a0315845acc7b9c172b0e82190a5eb7c58de4f86d883292a883045c62d6a1b3c886c345aa6158276efa6b93ab2188e47abdd25d332146e980e1b1e043cf63ee35a5aa01ab6cc62f77699dca16fa30e3632dc5ccd3253d01e547746c78021ac307f0ef1a0119ad11504803edad933150981c4d9fd181835c507651dc92a86737e3afd0eb4ddef6182872fbd31bfc6d8427c2f4d3a39bcbe6b5120b8cf2af5dc59949c92d10b1c6a96810564dd335e0755f9de25ec26c102355688c38250df8f96e105136855c8de4bdcd86df03f92977da16908caeeb4056f4a5f751a57ba057ac0309f1c107e594cf3c31544e4f1d93fb9ae7e1a2451e7082cf0c850990ee71ade0498f6a3852dc4fc128bfdb8abdda3d759c8d4f83fed8509cde5eed38410fb9f0a5f30ea45c9270ba2395df645aaee03f56158685a0ba65de3d2c5209a7ef4bdd4bbe0cdc966dd1bdf1fe0be06c7115f7ccd80f8012e5d17955ae0c9e4220076882f30dc5e391295994b9f809c09dbed8ccdfc89669f40492944ff20948080a4ed66ad8166b613ab2f4414762ae493ea6661950e8e56b3758a77cdbcfbf24fbbbf20eacd5cbf8815899a1c3fd20b1d04920025885388012d9c58ea842db9530b7ada901ab9ce46a12700687bde07fb99bf66d0c775218b8454c936f03558b899b59361a0c664081ce8a7858ddbc5e7c5480280411c9acf4d1ec45035d97524e9e44f963532ca5067609540c1bcb5627f99d5c61cb9a6d400f0ba0a74e45ddab5a4e8a765dcf2f3684e3a2661a78ac069fa38163ad9f9713eb45c841c6617697cf8a72c54b550dbe9c22b04d579b09aab0ef4ee8b70ca563f81ef9700c07761c944926f9a76a8c3eee1cf7e7524d65908c47c35b0453dc10db5b75123a5b26b9612c0ae18816a71f34638798dfca21f5073ce771500034f9a71feb8b621356c430b4d47cb1b59ad4677b5c679188d8861beaf52558165f691f65a692e8cb8d24abb74b8885edebbe52fb13dac16e3a8ebc4ef192fd10d71898e93547c7a09f8642aa3b4faae23e48bfa809c5989d3462aa50fd4e5c4095542c45e5600926c2decb4d18bb43b7274239a8dfa3d9de1bb9ca099dfe56dedfc9e120867efcda10b48f7e630506aa606d76e4537036127fa05fffb8b8703cdc8de70a78d014872111a431f393345d74e8866d9a9a633923072e93dbf47c54c4b205c60e67d5155b76f51ab49acc7435525605dd43a10c88a03e08e257c68937bf2984be63d40f8a60589d909f8f09688a77da15dc7b4853339f235b1bd60aa845b4db6b699325885c49df9c40781cc56fabea6201e2f8a9352c28ce321b9441422807e9c81c8f1ec85d240c9f1c8ecc4ff06d6e3682dea3e6cf92f2b74c2165af247ce0f5ab84460693254b523498a57e7442977f51f1c2f649bdf756e7f43ae543f5d8e692820f8a06322667a7fa9c1a5b10199a69ccea22c74e172fed43e550c68c337ecc5e6aad9f7eb997a7e619d47df73cb917a705c3cde5ff344f6fbcfaecce6b734e09a385fe54b224a880704d774581074c59eb0a3b42c59b8ba4518e764c5a532f6655dd839862af716903a118433ce0809376a88e88fa847b4d1c63ee393267b15c1e42a91dc6107cde990ec9ecc7c1066e9480e90a22907c51af47da837438a90cc07de8121691bd73802d5d09d18a2d8b38a28948735110891d1b559a73445838f359a6fb90a3cab887486cc9d95cba35b55693c890830d2", + "signing_randomness": "fd3cb9a6d1c92d8919767779c088a9d5c67b919d2de1b6b630107ece8950baef", + "sha3_256_hash_of_signature": "32e41cd0657ffe2e35e69ecfc8667e9636fabb483bb843e9c16d0fe3605513f2" + }, + { + "key_generation_seed": "ba7e359b1f669783521ad35edabe97141a816c2fabf0ad0e001e21f73ccf7736", + "sha3_256_hash_of_verification_key": "60c1701a56fb1926f1f96ce8b6f110a7069721539a8647696b2be9e699d2081c", + "sha3_256_hash_of_signing_key": "694e1741ea287031e3783d883dde6935dbcaef7d91db3fd2edcfbd1e5aceb498", + "message": "0707ea05515798829f42a4cbddb4a95c5750879e0a584ab503f778015f83bebf6d63c3b48a4f478ef01091403ddc5a9662e39707dbc8502acf50f3e06ed0199cc647ea155feef503be045bea4035c07c4cceda306b8187185bd06c14220f2b7401229969c1cff8c36d499d5a725fa1ce7b44d71e6c0e4e750766183883d838dae4f00b140e0afccb0e72f935018a6314232dc632c5ad3c26919d1a7925bf0f665ca0223439518143486ce92650dd145fdb2e97e0d5bc9d6806f442fe90c9c1f52992e670db2603ad885fa42b3d8bea4e470b7f76a367aaa506e931890b6e4607f59e87a7a5fbf3991eeaee47cfbbfe3cbe028e67bb645d37a7be5e7cba6d7955cd62d1d8db0d9772ea0185c25bc1ad40a09d3e7e9caba72bdc3a6ef3c40c7ed6208854157914a80b5c66a6dec2317fb5a529421c03cca6fc0a3b3d51556e8dee7c1ebfba924fe2ebce8a46be96e761aa6749c0a9a2b2fc49b42ca47663ea3395df22de20947db14fc1fad03805955d67f8473baefe2c1e22bdcc7bb988db0dde4e83e26a16f10b93bd9cfdba77b9302edba0c9afba7369a023ef763c55484f7425f842111cae27e07a511a725f25d422d933f2ec201bffe3291411ac3cd6e91018c95074c18fc780a73945b148154987854cfa1cf1199bcd03519c8f34774453df90b71fea6734dea7191ee2a5735f7a191f527642d53c844b087e9346b07edd0b78c36f83445825e60a13c424f72530e05f75da8d33957faff004deb549985790956a0e7d9b256298d56bc6206f1e4e1e958fe298641a277a2c8b6b9b7660dbf689ad7e1a19cbd965cbeaa4a0d30741586290576996ae668ecbab4f06f2a1d542e32c5d3f042e7e29a41bf86bae29e7029d997876cfb23b10986a45ca029739b2446a29c55561aee8ffb187961e6e7401d726af6d8a5c816b2ceaa9a1c9b780ddcc4f0e4003542b193ae26ec687f8c51451d2d5387d9c3b9eb95981df2de069fe741cd5c15f6d1b12c5b9b94230aba33bf46dce8ac7e26896edcb4f87272c32d19e72c313738855c02c6f46f1162be0a3ed2e76704b16169689bf532ead7ae7f2b26f4d9b22712662beea1f46748fa4c27d1d825d3fe493b5b3b513617c81d21a0912d329c5a4e3a90ef5a29a4e3137d1ce3eee99c42d034e61593a4076ef124bd6bcf8fc911fc9f6077d82c2980c2adb955939441bc9e81bdf9d6996ce578114c01f9ba096d6ea40f4e0fbb18b3e3d25e7f6d6cb670ad26f604368acb6190667b7b7ed3c1a1da04e42ae0087852834b91aa072ad51c0193e5299481221bc9083118f7b5503559f1e2d9e22a8d57932cd0b59509e7d7f459e20ebf4c1d0df71472340e64992c0485d593714d6b469547616dfeafc95089689931e79944204a6d0a47a565dc325f3be19fd44bb6cd4bf2b1d4a78c883154d70705e121b833a4a7e7e80fcdca03f52c1f831ab0d989ac5dbb5cd83babcb3ee74b69681818dc05e33234775123f552cfc7c7bb0b98c937957a2c4e86e3d775468a7cb8d33756ed7489d04dbe52eaa2737efbc4c4d0f55b5a841e1453763e611bac358fad0b5778c6015d97cc42ca9fecc66cf844dfe55587c200da5250b3a419791f57d3a4f672551be885dfe2aa8637d6c890ee8e1063e782fd7e2cb356bf47b6eb93a155d8d64c9f6cca3971c5a7facc3c052a2aa9fb286750f76933261aff5ce408bda8382af8535145f432f78b3b25a768b5da2a211d1d07ab557cabc7a139f66edbb744aa76e0fbf22092e31c92cafc624ee1dc6732f27e8e7632c6eee2d1f5c85b52d712c884b36c91da383f0de9e06e5ef63d7b7a692e5e91ba1a1d9298e26694faad9ef262f117df8115e2e877197a8069a96210ce65d45e6aa7011654acfafda810cccc20c1985d54483dae12b29d7ecf66376968b52fbd727cbae7c9e3dbfee7391d985228aca9eb8ef98fae32bd24552a6b34baa581dbb03676a3a4546e10efcef269b18e1172f560fa0f0344149543551e079c1745bc0425b5233b7d7dc32f751d321638edb1cee56df0359eb6d9863cf3e341a56060c8ef8486014f956c39b751ae239a493a017b2fa5210d374ba83df5d799b7cd92987febb0b2cdb3ee42a61381304c5eae2add4777011c3279bbcd1edd6f91ff72b3c353ac35da8fa843dc5561d3cdb507730e8bef20cf09b0ddc36d47f4c10d82652dc2937d889f83b1ddc30e52b244250d19eea9cf7a3b5d931e2e25b64a0a81b2c4fe933a17beac2e10fd888d07f994e4f2583d204da126533f5e36b62486a00ccc317c4381a8fe11d36c43e71be108e22a98f53729f05a5e0aa38d512423db4bc1d6bfae9117383acf94ae2a737f6b8070858beaf08e365ca84925f8bebaeef5af77eb73a9d3648aaa6493cebddb95149f0dafacf129fc321e558084a44cca4b429d664d90dd90f2a04818b48d135952746ceca76f99b947a33a3bf7c535b187c1971af4fcb1eac841be7e96f429dd38127b52facc2dd6512d8d019e0080cadbf7078fc67e9af170a2a00f70f407b0a7ff469e2f6ea165f8b43eef1779a115089de9abe6b78c93e4b8e3b018686d16ce8ebc88cbc1d571372a3996c9e5967c035f9da6e200e7ecfd1cf7158563f36a3aac3cd8acf52a4eee29dceb03fa3272a671cfc9b", + "signing_randomness": "bd322c5cbdf5c481cdb9aa66cf453d5721a97e0055e0ff3604d690163bfe90d1", + "sha3_256_hash_of_signature": "bb643da62b01cd7ed361404261ba5ad0776763b1b4c42ccfac3ceaae9fe99b02" + }, + { + "key_generation_seed": "9daef95c8d5a61d3a3a267fefb9f37d6e677d7ba26a3a5bfdbda8c281be89ccb", + "sha3_256_hash_of_verification_key": "869c7b206906a757574a4ac30180cd88039fb6d03720c7bc65e9560ee6d5f972", + "sha3_256_hash_of_signing_key": "aa6e7169f3981ddada233626cbf61e7856e867e3951118729931200ea4e01e86", + "message": "f3ea695264936d537d86e545e132131442c2973d19b37f8c911e3ecef4a13a8b1edf5e5968a6198d26205ffe6b76cb14e353b5e2c9de1bd44ab9bd55862ba1a479833335725ef52601810c778da4a32c497ccfa43f91c72a1499e8d295ae7cdb43f1ca05f0d4a31b30d9a69cab8288640f3f9e081e2c98cc8351c7eb9954d428da4bb374b346a83eff5aa3f455f2bb3fc922f901bbe5695e3ab9892a93beef90fc150b3bb47f6965c229f7dcc3100a4101840417a0e2547f9d42ab27216254a2898368bfc60e7d407271c213233b6913c8e48df10967757bfaf5b5e2a284b8f67c70537c97583786b5185b45e2e36bd8b5443e98601f772829176c4d66f44a81aae7c13f539490640bfc40b83e1c75305b06be60e18a0ab568859435b715e15ba1ee4de73e04e1b09dd15350ae423c131706f057255e9fa8fa3f9e3ade7435a6451f7a2aad0c0fe0f444c4a247dcbaa49e7c926dd52a33d3737b4439c1d40f861720e37bd25366eb5f34bf4b552160f3eb80ca8fb19304e1e4143090f8e965daeff17551a3931905b5cd991c6bc5af5be808073893a47fbfeec0940ef5e7d2f2ee199847e1a4bea447bec40f86f6fdaebece6ff0f66e04193355c9576dd4aab2d796cfee5d432b1d32e13b8903a06ffd3aecb00c169a3af8389848cec724f647c6ba8dc3134ca18586db3e4138601a16df8873a490f23c4d27fd9c3d4fabf2bdcba4af3f0793e7b591198100ec97602d9ba572409ea49d7c8edc646335fd4494577720ea7cdf3b4266fc201de4bc204c0d35cfb55010bfac68ca0df3ac936c9fd2a9c532b8e3461d25362efa37da159b64670060cab833eca799fcf1342c7ee1b80bde05abad08b9ee8908d50cd0d433dda0b120d1980f690acad9c072502ab537ef71b691917a76d3098c27fdc6fad1f1b29e307e17c87d9fa6a06cf8cef6568d9e4e005feefcb5f41a46d91e31b41268367d636c4478921e690d5d57e99da3448773d51b673109cfd3a58cc50c127f34f4963fced6c216e60ea0952317fbfe88807bff4223624f6126104cb46c8d39ee228bb4fc0002287e346e5ace43e2caec07a22203fe3c4aa9008a94f7075f6e449fb89905bb955fa0023608c494f7b73d2aa4e2b0a8a7e3caa889b6b6a6640f7222ef969d46ff6794bd97c5363921461bacda17f2781e14419436e37610e52e3b7b7bf9c1a4b1d80876030f9a8981daa4f06a432dba739db988bed5de7f38378ec1f7d8a46b305896ca0caa5d8ad74002863c6ff91ef25ae96450936509efa93f94718e895a82b4616a965af004038e0897a6563dbc91eb5a6172adba052250d06d210bcf5a250246fc3482e57fcd9901104c5ad58eeffac2860a4da9d2c308552efbda2d4275f3f3651e9935a0e42869b9263fc7ea71079e604a4ec6dc61cef6ac6cc06194def432c1f7cd9edfb0c4b448dae3c2a685bc818b2a90e17a4c1caaa5fc2632f720e764e2b8da314224498119a0d94cf5dce24176421c2736575672b361119ec7c766265768cd9ff1957a17779c11244c1cc82d72d4e3c87107885f71c56da2bc41008b0bc1375c12b3b2a80071ec03e377a93bfb227bd560edd5e5d88f46f7ff9831f05bf262f01f62278d3dc13f4f0ceca0509091c25d20666d8d3527975ca3495f6843b46b5d5b6f5c650e981defb3943963e14f00a0f78ce785a21634c46b531b4f2ac5ad0f03d92372c334ce963e514a1891716eb5d5bb1b67834994eda492719032e2a4f961ddd6d2002d8f52798c45a9da8145bfd191e97d1fba1b395858b0fc7d5f5a54e69fb3780635f70a763e44075075580778676e6b9705b40f40210e597b5aa1aa77bcc3be5005159a4b68cbdc6ad8674495e0df65a6decabafb993cc49c082d358db1e5b3a8af2fcb0049a15bf521986ad84148135cdb185fddca6802c2ade9ea2e82047725d73f51e072ccd799d696d7530f61b16e9b4727c58cb0f552b188f9b451be543bd809b63d66bcdbaeb7aa917be6aef05df559b3aeaf65d5ea12e852d1370efd6197f970f52292f27923a10d01aeb652a9a44573c137257b49d130f1da48e532b3e33d4854b995534380b4549511b39a99145af5abe0ccd3a9dbaf673efc115cb75a9a5a806679907bb525a2bd4507977329eb4c985b3575de6533fc5d62358c21af3dbdd20deefd7c417c77d37dc2a098a8fa48f7944b7ec6f929387ba11e3516c9ea681238650416ffb97ea343d5f227badfdd509b94c1451c54f85e4539a8f70dbb5efbb10b2d82a16fd0c997c603b8983ceb840a7c3b61918d8a97766bb8442c3b9ef2d324e28dc19748417d32f642874a8927688c74bf4f6f6724015c4dd50eb83b85f613fa20938f5c895f88830a40c9799c212b2dfb453ba0bc534f75cedaf7a016f6744cb4f5269fbf0284eb90cf1023918078024c3b125cd9c7501224050b4d20b585472b42a0f494513ed131bcd8f75e223317f56b37ca48780750de0bc81c74a3388c94d93a65719122e9d533274811b76965265d7b2f91ebe3c5924ed2d4dd5e327a6e7546aa2605e4c78d0208db7a7f678caadfb32e6bcf8c77fc7810f7d1d5d50e26d1a0da03b8afcf99904b2b3198670462451925381f0bc404c51f2f18fa7e2c1e8b0c6cf97a9a65e575373996c3e9da15a18d15c93548377677dd713c9828dc4e4ee823a241377c65a2948bd29447bfbe", + "signing_randomness": "8e128d60e2ecf0925ccd6440e04217f4b6cd4ea12c1f3066ba9148af96d2806a", + "sha3_256_hash_of_signature": "08d384f65fbbd66a65c16f599648eebdcb0d7b61455945bb07d240e6ce27be19" + }, + { + "key_generation_seed": "0531b4105cb209585f9fbc29caa57e64c2d40f0829931a42caf7701717d9096e", + "sha3_256_hash_of_verification_key": "bbb423e8e878408a66587a833769928fa870fe2e87333055d579320fc24e1f6e", + "sha3_256_hash_of_signing_key": "21b7672d45f2ae444c6819110d24ec1cceaf92e49570400b8c5ca88ec891a8a9", + "message": "437e0f77bd0e14d704be86135119f39a0a65650c762852e2694ad9bf2ea45c7ee59df915f5aac128309847e944127294566ffb193d0361dd7111d32b06dba60a12e053f424ddd70674e902e409bc6f5891cb9a76108322cdec1491d3d89a74cedd855bb0791dd6da371a75ae979593b5159fbe9ddacf88506e6a184547e2a7395a46fbaaaf286eb7780b789fed86f257e5036a3555e777b909243695ce89957df492c80050457afd84aad9f8918099ab00fd7ad3528a3d0afe5b52300053575b839572d4d7ce43c255bbf5f16948d40bcc2e63714487afd3638601adf47a324482ecc99fb88574538809227f8c0a5fa7f20a0b2fefda38e6a665550e44b8d5630290a4815621a5dd74a2108ca946241c48661eb087240788808bf676b145442b2de4c35e1a6b8cb1e97e54cb729202d8827a0d4994c6d7f3f406ed273b00b6590006af069d69173b5ea8237b87705f362288ac3a50bbe7e70eb15df6ed820d66290f57a87e51b2c5777c9c95c2a76ecf2e296a7c295bfe029bbe681b32a6d9f16d11c7ca2750e2f8877af5ddb616d8a820de998b0b2af5b0c2c5641f498c99971932327ec2c73c0ef4058d9f33683f60553ad2962370afc6725743c86e591d7d7c20944479daca5e92d66a33ca0c862dc60dfeb5ec3c6e7de356f6e43f06b1431358285398f8885176d60cba218217dc7afe4ad876d0890648052a56812bc3f8a9e6c49f9d70b0a032924b891a9410bbe2f214c842bbf0511ef9017744a0dbdbd500a4189b471930e25216d2588cf8ba39aae7623966cc62d6c4ecc8b00b0613d912e60adf613c8f55b778efb93a513a776c64e8dc943e6272c0eab4004b4b05ce9bce9ce2f2b86fd8429e9a72cb16ec3ded285339edfcd122150f4e7310f669b1dd4cd7e76d282d10314e8abf61d53bf343f3ebf9968e1be8f3785581f675bfc28c893729cf67345d0f7c11d6e7d6da0bff255bf706c986704a3b9c6fa0602c6dc108a59cca70f624b08e4f5393e597459bea4aaaa463a3b08de147e10de6b75a0d87bb79ba9a71e7f5999c8972ba992228b60912aa2d7a32703ba8bc02f774430a2b590911d48d3866396f1d71f19ca90ebd5277743a984e2156cb57de88ebe91bcc09ccb5c687cbcd4e48e4ee110f4075a21f9a051700b0c2698fcd6a5a73372ca366a230a9abd153e4dcab7a33a8226f8458c5892098bc0a95619880156548f300c40bdef81e8c1d8bd03031c690b7c3c000ce99675adb4b94752ea22bc9e0278d0a53a2a19363a9388bb8d6c24a45b5dedd8f7482e9c29603ff182f25856fbeee2b41b88b352f99db5f33d8eab1a1a1fede60ea6cfb7478db7540d3a286e88117503c4d0a2c13d32afe3f1a31d1af9ee60eab8fe06248cfffc7bb438b77d94b5644805cc276f19268dd1ffefbab3c796923288638da1c15e014723a84f8c2dd9f55f7adc2adc13fa7cdc29baf48ca438c882da5f7caa792b7cd984bb11ec4b681b332edfd4ab4c132b08bfb688f81baa3fec5a079e2182c282a3ebe2ad5e4c59090bbb989e6a07d85d604f5ffde0587add29a5175ce65d29fb9fde3e8b49eda1d88ee8dd64fa1498d33ebaf4a847ee9fedd3376af46c1552a150014c11ddfc5047929e2415d3f9d81186a685a1caf2f004de777760f0567e880866320a7b42e61cc994719ddc81e28525e50195ffe4e0467d9a9182b75ef57dfee926d7744485a55e07d1bcd1c9b9b12a60460bff016e9834848665f132e2ff87805e00154c7d9853dbca43d005bb197eeda3d2d9249a621efc4177415bb103893c82eeb0aeea056b40e98b5fe65527432ff33ce3e09fe1288a6e2641011721279253800abc4b73f65b15b434bd34a573e77a94729a78c92f0e791570a416a0876db39a8fda8696fb12e7fa3bb11e7838054e4195164b9676dd03327810ccff9586217aa3d50e7d3ebdb1ae1bf6889df316047cbb278ce8c9741798452a38e48a7138e1fba286b497fdb8b1e7bf6145c5f29ecf6d5430f8e550314db3cf48f27897f312c6d9d6357a880b721e5148da7f789238ce411f952695f4a878756bde311bb4e62f10c2f9939b8530ef70d3fb431655aeca2ad36bb5df0582a07f53f1df8e0325e635d5a5e795c130106502a081f2fc52a9d97c5daaf174f13d2de1ea0f8860f08f4fd5b571e1ab1e84437f3c82bf19b96e46513c316bdcf994bc26fb8461f90594e08e6d4a032c1da38481a1ad7bfb7d5270255bff23ce035535cf478216e6d2e62e147ad93357d62636b1ae42c4e8433bb94ca91d0f8ec265f2793514543aa86b786d9760be5c77aad5a8449a7dbe92391eaafc305c1267a68e6acf0f044fc144d82c917992748b9232dec4e33ec97534f2bf60b56edbff675f0343c9c78e8a8d0529a78e2eed9f998b360360352009f01905c1a4815a36b111cad8e5b34688b99216171d4f57283cd669dc05995bb8d94ecbd3e7b662c4a603bd85251f2ba35fb6ca492c2b3e996fe66a1eb904ccd61b0900e7dedcf136f50e4c3ad5fc312a2de4b3e51f355d01763692c0722c700a544e681a316a1d261fad727e557398e500f15df33883abe9d1ba645936891f5a91ff6c8a7b9b6fe5062718542df4fc4ba50d7f513945482381adc42d5a9d444ca211232615306d7241fc49f08912bacbafbb056c018ad4d6021d99fd720ed6548a5a29daefdce868d71a1ba72d9f998a3f89fcfe526493582c4c8af5c1be065ea29f6155428dbc955b745df", + "signing_randomness": "8ec405f4b0485cf9e3de3bf57f23727d0fddca6f2eb0c91d162d9d5e84297980", + "sha3_256_hash_of_signature": "601b6534f2c5889297113a48497947ae7c2f0ceaec3e0514bb17f8c679119618" + }, + { + "key_generation_seed": "7f8515aa82dbc9ec8cf1ded5ab58ec0d08cf686e25a8c01fb1109a3c68d19e48", + "sha3_256_hash_of_verification_key": "4fd073d3079b82239507b87f4cf4f0049054257ce90b4d5340985552612d3267", + "sha3_256_hash_of_signing_key": "aaa99c83b3dd916171a1689be5290a3d4363762d4d273ac8f9730c176a125a00", + "message": "e4e3edcd70c4bbed033f402ceedc2c265dca10b2de0db00d454c3ae1a0d00c97e1dc8c6804b1777ed21ddf5145b9f9348a931c128a8fb03827f653c37cd95859868dde356ace682f627fb69fcd97757bbe8bd5a260a293d2acf0bfa2c0a3548fe25a2ba1a21f95123d592b40c20a927fdb615e69878e8d7c98d261dc01958a088599d3f9bb5e14002192fc7de417b1074b3f7b52cd2a699091fd9dc3c5929e51cc0259d2255caf0e444ec11257b759978bd4a7c8e2ce8473325b7498681102de6ffe9764334d862e379d9f2ebf9b312fa75d7a50e08b94bd43eef78722d423928fb8e26fda85a345eeed0326a5d694e4729154a9997b269407b7d03818025eeb2ba96580626dfdb3bfbfce100c508170d8150e4980d5d386761f4e8311339b47852acc2a0a01dad90d3978de6536547d4f203ceffaa652e4f2f28639bc3ff83c485c28edc0bbe21d17b8ecaf3794d64c36ffe7f07e8a906cab8e7fc9067ca4bf9b074c7fb01ef99a05d7c0f35d889a63afe5ff18023bf77f8a3da0c3cecea0e538a6dab5c54f3a0d83151595ad3ec4c45132ec2f22f652ea5dd930e692a7c0d7c23de84314caa7c017ad50d430fef42de557073ddba6caa4a787c92e6e28368943cad0974edaeb7addf991cce20bf51c5a898cf0a2104abb810bd4937d23e5d43490a3194b8a109b745e0a365efa59199b43835682e996794f16c5cb874c88d9697b189ac54a1ba1f459623c1563cba7689ebb32dc4fa0bf30e064d119d40c36301a653a4f959c97873003cff7e8e030a137bafe0a60ad08e4f692dc107e68ab40edd0c384875b8525aa0a5ec3aceafe557ec76db5283672f9751afe1166d53542d216186a3def4dfa94e57bffbebd6f4afec3c0f3f40f651a1251a9ab39c262d42313e9f22879645589ea54fe894ac005115a43dd806b2c8be6222dd9f02189d4221a9dde99ecb8c3ef4171776268c12adc37e4ca92eef09d2d1803db1fe917521662ba7ec0c07292c7e2130eca4eeffe53ee0ceaaaff6f4ccfd42186611afee79bc651b1adbad08458592d69fbeec708c7537925658babbe7e9867915c6a728eaf41b0af2effe55207c01652891c373f7a14409d05fe9e26c2e72d688047de9a0954516b85ed6a3230b6b0ea9c5f086720c26efbf8b7f5c5d14651d54c4ea181a707c562239cfc08b2e09a2941d04d587b90134d8f670f734578534138cd9cb7ec04437a768fe65fc5b3fbe818db423a2208e485669082b422ab1257c2529cbf7ba4cb30fa27b7f702418c2ef9c3bf7cde53661df716449c6337c54542eadc5209a0e030ad6577deeacc6be1813db24bec035cee6aee93749d524222535a0277600f8e4f4beb473093c5a00b6666cb319dff131ae4f004eeb1bf71e5d274e3dfbfa246dada9d6f548907091045fccf79b363e695ad54c2f791861ce04874ee8c3375612de820cede04e4472bc3dc19abbb91c42a1c3d7b467837570e7d20a2ca6405deccff1aec03e0558076e988619cb0cda9cc87a12367bd486b676a4f71d40b88ab4e7fa750350dadd1a8f12b70864792d3cc1804be8b7cb9dda532182c32582015c1788b43054b7010229f46bd39000440e7f5d22e4d52eed85b204b344680426aef51f0ce0551feb9672dbf391a9ad363ed090837cac1e721878e65af9ba92a0ee7c7979925fba9f4e452eb4fe3af03b9eff0526ff0a331ac0b8cd27a0c49e5019b7025c3c9870c900a7fb31ff834e04b87db77c4d6dae4c3fee741e923704ee5f294d8f881833e9137158d1ee0fbfcb4637acb814a2a5346607bbcd6bc916235f7875334f2b75a7ea7b8b8ddcdf46c0b8007c9b3a014ec6e634d4173cafb1dd09cb9ed4a123151f4f2631d4bee1520c10c15afeb17198009c2b254c1ff0becafbf69be8c7dbbfc7e8f3f1ef05ff6a7945ff79ed6c317609b9238670dea26d56d481f87ca171ccfd726cc0728c965d9bc38d376d707e6979908b19fdf7e74ecd2d0671ec338fd54ad6cc5f789e96018521882588f888d7d715104d65954dba8907c0b7ce3f2acb802ed49ddf1416c29e8d685c5ad879464819e1d53fdac741f71e31ac0c17b6c8932a4a00e7164cf8bbfec36ebbd30392145b292d355fb304a88a638f991f6f89a398b09f1de4f0b29866029bee75a12d724a52736f2b9f49937f0e51b0f2e1bd2c1bc9325bbd1061e0f7685aca02da735d8fc39646e0b2453bb9690ed1c4853a757ea9dc2f4eb4b5adbcfcbfb0cd2587f61a24b77ca0d6cfcff47a98c7098b986d4fbd0e46ef0d1f9df842f4473c43912ab49f4117c8214a42f3083936c7e8a38b294ba081296a393dcaaddcd0d340ac62511e47da6591836553eedb466da6285359ee831a952e6c7ae3b943636124e43224d527b7d394511cf31c50ec1d3e7a20e49850905d504f1aae477830e3bda50430ebd47fdbb0bf537d8d479cb799b0429c3f6591328299a09f45cf9c6d30d5c1c9203b9521d807875d7fb2c2cfaa688414497122161b1b4f159b66c0834e111da4f82d5252367fd2dbfdc079333fc51ab0d34ecebbe786f984852a596be620ec6cf84ed596425b90316a13b39e5ebfa19b319bf0fd1d6c812f29970fb1ffe948bc0d2e057b1dea15445d71b5f728c72dd0c69e277c58f031f90932994ac5a177926dcc1c570ac1b4b099ed66abf7dde5a5d77d08ef1ad7c6ffe018f56efb07c737f33038846247eeee147e4a5995bdc3352b73f15fce5140410aae3f0af1764e5ad996d01608c5e6c6c96a20274ea7781b41fc532b01b52134fee28f501efd9cf", + "signing_randomness": "234ca1489df44ffa34042a77d73748f1e621eddfdcd2cd35708566b941a1aba7", + "sha3_256_hash_of_signature": "3636c052cddcd6d4f5db6cc24e7d51fb3ebe17110b5bb7a0ae7ab90aca4d6c99" + }, + { + "key_generation_seed": "5af3838060e0f83352a75a0ec4ace2ce8ba119bf89f34cb4d6b8e27007cae7fb", + "sha3_256_hash_of_verification_key": "da1f315bdbc5ad073737512f8848a9a410cc49c0332d66885c46fcc85317540e", + "sha3_256_hash_of_signing_key": "431fca131290a671925954f2a9a5dc47de8cf3223e0cf34a4175d1c864afdbb8", + "message": "84c603d1b5549c46964ff2987a1f533b4ced94e67d576a3b0bf1c8bd87a74ac7db640fc9f7ade44ff79b820846eb83367153f5ddddf9dfb7848a13d59436916efabb82dd61291447491d2ca04166fa8680e8e0e0dc98e79344534ca1cbddb531797a61c291606200107002091adfa927a763cf98cbbd631cfe890b0ed257afd34ac0c5280aa7c70bd0c945d78e6fda284cbb7b3ab636bdf17342f2ba28d707147f14d15173d9bc0b6d65fd1663c86971be1fa59da8325e1f3773bacc5b8d4158ef525fde6e96631c51ad142250252a8e5786cd621210df3e24cc0b4b60ac2f013d76db0c73df40efaa05a65383a8892276b3d69dd511937d55d914c3222a2386d1bec0a268e683716af4ab709d2d225b86229095e87fe70d69e6a34bb214529ca3f082c0f2709e77b86b00b4a04bccd343c862333b7c9163857b77e30551710ccc3a803323f5cd4eb5317cd2e6a24bfb77727e1c64d0ac47beea1cb35e5f2ff6024c06f2f391fee76f2e69537673fc0124e48e4e2242e84d8affee6803ce6edf3a954d2c54562b8b76a4edd91e24a8640afe67255605849053b60f558b43ddb9f8a04e987d15f6292962d10ad8f7b47188d12d1c9090c0fe8710dc3937c6939496884bde0bea979839837c61be4df5662c724610c7fcb4631a0a2083417be6a20f4eed094e2145bc72a83a6e147a655c481dcc906e63adc0244d95b6085fc096fbcce81eeb0497f48bb5ef827c0893e331795e3b301dc9f3a91dba9fbc838e044e2ad9859f1dc67e9bcc375442b4eb59714b5ebba87ac9a79c99ce74f8bc75740ddcce46c4b408b91dd7d4ad26b0fb1a4ab874f5504c40e7363838d22aec45c10d3cc2e233124a5cd8344249edf388e37ba43598f2c2cf56d444bcee04a335b154dfa3ca694db481cbaa59514098ce6e0e4138c0a543efafeda4aecc022c824259a06c3d57a70ea15a5dfc822449a27f58f9ef842dcbb636ce293684e1b331cd821594a12634e5594410b6c5e2306dc8bbe62c8b0f49f2f699a59efb14d3cad399f74ed893e1eb43fd770fd61e0c58e5d8cbc9435f4ad0892681a30df4885927130432186ad4be41f6fb7cfe660e23c5e55f60789b3e97c3b622599938b36bd1c0bcf6fdb7e4ee44c92b6a86ca2470bcdb8bab8df6079382ca314bf3a8b3c4286518c356018fd6f6fcdd9be9ad9c228f29135544e723a898f483e9d9ee843e75acb3feac447973d12461fee3d984f3b4f31645faea56852d356c96cd73a6f185e8cd56731e83fea145a2bf0c15adc634dd9e2ffc799b59a0712eb4d2618680c7493f50a9bbf3f7bde1025cd44afdaf4a8c42c9254b1b34aa8559e1cee9bde7b4da0fb3cb2289418110620e505b793b91f422fcf53adda8f7c96d55e26244e075d9a70004642712eac377ce18f88f2c8581694b8f621707dab6d292179b2a95aec5ad6e409d78253dcc05eccdb45683dfffb9c629afcfb0654725d650e4a283fd98e47f37aa9309e2933cc0393625dd81d4a02f9d5082644de02b6472d5d3aae110747e4f756973fdfce8ea5f997e30b11ebd50b45f6889d227d87d9184cbc6ed40e96def8b9236763c9999e21bfc1a74457ffe5e0dc2b16876fe04c2e0f0f47012a767a7ac18d71a7fd65f8647a7e1ae2d4d255492a18aa81d17d390e381b1722bc3c38bccea9d5e73231d0c6e1a96ccb47079e36c994e94af9a318d67b6408bb602a91d8e9ec6499deed0b51a9ae31d9774a1bef4c1de0e7a324545b2af9870cd733c2195c5ecde386d298c33d492937497ea5f0e05c377a4d755dea9d96c61fe82cf6299eb34b857217a2c6733fed64f5dac5f95a0ef2294eca844b96ceb5163363a31c58c88428152663ab0a2b310b1a9e9027ca8cc0db6dff528f9a421fa826a86acb4fd1d79c1ae6123c9e685ba66f5ff109fdff2497b1a50c2e4e7b4662fa11fbaa305a960ca70ff98e5290a8c3a27b4a3cf1705c6df4290fa64f3259fdede7a81cfde4214230dfb9efb20049e905833b5d48923c8ce2f8a104946fb3356154519d950998677c56c8b2c80471a6117b142e26c0345cdf0634e356d80c3be12f4ab89eb41dddcf98188ead2ff420eed3fd9287322f24c62b21f430d5f9b8592ce1cdc946616111c91c667006e47992fe2d5a2aad82f8dd1af3c1b8ba5326220645885cc94e8b2b76cbff7e161e994c0cb9e489b8a5662e9d420913af34433f5bab10ac72c5eeb9249f3c102e1762e862c13cc882d20be16834e54dcc323ea89a133f451b70087a8dcdc5b518eef087a571b570a7966f1c49bfcdc70ac05034d1dcc56edc2c0f57d1aaf16718c67d162ba330aa61a2875f90e2935752bff1ec28a79ead1ac18e70a833946ca6a15d8765e1a62aef46bed232eae89dbec278297b396cf611448c5fd4b36b95cdc54e3394c63b9b0969d6488ff1c700b390e7226f99a945306c6504958cd43cd3d63910a4324bb662a0e5db1622d90ce00e50ce7112193872aab5cee0b8d6fd42f26c2fb87fdf99062169c0be75c85109d4e209dc8a640fed3ec71ef3de8878b3d1729ff118f50f8a33361c6f707f6011454c5d744989ec1beb644fcf99cb2e7c3cd20e6f1656e07c3566c4de68593bcba0ee9f7bd2e272c3d47a3e03985456f18cafbebbc1de74964becabdf3e9bbb9a10b29bf3b458fd50f19d63a6231cb51cde3df46e4bb6318e81e10ad1674a053c8cfe1e72853fd60e6e642642cb825644d6734afb00329839f22ced734fa1421c4334e20f2ecc8bbc2652004203b3b639fbdcf5fda1423f08c3a1100655e4763b8d8356a151d702124d30fdd87b34ec4d34bbb3639464e44a693690e193329", + "signing_randomness": "4540537cdf98ad35f5bb40da1dd2e0ca2340d3b3cab1693200afa0104fa5206d", + "sha3_256_hash_of_signature": "874bbe7d85fd6f54b8758987d90a132138569637dcac6a6b04282f8d801c143d" + }, + { + "key_generation_seed": "b323d48b567f7effffd47a7c9abf0add5f11141737a8af62b56e042ee498ad6e", + "sha3_256_hash_of_verification_key": "cd62f49ac922713f30737eb8118e40e8377d2cef96a567cfc204a6756cc0b61c", + "sha3_256_hash_of_signing_key": "4cdd942d7d0ee70db16f14a28e51bed58db63c8a16d80070c5770a778a459d72", + "message": "92d5feef68737ece61c6e0078d77fbae97b0b9235f40b97099c114b1586e107b5ed1308a8a2d20be41af129da2e0b38eaf02faef733c7a1d1a387bc55ef008530abc22697d0465aa3eb71f41ee72add236cea9a25995f3689c5a451e2f03915d96abea10d356d549d68048977587326523ccd71c05fd57bfb3c7a853f535beddeadfb84118f6548860f6ba536277ddd7ab42123e93381a385fa3e6cc023c1458a9f94822d93248f36c48fddc972b5d6494b26658440ffbc23b57363f3d82cce69fee4747a889e85343288d55d30fc54d2d0744744dba9977720e8edd2c0aca1fc51b0c6a3c68bb9bb8da0385db1ca4e9ce660cf7eb2382e5e95d2ae19def904a8651dfae53a4d0dc4d057ab1a506c3bd7e1d1ea3fc4623e7d7b410dcb312f037b7a5fde5e0e604fc33270faf1ffb6ecb3125ddfa5c49f25bbc98238c8ab1b903537cd67238995e81b814280a4ced61513d69a2178086d505f8dd1df7e11ce66ae33d4c982f94231957031a258e0ec745672a57a5ce76d1170111b8882a9eb5388094ebbd53ee9ea1fce4a275f9d7060c8da79018487b452817280c63b01b05efbf897387592e2bb3bb486fae0ab09f46d9f2e176de96c59992c10a14ec16eac36102b1d15541607075e67c842a888c87b268e9809148a323c423220dc31566b62f45cce1e2bc1b3bf43b87c998f00023890bce517271bec16efaa33f11611fde87f197852bc2e7a2b44f8c72a6f79b22f73be0611b81efe09253931545d2453939c46b6797cc5dc5a8f1aa3bd8456eeeb84ee76dbf2ebf32598750ed10670df422c7d7993acc55f657e6e1b3dfa1bd6c1cd55fae97e69d2f8f5af368f7da0a63b4065eb6d8f02b19a34600252fdffdf4ed8de2ea9cd2e74d63a6cef29bf02f92d346ecb9a61081ee5ac811f33aa5792f6a1af570a8b0846f3e6ef38452346dd637b19eca37bd1a6c42b20a5bede9a5de3c9f169d04d8c6cf5376d3404f0c21dead53da6c169f390eed7b5b54dbe47cce0b2ad1179ea8fc80fddc7281bd4fe31b9a26a00444af0b4d40a1b72be37501308906149dc6fc5cf02b6f60aff82b975fc8f146961ebccb4d126add524a9b33bb16f6a83c6f3727a72efa2bac116e493e07b2ca718a63fcac8e9d52a1b61479b4ee52a5ed30fabcea4d01a792a92676721286814f3b0f4e15e23ce0c5d59a0c3eb8573c0a2f66c25f2eb2fcff787324721004979be5eac505dfd39f5538e2c1b2cc12d20c1c5cd87299766361aeddbfff743693081842378744879e6e6371b3ffa9ddf34966fbf8dee91b7edf6eec3e4e2f410cb5351f847646c22ab594046ded63347d04a008fbf6ee9696c638ece73b39a269db239df36443868ad44d26a5c40fc92dffb008e436e5c18907f5b18b5e6c5900b41a9801db070d2db651187a4da7e2647ed3e9b6e9781627eb576bee8334374468760dd3b32985d42945d953d434bfd80d7f7ba537265ffcf27db0da1abdae89bbe94d98bc9ca197e41c0839728f964fe4ce30b8cc43cbdcdd9ccbe06fe99debc6f4024f3f00d43febcd62a1822a6d507337ee79d4517aa486870602d4f1c5368b0eaa1ff6c011a9a953aae58c75bbd3dc78d263a578c75cdb1ab324d71b9a065a9af3dab854189585c68d499ae8db887745e20ad9738705b9d2f5d429f12d6462e5e2ef9ffba53ce2f4e75449d2a7dbc3c818e61dc546175a6e0c10ae631df6b1eae6d134c08466ebf6eb5f8257aa10ef8c6f27f4295f7ebfd450629f3eb4e0f4be247ad7f5e80703b1247a4fc277311d69e5d62e0b0201a805cc4f1f807de99420d563a703493ad35a56b2b2dc237112f5ec21c70bf139a9ead8f7e921f086e001b4c449e42a0e3afcd5bc757040a2865d0e5adaf98e37e6f8a501ff39cef0bc364eecdffd03069b81f5e1978c397862fd56362835c059fcbe4d8e2a957fadd7d05bb195e21ad67b429621e1d6872de2d8bfdc91544f9e6ae8c164a23255ad0e00bcb21456f8fa6ae018f49605736c81a5ac0945e2d965f1493ed5befce512ae93ad91daf6f5a151d6c9856dfddd1f877945d932261ded67ac8231dc3ccd0b04dc1b02079c897601e363ffb9a3bcbbbdb0b0a375e69ee4a7135c094abdc237faa2e5f82d2556290adcf82adba8402c4fc9d0724f15bb87cd7a75a1a7bf826896d8ef63c7a2a3c371756af638706270652c376100ec42fa55196df332820d377760448d3e7adc42e9f5d8a7074bd0fa97433b0e2c501252de6939ab948552663a17dd7ff05430fa76e29f0519d650b86fbb19fbed097143fc242573e3e6fa4bd4a2ef6d9ce6932a066b4f9ff935ba9bc26fc2e5031c20ae30a52970a2df3504576108d5f26517f8577be61e6aa9d192ed62cf36aa641da0d274b1ed5ee864b549154eb4115658e6c60219cc5b2e22c49ce3ba76a85efb549117e1207f6df081d0761421262e352182239f1e34edbea4bcd8fa0027543824dd58a20324fd4cfe943aae5e361c367b22f587e2f9bee841e11875b026f12b9571512f72985f98f6d0c212df36a60975429173e317f6acf72e621f30654a6deaef9e9e455524bf07ffdf44642a1826f734d69f3eef4d52f26c06376c8f71dfb65a24a4c57d74b5976950af3a57b4248909524bec47d858c69041eed34e0ed3b111bbc117ab112bbf947d646ab3b7172f5fb726dbc53ae37956e29f5b6b1e3c90baf4e4fa544ff63815fdf4ac9a2a80ca0e8722383437b9a02f3ac538feda7a6d6c1635d3624a385d846e79e956dce483b89c346c1287a1a7293168d8a885feb6569ebdf3f47f8bbb50aa43941eb20001959af1b9b358aba13fd9bbc596ea42a9774a120af091d544e79c50686c26b4fea396bf1e4c25b8ee4929d75569a5fac521c77b", + "signing_randomness": "627ef60168ef6c8efd1cefb403dee572635e57fe9504c647a4f9da5bbd5b029b", + "sha3_256_hash_of_signature": "bf57f6140161a5661a3a77ce73f91bd81ecc77fd417e36d7d270b92604cfed80" + }, + { + "key_generation_seed": "c1cf3107ea9b283419e27dc563ecce950bea78c048a3f49fb42128819959e51c", + "sha3_256_hash_of_verification_key": "fba6177194456a1491919a0acfb78bb0dd211dce6d51d3a49d835af09aed1859", + "sha3_256_hash_of_signing_key": "d9f27dfb99c1d4bd62766e5073b27def914b6ec3c330547d094267708ec931d5", + "message": "7f704cef1c510bc2cae9b70fd248c656226bd5686d366528f0d0befc0a8761ec640cd2da7979de5eebdf6127f29abb8607f8a3d3be05be25aace7fef3063df28e22a522fff0b6ff6a0c61f79b02a408e8e1c775ab80be6841e9f8a9d030ae5518e3ea8a4e31e416e087d47919593598fd58122a9e601a57ef02de183d56921811ae2253628125c24f93c84361c5ec99e7b16962bd96ca190c68f3aa9dd60ce3aa7610589813b4fb77a4688308d9bc72cbe918583e298e03ab95fc500209c14abeb3a43baa92dcb11cb523c4d17eb9c6697b56c8b61eda05bf5789166f839291cfe2997b7dd462eda69b0615f2ad82aac0a32f4b30fe8725849c144a9c07799d6ce9d293c25d8302161757b8c8c8d07032d914ea7dac275919a1dfa0d3348ec07fdc70266975722763ef85ec4af9e14288c9659907526566bb3f2dd5dafc0d422568ca3ae52486d3f2c18b667e5622ba7e52c56bf00f82af2108cb4949a09179544f30758b7fb98c49ea160720991b14e2858d648f0585ad1bb1d08294f029bfe936154e9d328df2e054004fc5c29070df9ee50dcd0981d2bfb3aa7d6f637c4ce457c0c66d27e2670107a2b85d1f026bd970ef3fb7e32c60218d5e43a06d9cd26289a937b4fbad2a831425728f3d0d30c6c602af4b14411e9b3c7cf0b4d630614a9e03ac30ba2b024d496da984d08854f1366012c2400a5c8268c2b126dea5aeba0de7c92be0af08ca22e02604a753702bdcd642bbfa0cc91bd8375657a957306a76b6f139621481b6f15cb57bee128954d30f552661f906d8ab42cf260f30f88993bb40c9679385f5c4639888973361216df3c60c57d9b250f64b7634c94dda3fd122713fd2405a7b71f476c263a781dce271e7d0665e45dcb27f7293de57312396c58c40e268f57ed856f536c8feb4b0060488de3c25949d2b7e64207576641b34920d04b46766aa2978d9352c2769d49f8599f3d0439c928532e0ee428a3773fa4d68e6052335c6d93368e321d750d296799faf87b82c640a6e995d18dda002887f141db8ece2584da2fddf848d38357d585cd619b1625a70a5d333561d6de856ed9908d1e377ef7be03b326594808be58f7fb3939e939b73f11dab3e572dba41d43a046b8d2bb521728222d5a77dc886ac6f328d9a531118156d791d64f5df8ff8be8dca32eabc3cb259b0f72b021ceb4db36a6cd2fd149437b251f81f7588ae921456bef1a79fe83447d80caddbf20895667ca0e493a4731eec901e03f66de284400a5558922ad53d4e0ff7bc6c61640ade0274c63d94e96bf6c642b790823109f53c3c27130a1ee38d448239187f5009373be328af866a9b8dd1bb735e8002296043c6ff641a432709148c707b900ecf46555d77644565d5998c096756f79b6f0e20850b8bf0528e78bf5fb4859bd655227873d289cce47feda8414d09ed7e8d380fc4d580c7f44b01521e829e7b0cb2d2f345c517b65e2d476687ec9a4c160a3ac0b01cbaa588644d799b125910812790f06c1ecb1f1e64d5ccf92ae5e8147c98b0cfad5626bab5115844198e8c2ac1df9a208fcd2d2891f4a29009f5b36d8e31383811a9493cf8e143b5ac8a14d48119cc16d2c6bf6826fc47d4b782ffc76b64401b8249777e32c1298606553dacf386a22809b599924a635796a1aec3cd8568064852e54c95ad887d7afe837f6ff676f69ee6288879f6d96193ad94a0418bbba2eed5355876f2c3497448a5f8f3f83b136703d9a38fbb62784cc233df448a5e88eb5f81a0be97a16fd4caba1d87a4bfb08e002eba548f662d496a1478bb7c26c69ca4c100aa6872a4945d703ca812bdba53ac86010aa1d2c53f29e46ad095936ff50db8805df4b08c9580aeece3a6ddd828e7b5d4dabcaf112a6e35ab3c28a6ddc4d98ad1063c2ed72caa50086e6b72090cc1f2afebec6751f27ef51dd8557e53d928535d82a220f62ba0645e3c2618f3424ea1a339a138c9b8e26b14bc32d1736a4193c0c72cc402c3eab58817335c1424bd6f38cfe16338611118b4100e4038d07dca041c72e485c5290f0dde601565dae9cdf657a4c7839d3ade72986af396e767430125786e219bc5736f16fef66b4014e5961cfb4cfec4cb2a32205a92dbf1399e2710395ba1240d48277c120526cd9e2352f7d04d89cc2754379ce80a2cd1ac765718b8ba61ebb8bc6d0d407022e7ac672065fc8503bf5bc4138520cae233ea997463d7c9e00bbd852f12ec17c6f1db1914446aa21e156d210094b699b4117b31eae6386dc0de1f55ccec09aa1eb38cde4602598d452732c5ef8b07c477e3e2dd470737eaa7357e2e8b74c31a117b519bdcef79b6b044148a10468e38b5a6b7b10d74c6130a60a268ed73dc9a25ed68af354758fa3f57ed3558da654caca7150a8e4449d0ef640184a7a33d00ba765b01c442e88d9b4257b93904ace04375679bfd8271a03073e34c4a1c0437c4009a9590cb98d0b5581dc83407f04a22c9b0246de38e1a13f9b1191493818783950548be562f940240cdecd4a50c94e406b1bae04b50a3a19e7923183e3fd356238c45ae6559193e0e846df0fc6878be6c963aa8c3508dc31f766a4b29c78d749c89985ab8f580dbdf7993a2261cc4bbe489c3bbb38c46739bd2516d3c64a93f10cf559db6a0ea3bafee8b43f696a5288c66509a57c642bbeafb40f4cd0649b4ce25b6fb2ef5529b73556051213bb39cc4f1dc8004b1588c8de836699c66ced567998523ad3ac303d9e13617ce6c1d2fc4c35b22a24504c51f64155f24d91d0e8785b40912b3dcedede71a6933b36bb514fdd1d3d843aaacf2c1e79a5216622c20036c9c999dac3a5a2d43fac3b23119927806f497b4048f561a2276fda0302423147d35579dd4411416f0f59273429ac0464ac49b230e29dc124115d18a045663d228bfdac9f57b0c5b4", + "signing_randomness": "e1425191d9b51a40f04e93babc2c98cd6a21745a48bdf5745bba964527075185", + "sha3_256_hash_of_signature": "dca9501d3712e2f2ee0f49f31ecf9281764d63358b767fe32c4657db39eea652" + }, + { + "key_generation_seed": "a50fc40f0d9efa5d254943dc599f7dcc2f6d197a4d2666d5d69cfaccda560817", + "sha3_256_hash_of_verification_key": "4047ce9a38e161a7a4d5acd92ac61e76beae7ee6344f1e4e55928eb29a4d7556", + "sha3_256_hash_of_signing_key": "8d481db708e2071131bd2a7023a4e0890e9c3a092af2f3a525a21c065df82dc1", + "message": "2e086fa0c4582e0c6ccb020f86a6107475985160bed201760d6489cb05b8d21452c81bd5d317f8857703daba24e968f3164c82a4a9751dd88742b72141734dc0b4a77cbe2ae1c287a396a2f5804519456cf1eae273a5c6361f52c35edce5ed7388d61d01ac040676522c9fd7b02a7deafdcb4169867efb69792210a7069287c5dc958d0953c36f84d9a26989dd3b726be8b94b41dcba1b5374123f55a6dbd6360698551c27d16baafbb0ecbe116b44f11425da45d7fe8aba91697d83b6896a06a7888c97a91406b81b3a5bc8b68a984750893114b4011b9c8beba6f5c2d7d9f2c7a27030555633a0f90e30753a04b1958141af7c1b95ba208da36f729673d20da0a83f913bec8049f8cd032d9f9dd94b2086c61643ab2cffddb2b9be0af996d642b7a0a31ce0eec8c61b343aba980fcdace9ced7be4c9048b356d41002eee0433428846ba4220efb7f493ff57b0c706282eee448cf7da9b17b32d0eb0016983175469aa5bba53489ec56ba3a92a70fda2390e3a5d8c038f496e7c3180c6971a39491eac10d828d44b3de2be64569b907005783e62710b9ad8eb8c9af4b04993d40d1ebf165efdec748fe9f6b334da6a30c568bcbad095998a47242ca16803fe1720fcab85233ad76ebde102a5d93ab98460494bc886bb04c05ae89e157967747f8c050b33cca52ed5e59050965523ec5c4eaf94cf2f2ee80c35aeedd14e65d937c92855d03fc76abaad57a21a42420819ebb9aeb65f031f9c4ba0ac2ea27289e941db89669a0620797091aea3ebfc2ac354e94d27894f444ff9e604c8bdf7d6c00df0e7fe9827171010445e737d0a5867636e3488eaacccfcbac1030c0dfab639ab45c5ac5435e2c5b8244e58c3a6bac81eea408020bfec66ef55fddc618083ed737f4dd3bb65474487caddf3aa2720a6931fc69533b6491dfc7e6e5fabf8103d05f870bfefddefa20822a68a710b517065bd2478ce080e5dea09effba3a136c1bc9d7d8088f736c363b30e2af2a6f2395ea8161cb64079340fa642c7763e3bf0623c968a16263cdfdf1b8334e427955e20c1ebce8c8cb136da8d002d8a9e5da3b1f56668c1c59e20dc3be026a43f40910d3a2b601d9d3ea2bf6d2c2781f976ba840fc986c8af0df84b8b0fb291d1310039d6914f8f7cc6b26cc33af94150253e8eb410344a64344a5a0c06e0f3aa23c68617c6f4659df79285782c89bea3091083a069ef8f048371cfa054de45e32c19a44db5d435bc8fef5570b68d80d5bf5dc06da13c36e3aea341ca9fe20047ac30683aa9d862306534ec93e79eff79fe22e3ba15e2ba3f59f7b8b9314dce31095d3015710c2927b54ba6f46d3981975229eed16c9b17813801c7d3cb3604de9b7a4f18c2f91b2b50c1f43e87198afbac718935db9cb96d9fe048d969635cb9f4dca659ab1612a698ce45336b8d9ff5468301bf05d04b3558d66e88de88427fe87e65d36d3c29fa3fb126f1f294e9bb391ee427001c34126c6622905514ce153682754d7fb1c985ae4da600aada1593a0a214332b310620b1b4e95bcbfd6eb8a241cbe848bab37462224994e0d2f3f4b521dca4a9a5ab10bee741c5919907afd2552d4aa300addf67cec2862420c8d1d8dfff60fdbe2d4a8d03c92e23bdb3400f5390ee4b141c5843b1e2c07c9afdbc70e3fc08e2840ebf3b0e5296e1ee44d12e68240fdf063c07bebf01c08586e8153068c1adc744a7b54f53b0fec3c752da9f6f989a1afea4adf1ad6ae926cabe4e0cb2cd864412daee377de559a38047f31e834a6ce56d4041ba709945f07e514f96d783f32b0efcc8b889faf2b6d217246ba7c07b687e028f23d2409bbc12d6ec0d94ad9697bab6395b7070b6feb2e907a119209c9b7d86af953ba7d2ea63982bcd794a5bac69407bb7cec5e027833b17420f146ae08f4b753bef6ca0922f3294cd2a670127f9d2a2ca78a30f62056a425cbb7074c9a55135bd06ce677abdf33b420f66cfdbe9461bfdf385a97439b3431cd29decd9b5e59ec3adaae879a4e8d5e28ca13e73fcdba51c828de271207a5deab373b1b6677a29acb87cbb01f10cd2c090ee66d472e8db61615a5ecb84a7ff0988dd0df9831bf43d732a12ec8cd50a86add12a5a2ea765744b05f73725ab8704eccb08bd74517f21054e58903481e7a724f7ff24c43d6cd23de84cd69c9e464e67003903c3858a6724247eb929716e170e2d2739aae10b88bc3fb8ffa849e385b4113e78c24de1673fc7e7285e6e3744f3843ac7be7ec16bf74215694ce467a2e859dd4facab86250fece28e0a6a31dd529d08566a6389b85c310c28a8dabbcca9cd6a631ef0473abfd6846d8326561cc9cb8181c1593d0f15efb8129af9e838af518477ce361640169d9731fc139881d452773f21a3e79e514ddaa513d7b9f3399c0c57d21eaa00d44a7f031b79cac9fc304e936e75a0cf8d204a6cc3c0fa7d037dd8acc3a33cf5718061fcd57ebd06a607fe0bb0204e687b2a17b1ff47da357b51a753076cb89422098d4f880f831842957e648c54adbfcc0e488a95581e709b5a5a129da7ec5b00ac9b18b80533f2dd1bd0f475a61db18fc0c4ea655f602b207b572234230c831b26cecb7bc3284797c4bed5a977c3bfbeafea3dbfc4257d4c2c5bb8689830ee157f3b5aa1eac09cfce0555880a074aeb86062a8ace19acdc1a25f8d0e454f50f119d12e707d103f3c1a502d4e358d563e53554395b5d386ad49363978afbca2f8b673a693acef70d1db4ceaa8fa580160924d4f18119be46c71e09fdee45efb14a74db1c688e99e24cb6025e73a3e7f0f7ea9c485274d2b6cf9784cbe39e388f9ccf1e2e8dbfa6db43355391a369def645f815424253abd0b6de9c0a0af156d9a4eb7474a2e5937f008134debc9fc7e54812967fcf5bce28fb5cd43f1aa240ba2e9cedd6f350d556db1658868091e6034d7e1ee5c6645d0a345d46c42e23c6821c360f5acd13f589", + "signing_randomness": "6601d5036d7237da65053579c4fa739ed41e174bd433f3f0946f691fda702000", + "sha3_256_hash_of_signature": "ea80de59024b03fe9793fc7a0d3ef39401f6e467d96b259304e3a78ab4822d85" + }, + { + "key_generation_seed": "4c0f0ef1ca8073a562d5414584edf268913d53d5fb39fa639e02e900891ea82c", + "sha3_256_hash_of_verification_key": "a502054923c91cac55b86fcd1ed28b35011ec10cba0e084a0be1be75eb8ba58d", + "sha3_256_hash_of_signing_key": "6c37a3bf7e95ce54cbcc2e82ec9ddab37b63007d4cb71434588241e0f114ad39", + "message": "5180b7de9a84f651da10d334009b3d65582f3912d329fbad4ae39a9eec78943338c29db4f49ef41e3c50dabbb530e99113440383f20d5a3a8ae279a6201a0c84b003f6717c709c21ae893b6e412d87f8e0cee5a89e60a14ce975a4d42e4f43f4710fc9fa29e9b2afa93441ef5570123aa88aff009e2507a3e60a79cda25652e3ac3ac0c10a816bc04739b6fc758ff9ac467879bb67f270e4eab43f10a633e5932b8d6dcf23814de8643407b17b5e2a91b340f7bf6882db694de4dee4c480ce037b9f9a220acdce84b03746f307a6026531d712c0630e7de3add3a8516ba602d2463e3478008b3252b658fea54de41265b5c81e4e913ea0e2a63309497abf961ec40ac374adc0ff3c6fae9bfac5cc2df475885b0bc636702828489183cde1a2934f2d63828ad1f2b8cfaffa53151b0ffae6224df54c2ac47cc8844b76222c2a3b6e132071150049b6e46aa75dea28c13477980315fb64ce500bf0c6f633ae621d65b331ba96cfac162dd7897b8505257e228cb621bba9176a7afb3a2cc20d7804ddb3aae4b87ffafd3c8dc541d05624db02bd62491067ec1cdf73147014febcfa5b561756d5e7a13b88d1e7b2c0375e1d0de71ed20ca9cc4e6dacdc579f1ab024aae2a0bec9004e5dd81c046f00a2a4cb767c4eb240d205278cb863d1a61def16635c6a84c2406288410fa4b73b21077d8f7a4075a1ddca3d0d334725151e434bda80d3e73593338b07958d27337e32cde0010dfe5e58b99eb27a97dbd1c5e6f9a552a02726aad5a4aa63edc336d83e5870dbd514193367af2274804628b4eedfda3b2a155694e89f5a6798c5d6e036159c1f00d8dfb03d41940e775974b11c3fe4456e07b127ccb44e6fd6b2918f57a6523d7f77f32478d9f1bb539846793d4284e2907830e5ea76054802a266c85b122a389eaf4700629036716e2869c0fc9440856d562711e903a1853bc68582a95344b612e5cbc7c5b2aee23cce4161a75829b2048742fbd65abfe2397cc7d66023de34df4f2df8540cce9781ed6482d29ca4e906716c8cc9596b158eb51bab8c2e00253d6589a99b3d20fb494834b42bbffb80e7b0441e356b541f83877736985f6330ea459c007ce8bf18d84e78e36482d581dc7df97528ce15f68e604b4de62422b3aa76f3e7e5b33a49cba9d89fcf50deb65ee45173795393a50fd4c60cf6becba7e733513537d13f89fcf1c4d6437de0eae608fb11d68b9adc0c3a19a3565f6d62ba81a326ec334b239b212b87320c03a75c58dc8f828c4195ed9d7acddce493123e235d098e9dc60f5d3a625e1ff66f245e9977f9630a40d26e3afb6676f5122a88ce5507bd825757d9ccd53fe574fd0e6e728da355403ad664ffdeaaf636256fadc3283d6f15b297f79216833cf2c745c4c5e17d03260a69178f2216168bf8f00c9889e1e35540254f150c587a884cdfc9e5f7d379be474356c06943e416eb0697a1ae989ab4872d0bdf436d9ffaafec1631c9939fcecb84db2846f12ca395f506687b4a5638085bc6ef58fe8e2abe9f8d51f272ee855e2db84a89d348dd66950b8f43939db897c519fa302594fd1fbd6b6e94ca8ff63a7949432dc2d35c60803a570b1dac95ee0a60c62fd18b3319601ad29a156400d392dc9a14ff50af6752c1f6edc2acb7ecca71097b6e82227de429f1a29c5e38abea1c74de06e6788cb1790ae9f0e8ab35afe60b001f45971d42949263aa62519b0d630281a4c5788d5591b1ef5a003c58987e8665701e5b1c6063f93533094e96820f918c354903775ceb6675c4ce9cf940c4beb8845b4f5e1f642bf505821e5a23122e2d1adb82a63ad18cd1e4775a96ca9ef9493d75ff784a2d4a99f54dc3f87828bdff4b3a3d98fa5a29b62a85caaffbace4592a81bfaa5b8bae6606ad25a92a43140690a6003aa2d617fc707a53ec9d868e33596e098773942d798263f58fe5a1b23046cfa136ea35203b90bea2c5f0aaeb5ea8c24b8b8cba14cdee28f45d0278f193228484bcc7e08a75d0064d605d674aca9019a0a9aaecd6ac672cb8410fee4192e6dca7855fbb1c584cf288bacb40707d7e6f8ba2956f6d099f52bc7b0ad72b5a3ffc03c7b47086330244ea5d393c6b9f256fd82d5cb9436a469acc3f8fc237146895be148749f82d39b7ba4ce47715bb393a96ab471665529ab9e9958b12396c1ba7529dbf289184ff0f635c2ba9df301036c869d52d993463222b70ba778e81c8dc668de41c0356eef5c39f1bd42398bff30f959e115c6b386e73f0fe28a2665bd463c781da1c46d6d4ea284b152c8c12426dc9cc467809bfda6fbfbc0bb4793babbf6ad564d57ae9f5e2b7f651d6ed980f8b1174a126cc58b23c32ba73f5031b3fcabfe7bc360aae412d799cc14d8b252d9f9ec9005b7fca04a88cc8ae9f7aefca94137003d5764faa3c7c45670585c84f74c4ebd1f5ad1f97ea093595592fb90e3cab01f98f06e114f13de67cdc36f3ffb01c3d51ea643c25a3f6aa2c57690e42b98583d925ac7b06a349782a1d33c06bd05a82a7aa3dd679326d948d74a1861926b45db78d36070d3087aa9c5f4f42ca57ee9ce7035bd88a85ce1107c8e07e5ba3a62ecf012bc75fbf97c4c72331b55ab9a6effd78869f1cd3f330526f262f7dfcfa2b084b61e90772d5fce8f038c0f72554467192cc8a27f1f53c8714da1864815974b00991f466648478c5f9bf036dc4083d72e8d144ab10fd32408da7677729347febc79e48e7b87388d9b59aefc84b5b3b589fd91863811a6436ed76b43e657f7ee03eb796285a4d93be9aaad1e1a1e81687e42ec83f3dd059b78bb7f8ec70e6c831db5e90c6b3aa511f36507dbc8e7a77df0f5b9ef03bfefe9471de7c7fbe67b9922260d3703d95a5bfcbcb62d830e20c23c6cfddc210e47cb575957d8c3514a2ed4561c738928f210057896eaeb1499d4ddc70f44e30661e780aaf5c0a20c8553f40d7d3ff6d120511c1073510d04f2de544121ab851e98f666906367c21302eefb1aaa723f6a531c454eea0be7d50", + "signing_randomness": "fb391e8f6b6c6cf4e8e20bcbe3ac3e06718ee1e191951b5fc97a74eb1a51126c", + "sha3_256_hash_of_signature": "c5d60818f49d5eadfc5b392c385eee207ab766d25c30a90da529900d995efb46" + }, + { + "key_generation_seed": "5ba8ad9b66c93cde7e7e616a97fed8aa91bc7235fb4db086cb4021877780c6b4", + "sha3_256_hash_of_verification_key": "3f369180f91ffd5344df48bc20a300b559883dbce54708165ce9e1a58b84b970", + "sha3_256_hash_of_signing_key": "d75653fa378da7a48f7a643baa1f9ec6642637d1a632b4282d041c12a89c104f", + "message": "99b5b6fecdb52897a1958c5c3d1fc2f20b7d045f551856ea3cb441bad9089c64cb9489db6b63e0655afc4c2fa73c7417ff1b80b9c7a1d659687d2c415b3a909ca30e96849d4bcec6a9a6a4311204936ba972086b2394d86e840770d01550caa6ad85adc0ec851d2b3808e4a0e9830b99a70f6204ed4dbcb6759f6228126039607ad7ed8eafeea28d1c3e25a46bc18af7e01f55fad8244f15de36f890416aa09548554338972c5f88fd9357792819e51a63d0b872b0a4d21ea3597405b52793d50c6cd70b52841d53484bcd3ead004cef0a6bc16ce74cb8ad0848000d8c5158dc16625112d1d85d17a3c1c8bbdaea42c3a43e9930724655592116c4c6d0b8b223337ee4e754541a09d898f7fed71c3785b7f8721653986c525bc00f15590616437d11f9722824dfde7e9615f1fb8488e5327e4d8baf5f79d1ff5e808d154951ad87638910607b03faac3a61fe9916ba65ffd16986deb4169bd24a72b1c8168fe569f3c81f93f3ebdd21d4e806f79fb28550912e9afffb52e97860c4dc0d042c56e1bb71c28b68e416874ec7043306a29bd1f4b9a3e612a6778315e2c2b850d6eab9ff1905030fada250caf308735393c191134f3c493d00b5695775d82adb9f2abdad17fc41fbd7a1defe337c2f8adf69154cc0862fbd43035295b1a9c80b88fa8cf75b36ca08868f881966b41fb3e239eb1db9cb51606a0a9ebcd552b2f4e819e2c30abdeccdde88d2d2f82f3585b5143943c929591d20cef559cd2baf2dc7fe03c9e4e084e8890fce64a4aa9f13d5eb945ad7e3cc53e01fcdc192b97adc1f98d9e773a0177e8d97405808ebf48bf17b689bfc15f4c515e38a855a9266230c9085adc9a6ddaed93d80c3f38bc516695d202b4e89da5b4ebc43788c848f8c4a72f79f37f857edc105f13e4ececfd09302711bc1993f5308b8f32ab96fb8ec3f5ea0531dafd0ab3451f81f47e62c593c8d3e3beee79db06909576bf876145856f5f716caa436c98eab28c5b85bc2e4d7e1653ecbb8bb6b5bd6981dc72d7f63ba06cac8197eccdc72c1481db44724a3c21f7fc60661f11fdde8122da5d0b1d72a29952618b373423a892875e6ad24d0916109ed8e9a9a8d9a68acec4bb5eeb0d00eaea72d8d5a76c2a42f18cbdb3d336b71c70ac73d39d7eb04533453779a1f210bb4fc056b4728afdfcf46675c6ac76f750626d642e3ab117e5d6740154759a46c27d51306587650e1039054b876849882e7dfd807bd03e69021e337dd69d9b097722c6d2aeb517d773d2f7d84d69dabe1a1d6422ea1766c0fe7b8dd4d7283f2985d96d91a132b8ba03ad85f7d56095773222d0afdc5a192d29f3bb0c2539a1c99db4e711b6ace3febd58e45e99c9f5a04cecbb309d50397f28c48bb9cc9f9cf75a52253b634ec47216a1fd6358af26501821864569879be1736b0ad242ab5b8ed16a7ea0989ed4cae3567afe1f8209a028db46db0270b3bc06668a9bf5e1bc1061babba00ec4ec37280379139d19bc6072cc6b7d260a816cb82f9bc90897be3025475af12191690f9f400a914789a860155efd2d606a15895378c827f2a4ff700303962fd96db2dcd2d213eebb2460f0b753bc6902da81d44c983dd027f1171d40a2039997241e09ae5b6165b4d55a8e4c79671a8b8bdefef2c21f81c541a5719deb939f866b61be250af371cea7b7525094c904698d412737f7781bd779365f122ee627d9cd4a68da9d5be1b0431998aacf824cdd864c7365c01cd5a5f480b6ac1e5fead8ffe40d87c1f9fce81867157242285c5e76cf9667919c29a67ca0c0a61d7819d9ee6b792250a358f5691ccd80578f15288f3d5d6d7dd6dfa351fcf8df0223f7d1da1b76711fbe0e7fabd30377660ace7b23acf03abc1d973248cdd0897773fb74e20481ebd3e52657c9296b980905ad29271ec128513284f1b78f38634bf84cb80791a0c5649177791cdab87769d57b626f78a03435c758a207f52bd2a1f31e34b6a122b8701cd9fe478c57cf3535b6d51eb46caf794bd69363d5a56adde6945e9788f1e1dfd045bfbd0a68834b13d6b9ec4ea9c860eea0e9ac19c2de14ffbd6b57e5992b08943ea0283813f3f15e4f928b8d0f13de6863990f5c77f130c97d8be12571edcec7deec4b6ef4835f136da45da70a11f9192478fd8b4846c507410fd11668365b05252e68cb2c972acf50156e369b83bb85e62e4bd4d84c2e9ff41a5844d5d88aaae7ded852daa0ae5c14a5dce64c7e236e9b7b60f5b5ad4d953a2d842a52929491be3555ab8df534cad56dbbb86b28a8a86b7bd9ad1c58c87b8a089324e00fde32f8186b2b74523a22904c18ade02c3e965f94624f8df57e750ea6335e3eba705294b76cd6ada33d90fec1f48de7ba9dc7d8d60a53d2563964188874810c45736c57efbc3a3ceee7238aee5281882a554f2143bdf89ed4bd819c08239c187c12a8b6e763434b92c26fdd658b350f51775c60cbab7a2cb120db8ce8ae9aaf6af559f8cade84c4820209cbd27cc09230b22f013a0e4cf8041e4a789a5d20be9914a624ab957318848addb39c9748c8922c54327048a2e46523bfb22487538363459035ba49858f85a469957df1f4831bb7ffa0564c53233b99b596f5356089949306dedd6b904433d25c4854a80590b964df6b0703b4f9628d6b9a4d3f0a4096e9a0b46d6b32f66d563baf688add18de001da62e33c503a4387ce0920ba5d1e8b69c38e3745b19f8d8b6ca5e1ac6de90edb25fc32df04f0849d769fbed3f8169ea1d2252619a2304e055370b4443cd23e56d4934f9f3fc92f1c1eec626657e6a89c1394e56061af8ece3e2a17fbaaa4d579a99a7998632a6ae2683ddffffd27a27c8815511855f09adff7bc627a7a5c95fe57fa3ef81f494fa7ea6e6ca2d14775a25beaf1b5a3e35ecd4a306545d597e4e44301c3d1648f0a7d841f2f76fe59c6eafa3f5b58907fc4e642ecd28d16a71ee3d295f1de12de1485b9cebeb2cc6c9ac051d3d42b6a1a068533a7680a98d015b09c5b819ffc61688d441c1b7fd71180c4423e64ee940917c7dfaa19f3f51cb5b38d1b2b7c81d10e7c", + "signing_randomness": "e5580b2a7b9d30906d0d6d9b88ddbd8b5a3ea18e231cd8e8b05b35bd03a24695", + "sha3_256_hash_of_signature": "a275d7cbc73101adb0a584980f4884c504a86fc37bb235c487d38f03e036614c" + }, + { + "key_generation_seed": "25d957b9bf68326d2efec93da464f43e3df16dd6571ceb1ab68bd58e87734a51", + "sha3_256_hash_of_verification_key": "c036acab695d7ea6a9a6f416f114fd038419e5dd4940b22891ba7ce1a763b7d6", + "sha3_256_hash_of_signing_key": "c62619d77856b62f453794afe08ed1f8148fefd4219b16553fea43f885a34919", + "message": "e3b57b208352a820f622a694b7c3f6f297239ef0a069615dc664c02f1822bba48e11e37bd9749c98facefffb0fe1792a386be10ca7b98cc874c68c36f5096d3718dc93e0734d6d6f913e3b958dc1fd1424818c9437b0fd59728ed46a79fb52c737a1d1d26f04ebac279a7ff6a971e2b69576b712d9224ea18fb9bf4e613a8935f3b36a073b01f37bdc0b77981c8f2804e93c395419352b85c8a32dd77d41da9bf3ecb914173e80dd1fc06e8ff5bf0e4f7424849a15eb7faf7de77456ebb64d10dc10fec6254070c7df387397137372ea3a53dfda7da13414af2df16c1e38c5c70a5f5f44f725d622049256bb15dc04a8d846a1a0dae7e765a7f00c498f1d0b2893b8405be4a43fb7e97881069a49134a2a847184b82eb5a690d87baf2f579619ee19a3d7a7c7eea72d6e3fccf0a8092bb8d3c6b551f27e63e762a30b4a4df2dbc4d119139ae1b135d06ff827846901577700935e0011b65461c2ef9a7b71eea33c8ca4519c7bcfb557c5e1d42d9243f2dc34057f5e0ccb9a457fc34dcb10d9b47f6ec3b9550d3ae4fd593dfa3e28c6cca1ff1ebc9d98da8db869f8c80bdbf8ad4684acb6a779ca9d0a106f26da17043773862681c5dd2deb1bca2ca48d4fbb4bb7c1f765dca3a1d991d890b9a8751ceaff543997fae5b128ab2ef22b3be94499dfd9d8e78fb4c82ca8d296b0415e84ca8b5f2024455b5decc8b4ccdc7bc4ee06b4f0c66e6748fbd07e3a3bc5b4b6889c40dc4a97ae3eb43c3914def976efe3bfd84a093bd69102d7b37c89b458a55b98a1974a13a7685d26e9d816c79585bcfc1042c2af88534a9fe8b0a6c8c44355a6d606f902db40d5490264bf0f352c27355633cb095268d5b8bec985a62d84b2323fe814053f05dedc22029d2998bd0bcb255c162c4bc03f60e3580ac3ae86c37850110e9a1bcbd75f64a0dd60b941e2f57da9d72498b3ea8324eea53da3895585ed2942b9140f260895dc6a1131a4c3ad2b64028bb8c0fd67e1be4c07f808b47daef306fd9578025f9c639660075837b2c95473f7f860d6ea2c53f4ba677a2345cf212c7757bb94f1a4f76d4e96625f6fe051b8246d1b7611bf6fe325ffff8514d2f9a3453f0e77ae8b958ab5b567e541f156c6f4d315b4c3c547d59bbd0d7403e2e6a49b9e7d3fdba338ada41875ceb03830a846a1fb266c0f1228aad2b76a2e3404278dbe482907206fa66487ad2c999867f870c8cb7a70b83437e14b9e893bf6b391dad75e84588e882246d161799adea63adf1ad706c0a3b76bae595d84b21ae9da30bbc0856987f2c2c543d977747b8cbd5a613b92804ecc5284ed23650e9dafb4b76d63f069710897334f18ea6b0cbf99cd590a78e3b050e1bb24c86d6323a17106f0cae3f30b01e4eb3db1b5f3a4771a880c8ac06bcd5a82d4103d0452fd7b54834c1cf8595dd77f82d4ad9ebc1cfd0c9a8cc787e10aa4d1688474208b69ff7ad4da6986e5f62a34ac3093e0fb1efe8ae3a96f6aae09b0e8f6e7a2b65c7387999cecca43cc33f026dc19bbfd867c48127cff579d1d71aff0c4a0e20f9fdfd599a6169df1b85f6051e02290df6f5ede4f29bb6f0c8f806d6850c6534ecddccd75bb8e4a097c70445585740f822e5cebb0e19eac82bb78ebde2ca60a810ac6c54119fd6427da8a0155ef48653515a919b299a306fd3c62b505a6911db2b56ca2f296e487ba02c546eca2783ade8e46a8c78eb1f3d7c04bb24548f92383e475ce6e572d8de1bfa9b3e35d9bd6c79547b592c95693750010a3d22cbb31aa5a4abe94897831b1ed9287631f006a735c36bc84a8c87497eea4873801a733f35b328c7d2ccbe4a41c193d22f972571ba7630b33080793498cc85e6eea1c412914459da175a6db8658d0bd7a823fab286edc20c785c40bfd539924a24af4e3d37bd781353677c76d4672098f5bdd17017012571d9afda05a40ab56998e40f5e359c43dfe32ca10a45bf08f67d128c24b1acc03cbac46ba6ca5a532c105e91e0c77ed59fb534aeecd68735a4978177bb5a656b9f83b202bb604d61a24574c16656e512c0a4cc6f597b3268573e10539d1ba775ed83bb680bb9115011c6ad43fbb66fb37c467249060a1586df27b2cefa65265ccb9051e468000ccae24f08ba941a8180a64bb624f146c8ec562363b32c369f62997c4b1375dd7de64725a598529244273caf8398913c6fc01522683cf1f9f965c491abe7a554f0019514ed98d75eb8bb8565f77c195f629f98163494b4aa2674f92a41dcb67edd1d818a5b98993d0b1198bb6bedabbb486bc6fde039433e842bac568a5b4eacc028cc2544b57d8883848dddee2e967ea85a6102bd0abdda41c3d78447bee1d4949449abaa9b3377e8cedcf04a500fd1a6916e26983e64b5e96fef87b32a060444d374409262453cb1376c349a8b5d1767b1e2991a1a6044e0f58831bd11f12159675d215d7eaa74807c995fe22017e30482db8a4b09ca7800822c75c92ff649fc0728f5a1d44efe7d0ff147274152d5f2f60342c8f5f951d8c95f83c1d54613a182d9dca68f54fd55047f1f90cfecc04d733dfa82cff2618f29a4db4f7e1e59dead58ca65d07cc90c25f804a895d6a82f9375451cc55506d276fbf783f7d4d53b9bfb83dbe4a8771afe21ac543983d68034badc980f9434527f9edaa2e228646fdf75b44899e749cf4c9e5b345222385a4424382603ad6efc24c56e769028f4394f2f6220a9b390d395e412498e57a08bad927b8bd5d76e18e8feb457fcbd3248d218236b07783e57fbfa03c292a9f5719e6aef2eea3fab2caeed5442e89bffb236cb13db2cf9c35a38c338c377c475daf45f8ea822f9aaac13425fbd43d3dd9229367f0b3687d7e82ac5ec2fc7cdb69c99a4eb1b8e45465c6a53f16ac0c4e0c970b8c732af515c09eaf25596f64a04ae4621037b8841fd2b1bbcb310ea23e122b0b9ab96d8f7702952d0e96e4cf79c2a30df0091acda91479ee2979b0054997c48f6a0e909bc52a943459af25553969eb31ce7685369a7fb014561b4697b8bce220983136e5eb2303cca4eadd4c6cc74ea2fe69d448ae6ed953a80363dded5591b27a1ea956df081ce99aa59dfc789d9d8fae952b0737099d467d", + "signing_randomness": "6db925e3f0c18153a88305735b7b63fbfbbafda43d53f6db06b50acff0d75bcc", + "sha3_256_hash_of_signature": "47ce50be1a1e2579015dc57ec4fa9ee8e27a660377a0d076127c84b1f65a1e98" + }, + { + "key_generation_seed": "24f0cd3b05d964f82d3702bf0a613139808d49283286294be57e13a983c3c961", + "sha3_256_hash_of_verification_key": "7b6b51e56ace224d0320f520b4f0e726dd0f6387efbdb1000d29b459e8924dfc", + "sha3_256_hash_of_signing_key": "954481852fb99f268dfd3f38fc2103f3a952dd5b701efc25d06ed783486d840d", + "message": "89d960d04a3df6984276a3d17d59af9e72b25418c8797170fa701a672c5835ceaa22dc35470d038c6acc5082d2ae329f36697c91cbb1f9e42da59a654462bf19e04352192778cb050db6f4a656f6ab0bd9641ca8ce6c1ef8b020a3d9fd9dff772f38926458bda6e6072456e506ae464785399ad7b498afd4c211f09d0c722fbd9e20890cddc8c6eb9ee75390e6d76d0672fa64d8b97c65cca46dd1f542b6d6014f035d2817c4b9430ac8dc318cf8642ab34f4c8d71fc0e3b1fc961e94b6a84622876250fdc21987777360784d9a58f35e1c9b71f30561ed6854ee9b112e7b20ce064272213bd1a46d0d19e5efafaac7addf4d7b7a519d689398eaf1e67e64ace8e5e89756377e1fe458d04e3df7f6680f8b69815680276acdbee6c8e1aa909ec56994f3ef3b65fbefdbc29aeb0ea906274e838cac36a0607716fbc2b8da6150a4ef39e1cd9cca72915007723c5d2442f7133258234d18a257da2c13e53b47dc6abc2d607b98e351fcecee8ba8886821985bb3a7bd02429ecdc5a27eb04d01dadce88a324ae44f567593fbf730c284414056fa33ce90a6d6f146dbb1635bd26b4f883d4948da47216c70d2aa58ceb3979523c6a4f2f7ea455a97c7adb6c43685d63bd4c51d7ddcb81a06b9bac31a7b255b94052d686128d234bcb63ce713028451b18b981b83da1246281fc3bd2b06c741cf71979daefdfa0fd06fba3722ff7bcb2821fba964fbe9f6467fe583c06d3889a40360a7aa03358175ee75eb8fd1d3368c30b5691776c163764db924fba2362cc9572f642cdd2b11b40fa2683a529ec2100dededeaa70a1e639a71d6a96ad31f70a00fb63875d0fd5c21e56ae57b6e74eecd2ef34bb3e20be5a1f9f1f54955a18b4e4e4b9119973deb76a2a603fb6410a350667ece5c1c147dd00b07a88a7d0e86aa2d747a867ad90ba6660c7a0432e20849ef642a20cf5a20af7e34d139b39dd65c65b36750f17f0b9f1db06cc6e16f10eb289f567b647454a581604f381d66371238ab785585a4da2d00810ef6851a6009025fcadfb77ff7996ba6b091fe4130733466b29fed46554febc2ad291dd966bef4d79a9e04014d3003c95696e8bc39892ad32db6d6ad22d33e931bc87f78114bbbd97b334bcea676f9e9db23c0485ec06d8f37f070c143117b1bea49f06e1a2423d98c12883d32d29103f7699646e7091d393b21a260703e17380a1bd85452702c3af7df73ae7856a1c066013014de62c3c817dd74c44aa436a71490e7bdc6b8b74bf61711fdcc541ad7dc49cf4c3ec154879e048ff30df25065b5641367cbd3bba19606a9a27a64055d5d3b538fc88eda66ff9f26e619dcba696866de54a8dc8580b5b28144f952ffc6dc543e98cc9fd7f4538135c0f4deb4bf892266dcc48a4d1ddcf407be4fdf2a5afe4a0105a20ce2b3d9f48d608de2315240875f1fed696c49cd8d4a78ad26f51b3c804949c536ce35c3963dc1d238516b3f2d297f5c9939a946a0170e185c75087f37acf907f9e3f87a2b15cf81c7ecbf2165f0f3962d11e9c6a7845ecef432ce9e1fbe74c77ea1057d79cb595d47a8ddc1d911c6b97af76d91f3515081b95ced16275decdedced9ac790d73739e35973834503133510dbe39201f9b5c618231184b9dbafaa7ed6623e8bc492170812444db62d4f01925dc4f821c0896a746b4453e93ee51844b311b0a0a51601477bff651eb5ee331227a2e9e49f593eb2988e449e750e990a8a89906efab00e0955c81b6aeb160313007b481c40908130597626935389e47afcb0a20146f0c7b29b567e95d59ced7fa8023a2d69c89443a11e7150a03d09ee6b0f74358141d48e9bcaa3ee081c7d8f8c223f4d48efb3df8a4e287fc5b90b4fd251cb616687ed09ab1a06c42eb9d6a578d72e99d499882d216ddb3f35b0a33d9f2d3d4a700161a5c3b5a6729f197479e78009794aa1be3c25e0b9142613ad2ea508acaef5eee33dacf60cb7a16ab38d9f3cafd2150081b63a3a6ca0163a25fe81206a37a0874fd55fa3068b4c1b25e6325fa56646ee5f3431d33d0bc691c134ab306b0bd2d1087f4d898a529dae08b97683fe2eb8abc9095d67b79cff0e77404c1f7ff316c3cecbab77c710fbf961008047af22805d77eff79f815b21d142f517da2199f6627ad9fd85aa24e9b7f40c7796207a82901c7b5a3a42369a9bcebc24ece13a3ed064e4e748bee2890bb21b8e4845362be9aee46e25418f7ca38ed087e46e24f12012a1312bc623aaba6ed227cef116a3c2130b4b837ac77d86f8ca3553ba0cf5ad45e9b4e4e55059f1d4675291581d7cc9e5839212afcfa897e90cb601cb33a4d2241a5ed5925f6416be5a43d4767fa04f701076ad5ed5ece2d09b8daf11b00fedd2aa2e748cbcbe365031394ef823951ebc52b3e4c79d79234c16575910c29a35eb67c624f7504eeca3921f461d7f95eee39638c402481df7b59310c4554450789dfb28ed1e485c0018512eb05f14dc7a3db5c0606f9e28420d76b8f8534d2ae31aa01e90a20e248a7fb3b72ea859031c67f7b2b043d38f7183165a42ab28c6308608c530a9ca98f82c133bbc313fddd2109838e970dc9989ec14df781a518f6cb56dbedfc1e381250c64f95d0be5f37515437673425374d44811f4406ee2b5130334ba555839e61ae623d283c77247d2ef8b22ed138a526f7e41dfd41fc69a2839b77b51c6fd96d97d3ef8359e8725ba1afa80278fb3ba9c697f7e2bbcc5d3f0f2e61bfcf542d3160ede02cd6295fcc55865e7890342572499347df80ec073a91e00193baf804b884e9cf5c43269824d4caf7eef49fabd8bdc5496d190263c96dbcd287681c19b90c34635ffbdfeafe0601bbb7514fd84896a22895e9b21faeea372696e350f13959fc23533f3e8c34b17b595f3c935e37220aaf644f3a565114c34c7b85f1a3e465470166a62b13adb00a2bcd5a9a3ecd59fb772f09dd6a6e2ad12fd54ec62cface0022f2ffe3eb62db0f4d0f0f9d1fd6f3f11d76da868d2c1c4124915de19eacffcdb31f7ca018b6976260ca1bb2c4fcd6b9958f096313b608e208d875ea5a1fa89916d0367edc4f8890e93f1e660aff16ea79d1e583007e693bf06c172105b3dc24117dd921fb60d3ac0d2e5c89fef17087d885a0794e496e3cbea333cf72a507788efe", + "signing_randomness": "d82adc2be24134146c202bb857089860941df6b4cc218d016a3257520bcb61ca", + "sha3_256_hash_of_signature": "adc7e091f088eac6078eedde48d62ebab87f75cff1de023d5f7846a7918bcc8e" + }, + { + "key_generation_seed": "5ef2732b63a1cbd2cc239ea6fed62f7feb3102715a5bafd8c83aac33702faccf", + "sha3_256_hash_of_verification_key": "b6d6f5f4710686cb8b2655ca83ce927ed5f1e696068989cff249a5647d2c0ca2", + "sha3_256_hash_of_signing_key": "47a75e466798b6649a60a45903229b722dd34cd02a10e5d8c43683ace8d99cd2", + "message": "8337940ee74590eb25e52e78e8563a09cd2d45f650f48775e3e61f9e3509cc8eb7e983310d0185359f66bd80e0da1e45a6beb53acebb9030e310e81a576d0f80c64fce1d1fd77dca27b7c6e02b0cc26edbf496ad2e3ce8484e988e56bb28153587d7ecb02fd8882545e7bf79cc9966a7fede93f7e9451bc48fdbb481673d1c4135f95d68f40f4b4f847345a320fb4d736bf5f9fd347435462dd3a238e4c799e7cee081107e11682c7b558b19177522427f1d269fad81b565be538e8ff2d7193579aee51e50974bdc0b66331b59bf496c87e4f6e143754076db516c9c538410fb38a930cb5ba1e6610441126d01c8eb5f34e2e58424b8b218d9e68c5d8b4f5258eef07ee0aa5475a72ccf363d47d825fa524c16c7b7587c44864da9e4b267f738b87f7e5701147f550cd38774b17de48e6969a0dedf334fa67470419059c4d1607880cb12fa9c0ed23032c7e0f325169eace7daccdd4c2e5097fbba859970d7eac4522c1fea043c9278c1c89fcce95203033b4cea4f9f24b55ba6b79ef88f275310c6e48189efc1eeedab66b56b6bb028726bc463d93d742492841e85d5c837948978d0fadd1c172f8859c802c6be8394a05dada7546ee1cc5bb909d3189088f4fa6d07c573ed7263c081720e701d5d4b027ae54be175536f3bd5e91993cc040311a7d352aa26414cae30d10408ddb44e8c9513f4619e99edc894f963489876b24bb0b91bdc3ee5b78ac0d4046b2e864789c0c779e5af97f8f84f09a26ff74b8bcde66c007970830b70c2a1122dc9845905c3aa7810b40641e8bbb398a23bbef52bedabec7bb54823e64177a73786992dd67d5c007d770938402efbcb3a60281c5706920a9eee4c26c0b251c32b9e1936fdec2928110959e99255508250fd5ba84b4fb314187124072d30fbf2163d36f1480ecc08f7fb8093bfaa72f1914c63533ebb3a57420dc38dc93dd6ae4d197fab790c1efc1b7a2234522e0b408d0648c7ae782f2f08cb70b96cd76b5089af1ef4ba3a4c2faac363a4dc1c6c421f6ae1e9b67461eb02f36c25e763f1a2b73ceed4dceddce619cb313d124ce6f7ac986d6bc344e630f22cb654c1286fbc0ee01c968dadd1edad744c8bc828cf5f316336a5883166ed000ff98d6ce2ceae7d3e40bbc5714f71ba9e25e1506d644fb2de2fe190d327accca79d9b6d9db505cf1853e98f30e9ba5e568ed83e2567c936a64420c5d8f07ac4f65f38c28e88dd7b5209a600aeb81a6d2afa4faaefdafd9b7fd3ad7f49462cd577204184f9d44a45e2a909373ced24ec0ee56bf2e6675c506eda67b1e6dab75cbf1822e20e7a8a81a7729b42a6d67a1dd457fcd19b62f048ab97b3d694254e5c051fd2daf3d12ad627ec37c22117bdee9eaa290d11d56baff0de1037eba908fa03e2f869fa2b27936669306e8e70a0a4910a123f202797bf1c8fe47178bb1e8e8d7ab1c01f30f5e779b2bc99902df15185fed4c865997ab72254162d00858e0908ea95a9acd0fce72e571c7a381cc33e06a27fe6a5922775ee82c973cc3ca8a05717608f8703946c9a89854d627744da475defc1390dc44fcc3a23c47aa8af17240eb1a1a00a062d258d471f31333d0356243dc1cecfc559378b4395f01a970ea4074d5666b44d49ef291ed15930dada66765b165cb8331cfe549c38cd0672f534be60f4d9b4c125ffe747670513b5744676899b256b992e15106b99b794db3950582816612144649210751f3d0dfd5b25cd393e724f7fdef00756d0c8540e8891e592507599b06edfa6ebfe543084ac81858f5eb02d8f5eb8a72184851e8589a3ac6dfe1cdcf286723fc4c1202765fa4f783ee58c627ed494c7149bca6a4ddb420827cdca82dc42515beaf46ce9d9ed524bd00ebd3094f770b1e1dd09fc431e4c244d2305619dae208e65ef385ea92f5a79f12b99afdaea79c9d8d319944ac6cbbe3f1290ec6b87d97785e059e6871fdf239bc404021cb52064b88eb4cb3fb6a871b0f76c12d7b8c5e8fe0a65024ab5b25f4c67b6d15c22b0005b754cf7cbec898b49f4326f1ae4034e5f5a446a96ce08083d48525a3661e10c996dd22dc34fe570a4c8817d10d750fc5c2ed0c24c7cbcba5cd1b2680dbaa3315fbf2ba7457abeedc96b5d111110d4678ea5c7851d25f258926b0b028365799e940a6e17bb03cb332fbc6d713dea7108fc6268c8d33e7a578c94ff75be808c15ff7884f092c0e309f1af99b1a7314fa0f32c8d8e32b3e9d92c9c8ff6b8fbb99111529c4be3a2a4f62884373d0903180b4deabe613de5cf19415dfba7f9a46297ae2f21d7ea420b41f628fd8deba55207606539d11791623cb325f1e18c98aac27283bfab2408f4fd6cc58ec9e306643ba1c0c77d84b3930263e5a76a1ce94f3d7721f0098d54e6c990c3aff69b6a0d82c853ea2af2d3d2b3e96dad59ff873171b55d16ca9a7c68dad2e918174d264919ddcb4b9d01ce622d56c599bf60711c74315c918a7bb97b9513937afb6a652da68b6b0b34e316d7be9f5c282a5e8773c892782eff220667a6a54069c37b88eb1ce676aaecf2015e59fb7af4d30c4625dd8de4805f505e83c877cd61d2a0ba65b32b0dbdfbacfc88ca43e4ddf7a1a4517dce83b7b8acf8dcaad28284039747935865daf8dcfca29fb676ce2eba2c509cd75588fa5e58cefd0694626c9bb31c3afc372ed313c9bb3adc398e89dbdb108dda63f9380ebf9da17b378451634682f9823e209bf10e39f884ed270413152025cdbf4875c121b1e83e12c044453ffda6d8ca2c240ad522577c6898ab6f2abe1fe77f860939408cd193e605f87ff2248fa163ac2fc0f39bfc38503b23f5441e0e364caaab890073266b3b51217661f5df41c0ba925bb425ab3dd7b6a3675b7d60d0290131ead53a4eab0c66baa83f2fb77e74c3c123aba7731a3f62fab8eab2a96e8bbc911e501cd23a088e7887a469284e0b5c27b5cbc1de2b6938cf1af58a47fe78141306cb76e8f2b73620bc4549db6826d2d72873885f6c5311eb5b9462bb4631d314dfb9c836c6f4d9eec6818940c04689cc4d8d11ed9869355617861340e722b2be78197746e2759aaa8d68d1965888e89b6b0f5bf51f94e586b2cb8708f4cdb520bf31ddccfb7cb69e29a7ae8aab12c11f431de40fb9e82eb5f2b6ba1f9757f1487b63255fa69a755601c2fe17cd1892d5a6799c35d05098dc133bdd71318667d47c4671", + "signing_randomness": "a4fe2f6f39d216be4b44712577c349cd8c58a9ea3c9d73926603f8d86c4b6c4c", + "sha3_256_hash_of_signature": "a4a18b37443eef8eada375646dbc7cf65488fd33bd0bcce34e6d2d608c00fc08" + }, + { + "key_generation_seed": "6a27b1666ab6fc4483d14cf84ede49fedfe05bb24e008ae8a01c52d83b8d40fe", + "sha3_256_hash_of_verification_key": "0504544dda1fc83ac4e222abfc26acdaebb47e8310feb2e5e0a1441288acaa85", + "sha3_256_hash_of_signing_key": "e52488cbd5db4f4aa678db0f0be753daa65d748dd6b163b12ac2712b477fc379", + "message": "62215248e1f3afb19849f758d742f8afab595040c4dc520d603c9a80fa9cf2e97e4f4bd7350551fb667d606bdc31a45d88836cd376785c01f9007d47df95c1f4d1e30a927a13525409d91c9f5145c0b86d3b44e933ca81e4ed9559ac17940c61eb85b2d26d2c47924ab80acbaa3d9b1c8855c13ee45f5c8047c161aaa5321839a01783b21a5ee90cf91b8285c4779465b7a89de3d74d482080f68eb2d8b47429d5475356c50a92b3acbdea5786f4d6c2a304ab500490f84fd1d0f21acbea325d62d2657f3889b6f591a7f63d8633c061cb14b8266a7fe17642dedf1d08d9ffe369126cd780d9f99fc6262b5befcfef35d33498cb2cffe55f2f8d567ea8687dfc6e7d49a61fdbfe768c1d11bf5b3b18ca52225b096490c97cb9a0b3b2ca0762dcc36b60f7d26fcaa4e38b1f3a6279d889323010d9cb0a97fc488e09b06237e6eb0166465c2cbc2b9cd06f155759b6c93ca0cd3178845e0f3a2d20a68757aaf3c4e74545494462ccf28f6f51ec0fdff4f1e6d98fc5b63bff068fa7be1764bcf14497e71e424c9389c5dcf8c5ce1dcd40b82f1d75c3c3970da433a92a04de958766ac5eb3645f4d21882f7071383af8dffd6cdd91b549f143dcf59fed6674441eeb03d5013e90adccbd7e3da115535ac855dbaab7f51d70630dc00009e726a16deadb12047d85906cff315c73ee7d4e24c9067e3b772f3dcc44c25c7cb8622fdd7b8ecf5e9c877838d71d500f864a662619b1478f8ab4db2dd09a111acc99abe737ddbca06e88926c4e73b5f5d21eafc4b11938feeea5f8d5a4c616a342b54c9ce371817aa2409a55a3237be85a50f05b33d35aa86a62e85a01cf34ee7dc840a26fa1b8c6b307817c062d9a2e7163a3b036874d2abf6531a772d4031fdcd59ca79fbf442cb9155f90148dc3b723778e699c6985634185c3ffdb966adb80a3d1308150b12964142498466506bc0742783c27bd3472a5cb45021de066c28143ffbc82b5742be51e93bcfde1a61e661b730d8760e108b80c859e4b3a07d483a6a8967e5f01b03ec8b63a20c6a03755c75f419558878a5eb8bb0b2120f183e4becd4a104eb4db62cacf5f9964583815334a25bdb75724e549211699ac3bc9b2b5f58f1fb33429905df81c9422f8b84e95a7c36dec6ae9b48d4f502d8ab59b69e9d112693578d143a3f111ef00844303950f65ddeea6e30f1286de16546f90c4364a5c09755af3fecb13983c418b2fe4ac17bdda57e4d597e8bdccbfbe4082c446fc920e5145bbafc67fadd9799cd8c7714510da579516ed39b3e22de319977fc77a9ca61ae8252795d11724aaa866c1ffdbcbc1ff91af1b8713248864a4e8b9c59dd12863245f5048110dede7fe31ff9836715886c37e9642dbd6c668ba7ab8c2b706cdd58586eb7227b5768c3509c1f66493468859e275700ea38ba69064179f6036d7b50bd232b61c9b9659492894c0057dbfb80329a76cdc57b2a89bbb910483301ca0bf6aec7d5ddf86644ff52f48ff6c7cd00406cacbc09aa251708baf3276a52be2c7b42fb6a9036c318529ca98940769a67dcd532c0000afb5fc63ad2303e94e09d2cb40ccbe47faa1dd22ecf528179ad40fd4bfd43717864149243d61ca255344c52743200ed8385a7ca6cca24cf967d23d07dc2a3f9ad5f3240f4f022a6c6cd281b6c492e8d144a2f4641957ecc65b32c9f74bb468524ff58f0f3da2f5a56742896cc8f99088574264f857dc67cf04c4b63c6a08fc534229ca8ba616cd504f969ea6e3c98a517355f98a9e884062805b77623239074206e01ad2f3fc9fe9ff8254a5d3525c3b2f0a692803500c967a2e18511ef5b8845dc4b0dee9338c38c4b1b8b84ee63923250eb6f9e9c272617c7895bd538a6f34d3557812bbbfab2b8fa6eb5e95b9bce33ad3185cd90dd536a68639022c079b5ca7748864d37d45fa6780a45aa991f28bc0d3bf371ee2ff0c913cea6db38e4a278a4840ea1f255f8e83b6b6c5e260a49d727aa42095a88cb8120b51dafd764e690102f7fa07cea2eb86ac613e7be2f498f5767b622d04e8a6f272976fb058c3334cf8caad1d180e3456c210763c974e431cbc3e25ead8b9ff9243628d5b08d92cbf1d5df29a85b1a04d2999b3c669227b33610121d543cf4a978f8d9365c0ff8affa92b07fc8c8604a0f357f3c669445685b6a29898301a5afbe10ace8d64a47009c8741d7ce82e9900643900a3b92a26fe5f24886c06ae0918c3f2523c320699c799cbf72f0ddb08a0f1f63d6dc2f021c78a9d44503209190ee4be654663679cfd292292d71fc4ba6233a196ef9e95cb965852773404b2622b565bd91fca6747aaf7f4eaded7bd3bb53645381b687ae04b8d8a9bef1095eeb39a0beb4ea89badb4655a1afc7eecb7da0d670c192297cce0b31bbefebfe94c84603ba8c0b7cc73159ff59c01a037cf2c866dc40d88432cd6c2f1989351a4e41343cacf7bf2c2b395c863709d6ec1dbab2af514cc771df14df095dea8284be2b65097d8e6f72ef3936595384afc0026956e819f1657c901b92644e9d6d32d0d95549729b2cb3d5efac9c42a5f284abc3bf5cca5b08161b09d9a48ffb2996c3d4383d65b8d1f7fc3248cbe84b9c05464f4a76efa005fec342edd56959cd26cb0dae1b61b0493a4b68eb3d6335bbc280508f09d84e0c5f4ef520d92cd34d69e5bab76df5d2b72cb41a298d370ebeefcd6c1904b956458bda581efa6b3654be402ac3a971603f23f2b543c5beeda5f018543b72c146cf04680bcea31b4a238460329e2bc12f14c804fda3494c15452223d2477c9c8a497d04eaae7de09d7d7a879d3a5dba565ae1a38f15e69c18838c487c0fbad44a068c42efb7d3f5ef488f91c42f25ac564751f0efe0ece7d98bb1b3d0fc42c9756f4b8f9daf1fd0d414391155285c8daeaaf380bd07e43570f14e9a47a87bc733f1e676233f17bfb71aae464aed68487392d339ae064ae27bd57f8695f493ae56ca96c0615bda8da37133dd13c2b21da189a7329773fd8d51381bc118645440b28fa4f402ef84c4091d3a0bc4d206bdcf9007f5de9aa1e6cf7f6058ac6b69fbc703e908c4221f9065147766e48f54be4b076406e2f9ed19c1be982e636fd02dc26267c3ed989e6ad1cce62e7b988fa7c1831e5126111a4c3c29c38a1f96ccb3a04132175fa46f73c634ac6ec741b135645abf1dcea18571cf9a539f5cc935bc6d32beb1c7b8b3b5a141146ebc12dbbcc17bb4900cf0b95ebfaa52190afc6d8933cafc9", + "signing_randomness": "257dc9807e7f9b6bef97dfaf0f83be41ef3cf3a97ff5618ce44d1360ef2389f9", + "sha3_256_hash_of_signature": "b980855158ba656bced3493bdca0526e8e1fb6e9cbd7dc1c3828e1aea7c0186b" + }, + { + "key_generation_seed": "2a855572e7e2add2888022bdb585b61577a75a31aa8acede59acb27eeb2936ae", + "sha3_256_hash_of_verification_key": "119f6b378c059db0e2518766098bbe9b5176a840481bc11022eea73a99cf2a34", + "sha3_256_hash_of_signing_key": "3755ccfa04d3179cd44bb846959bbc80103914438a378dd109e377ad43c8ea2a", + "message": "954511394b9d10e1ba162861802a717e24ee42a346c9ed280c88e267a41ec09d6d73b6076e7e30257bf265b71a0b6e0cf408f02ba9078811be94d0f38559e9985463fc9671d182286cc4f18cabcaee1a3e5abdbc384fb27911168b54a387171c0524489fdf512e4d8d2f65050cfe7405d8df63a79c6e42a76f4538907eff4dc5870095241523f56fe8e389ebf1a1cc47ddb9f0188513d5259be257bda5be7381f22392cdc2406e0f2448a80f3824f2670f61920c667499de899f0f6b397381a2de66255e061ab92cd864de75c9db7cbab9fe76ac38e0ab3389530b4004055268b289b40d79b32e5ebcc74353510bd1627e2d5dd0be7d3dfd04138f6e3ee7526133dc70490612eaa5024be6fbefab24e1e83d8941a113d8b871f3dbc3011869174888cb7a265d7de9ab99b999c19af9b442ebdc904fedab52cf40b787aab35626417c5291f2eb892f43e698a8c65cbb6442a4832f33920fb2dbfc50b8e996fb227f2ff294c385a330957d2fada9f86839235ea79ecde6d9d94fbe7c79a38d40b9a8f241f53b921107ff1c72624c9600ec04dfa1160f1fa9e5d986a5a363e9ce8627276da73f5db47e4b90328884cfe93194cffa6fa680f77886e4a7a0fdaf13a7ddff6984b8855e1f58235babfd5106338fe2b075d4f10a9fb3d3c5f829b7c61b02b34e9bde6e62cbcc3ac9f467a6ca170eb43e632ebdbf6847f781e2469b4740fdb83da34ce34a286e3b363a72cbb13eb66ce1de35d8fd77dbedbf45c44dcd16e6b58a1699694d9006947c8c20810e85e3ebf8fb2c68b967743642d86556ab6958e545ab83ec24b96f2b4bb99cc8890c3c1e0fecce26ce09b6d99000694f870af9f642374ff0bbf61efc7cd5aaf5667fc3fe5745dfaf7f13fed70fe070ea4c09cb1a92d8b7f0dfd4b4a4b7dcf4ca6a97043bcef6346f1570f37b0eb48db8d15c8a82ed69b0c7833d6c830414c111c987471e84d2ceb5bd973dca34acd3a65d7b1a502368941935435b78b8f2b74c2bef127d96651247bdbe68eb7e466b9ea2a64a13c375103d7c8f7d30a13cbe184bd1ebb19f3274e645f5c7b82efdf09233d8ad146dc0715266963fd3cce6f8cdec20743bf1b7f57c101ac24c64d568923203e1a6af03a700f5a401ec4572bba528e284c151f1d108f7563858011fab32b3776cf2b910d7b21180dbe75742032791018258f4d1407c9a213755c5c91205352df919b6f14be056243df6ac2909e52c9a79f6917440667719185f1c5f1aaf40d873ba22956fa0bbad9c35360853333a10a0841d9d2e758a0b1bc187f6bbd31c41b74f9eeef1f7a28bdb7ac3d52fdc6fcb3ef0383a06a61188548963e552716d2bfbd6c2dcde496d06615e86a5cdb76a03bca2822aba85ec6807ebb6918ad2948d193ccf74f4bdaf7090cd4294c1785dcedb6b55886a848284a6a4a88a496800053e84a9f2dbf6b334aace11a5a540626716302e259a64c6316ed543806b3bbfe37563897e83bbefa570312df908c1786df0fcf55069edc336501a5ae9d4bf212d56a9cee811038656912238ae284575ef8de1285b763ae54adf44f91b6dd9e309b7a7a0ab71ec2e4611831b3ce1c9dc85cf907b52df7406b06367e7a43dece72dccc57d268820ea021c27056e3c6b50e7ba7a59b53539a6b7b06b35051e3151c23f3bd3c889b25d0ece1fd0df1aedf657fbb096ca1c861acb0158501ea1aefbf6dad11bdc325ac1ced3739a40b7a83458ef4f3453c0f6eabc1a48037809a90480df9dc4ff07daddc58df2733d49a4fa53c2a41e55a4a0167c6d33ba6e752aed3a125dfd6a0322cd235254505d7b3ced7a0dee7eb662acfd30f8b79d1a872998cbcf15cd86e26809e0d2da0324ddc90fd12caf9d8e4eda437fe4e658d47d67c95927c4b5dee965b940ce93e6743917296e10820a7101f8f633c93069e8b569f4625afd4ec61bfe4549fdd06c2290a91ac0fb40cb1f55dc8bc1fe695c73af603840ac0351f5256e00555c984e79a09e58c566d1a117b7e569beb5850fb491fd9b982442b55bdf53832aa65180dcddc2f768b1a1361994de8c25f3608ec853d5982e0afd1f9fa70170fc3589ddaf958dd840b4b502f8e2697d01ad7ac2233f6a16d540ef8d232887d2b4fa727ae2f038a69af3dae69eda8ef6bf1e0b67d811160b75231543ec5a4d0778b7b42fc1dd6732385aa4400450b3caeefdffcf147635cfa4aaa53de4ee3035bc40ce8670016384bb877a86a15b59f3df0c5d624d3d2b23ec46913618c745330a96c715c6f0bd096487e89b917384cc30b3d20a332f1b4056462227e98af9874ff1d18df2a6bf84ae822ee737f9e34ee8c69f23eeb9bf38ed056f499545f405759355c104284a6d08a9efad8fe28288b2084336a6479a6d42404f3e6ff3ad1dfc63c8aae971af11f2699f32f57ad29188492ce07bc1a271035b4d13a686efde5572353283a0f3138f6dc05cc35e5e5057c5c8b9e12b0164c0915adedf40a6e23848fa59adc0e65bdd2120486942f232315fc94b4676751a35aaed2828889864c4cb7dd95a662a475733c2ca8f6997a9c822c6c8b9dc95a8b4c367e613e97d3ec6d6ddc2f81022ec21b3a93244e3bc8c2737a7724a3cbd480b26819eeb2676fd383601d79fa266ed3f9bac2a98ff0109ad7e43e33e108d88c09ba82afcccfe98f50f789109d99dcd0a2c61947544f3666edc621b5d5ecb7088b2430a611bea52be7f5edfc6e2649f5e81f6df72fa9a748bff06af766a60d2b751b23a8aa95cbf733359f7c0cd19b1482a6e6572d1570349c688d78cf8b8c7dd37576dc47a193a2c2797d0af7504dee303823a8b77204ae7b6e91d431979798a7edf435056251d0e3f26b2ca16bfe3422cea0398d30f0a0dc06dc8a93d27d13650e5bfb6ba04c93faf0d7d06f99fe4f1f52a059fbe808179515fda48eca714f0947fe9a98f02d66fb0d80952411cdfceaef6aba16d92b8f1b82db151d7dcd7fb7781ec55f4a86c86011fbb9c5570ee76897e7803036e2fe3cdc2d5ea7a613897f3c69a6ea734e3811bfd15e90d7256a0c0c88ceb54ec6aac151b435cd2a870e4a02087c2b847c75b00b44bb3ca6d4404c3052bd308b8d5f595277592d26f6d5a2193cd4d650bf931fefb9deee61032b29ec0412f38e1cbe025b2891c59574c1450d9e3d8ef27940ef712143f06f38ddb86341a7fc781e0fa8971dad13aa7e93f1858c70a71a40164211ea9f6a41ae90d19032c2ea52c23375ce3c4e59599ecd6855213aea83f8dfc5cc70f58a62e4dca17c09705c0c099b29056592986c03cf5d67074735f2bea", + "signing_randomness": "a697aee697ed8142be668bdf28f92c4d653b3ca0100728c490ff6980ecd15308", + "sha3_256_hash_of_signature": "59f21ea708bf2ffc73c6f0f035cb372c357c0c3ce949ec107303e2db98d42e57" + }, + { + "key_generation_seed": "7967e9de70a7f95e69371f812c2fbf932cec07ab4c235ae9e8a6799f3f537d36", + "sha3_256_hash_of_verification_key": "0b0fc01fb7524f406f77f8e6b56ac55560fd9a8fd8150933993922458bd062a0", + "sha3_256_hash_of_signing_key": "6077226fc1bacf04a00ab75cbf8e60c9d2824702c9ffcb4474e9426fd1f66d68", + "message": "326a4fe723be9363acfc000705a10b6cd8a7b25e99a34b4a354cbd6f50550bed30f6c4208490b4194ab79b24b093fbe132c299df924f2ffcc2cdc6c2c9019eedf4b72d7f0817825bd787135927102e1da041e9a78b501b42dce777a79ace604e57df11775d7b87e75e5b00adac90d1add78cc5ad348c7472eec6e6e06f737e77115a9509a6ae6570f738dc2f21314a7ccb9d44add6e1434cdfe3614bc73a6b468f6691b60f4f2db103289a90c4fb2bf5aaf87826d2beb0880fa64e07e9bd30d4eda00d6bda01d1eb22bcf14ee797a859c9a0d9034e8c5316201af91388c47e1ddf061c9f45e067a5f60b355c98f8734559b8f1b82f47bd9cee0224a1d67d40706333523c34f3582b6c8cb47bf7d0e4fbc7d7cf3dbf21077e664fd59998338f4dd4a423c3a145ee1e994aacc1a48f81a7e9fe106008db93a6626b8c8505043ab864d93ae3972675e69c3825304086aa3419216ccae7f7d5117739e99d8f4a0b658148de33fdaaeb9967ef56677d2028c3b584c5cc1c096f4da16799408b2ee2fc3482ad2f49293cf4097a78492470099bdb90bcb4fe3b245ac8b3c53e05d7609e34770adcc147033a8fade81359ff63c3fb90c5a498c98b7a0e5ee9cf4d287759acda4bfa3965ca85e1d1c1019e7fe6d82e5e66a717f94890277e6db1eaa6f3291fe1bcd7d437094749ff5574b8728e0dc21a143a14e382937efb7ec1b0fb3f6f9c0f547f470e3b436dfc7986f923beaa89583d8978c433e0cb0c4e98516af1ac797c778662455a57fef45ba2c7865c1df5c502edb01c8cc729468091bb96be9da9c298528187867eee9a06141daa15f60cf719de2bd15010550b92a41f12d8f38b54692589aff51a9d5e6047a0d9b707369992251df31341a45b01b05ffed8adee5810824f903ea59f14fd500aedae797f8baeb470c0b14c4eda5c687e4848a85b30a8e8f59c45d4c9f0c65fccb15f4d4209a55722c29b6cb09aecb4e53fa3aa602c56ee3ba6900cc12889e7b87d5ef283af1586764519a30cf60833c82f0ed15e39a8bcad5c6aee9999e63d399c5cea10ae1f53b04858ef7896aa29fa541451fdb685734c39470250545193caf26c9891f7f965904ae10e8566bff9b2f465bbe13d6ea4a79586e68844b9fa68b2f992565c8b0ef5ffdeb5878cc12a0571ca3aea50add29dd06e13741a1ab215bf487be7735d1634332f47e037253054a21e0ad8d8f011334cb5951f833d4d344d632bcab7c373cb7dafe8f3d79e7e13bdb1c6cffa474a9fbb46f5736d55f3466534596ebd22b29107a8fa50c1d0e62f0533e343fee038fc0c3040a6df2d318bbc8420019b1b148d6d1dd2fe428c2fd617ca73f224ef9af9bf6f83cf1006616235471b69dd4eaf9f32529ef3e1dfe6765e61e246b519c702351c9cd66c57065ec78993d793b082e3685eb06f2530b07862277d339a52813c99ebe16c06c4c8f547d9705850e770982e8fa0275a52f430ff2422a115ece46a9202caa0195789532b1444f1507aab2e4303464e499989f21c7d881328f18dbc77d4b9b467cae244a93053c0321dfbf815da28b6ebf483eafbe634e9947bb5383fee3a31bc03a63fcdda5e3e46d5d3184718c348a83975728714351df43baf91787caca346dbb819602f18a4c4fe90c4ce307984bcded89cd2e4aeb66318c10d95afa5be53393feb981c21bb1411bb9c58818bcc141223d66ed5f35f90c05fd4848617220dd72f5e892292ce20aa9a0f9ad54022cbe94d2c86daf3fc66949ac35d8e122b02e2d155e73f4ce24d7e85a5c301dcc173ca8ec090af9dc7f443c983280dda27ed4b9bc71f86e84f7aee39e6a7e9bf5e43920aac858f0f49a06216d9d3984cd2e3575c0fa6ce8a5e28b0f481ccbaab450fabce8a1084ef458dbe257cf09d8116136c2cf1edfa6cce31aed0f1f8278c1c8d9c79846886d48e3fd311c015bf2373f7caa71aa26b011d0df5a843ab53d7e7f0466ccf49c5d4de872ca87b8895101ee0147a3dbd391beed75fc16f65814d56cb29273a5f4e5400fcabf85040505c31d001df0023726e9c1f7c29a37039fdda73b9b99acec3a029f7c0dd61ade7d5e835e1cd605aa8e583bf8dc99285e86cf91f4b4827a0e8956efde2b495a86f85e78b954341cf3afebe8db71c26b9b1ba27b47284aa84e55b1c2afee733ac596a10186d9ab504f33e34a06ca931d7633462b04b9b2b0d4751b0343503bcb2a1893d944fbdb4be63de167348a1588e6551fd9cf2101b0b4cb61422655fbeb50d64cb9e87a23007a39821ec3aba391485347624efc3dfda4a133c537d7cd8c3a549bb6bef9a52d2edf0a8892c6fc3eec3efc3c18741c85bf24cd3b36ca04ee77f654ed5595a0e4b9316ccfe4d2aa6b4a66b06f309337e363c9e39829c8838729f19811093dfbe962246473b7a19faedfdb0193f63eb85ef308cd3be5831f35ced36d9448d0ea8306044f78946079210cf89ff78104bcb2964ce2af9954d53885d7914e4ffa4ac7e9b3d103922fd1ad68c0a4592f885c5fee51d52214e17035e8681086203b79b5eb176679eb3263b44ea7287262dd84bb98f6639b9657ac04e397d69c634a0c1181eca485e467d62631ad2d9afd5ac5b86ed4005fdbb7404b65bbb826f1a2334a481b9cd46e0ce9c414a162e84368089f24149d7d05ea6adf40b25a708357aaa5a28801ff100f69252810188cfc6087507bb5bde1cd43bf72b1b3207ce4f7e65a18e5276613d4beddaf21af7b964ff69965c47cb03846f7ceddd2c5133080fc632a4f0b3495b2d2751727cf7681f28675552df2a0994e425a922bbfcf84189b8c9f43058d691db3166c596f6bc480efde06bdae7b9c2985a1f2f6441520620e193d7b94ab46dba2a1ade44e2b006734e6770f34b0e2122dd7f4eaf045164dea8c2fece7758630384c00a6b528a6ecf07045b2dc0281c936a540904733149bc65b0f57acd9a5e41c2adf83fd6a760b169beebf04644db1314270adf86d01cc2cd580c609e78bbcd9d2694a89f9cb6dd36b9aa2aa5581ff561b5417be2b52f3ef2581e461cb0690782f33862c52590643bece0a6141dc805d8f56c4f64c1bbc49a3ecf1e8827926796e5f9335df47da6d3e4c14795b547116fd1f3351fc55c28b543183fead8df7da4dfbcc38e224901ff7bd83b16631064cac4a37fa632f53f004374aa19861fdca515af91e66186ef804366d5a1b3b4faaa60a0c4b36b972a9579548b4cdace7eb85f1f68a4e4255fd994c1786975e7f6f0ba87d0295de72876bce37146a09edebc0164b9c4911ce41ef4d48130a27651bd0dc315fd622cb6d03759d35756806332658b5b33e768860c1946569aa45130486ad49b", + "signing_randomness": "b289f87e11a5321c883ce48f016495f83ccccafbf4b4d428aa043305ea04dea6", + "sha3_256_hash_of_signature": "600a7aa84a66a57c25afe9862949bda8a79d71ab163016e9ecd7488f1b08b943" + }, + { + "key_generation_seed": "5aba340a8e541568fbef49e77f94cfb4b3a5e9cf14c6755ce6412cf86cf62898", + "sha3_256_hash_of_verification_key": "3d471acb581e1f17770e77ee2aa6e8989b5521f529be62dfdeec50ee1642e943", + "sha3_256_hash_of_signing_key": "e32d723c6ba4ac288b9191020718cbd329b0420c0fd74893c4f44f3e718cc430", + "message": "efc63dd588a7230ce08efcfeea534f5a0eb005480ad1d169c386e476715238526e936fea7136e2d8aed60de31cc91dae4e764ce5f93624fa7f72b87562fb6ad8996b5e41fd478af0af8338a7fd9aa250efd2f2d20364e8a88a8642e8e38f38583abf8d3be97f14c3ede66ebf8ebc84385cae646cded8c5ce8f06910ba7fec05d828446d558d6fed766fba347da2e84da247c34266aa31c328804f4e3aaf6acbb0ad50feeccec00d20b3610785b9f1ba06a0badfb42a8f43de3f7bac36057ee0b4d2a15db040a8903f767f7352995c8fc3e06ed1b1322587eee5b31806192e04b09a7b433d08cb2a340942cb75c51e0f8409f907f69c5f8dc316a227942edf7a458974fda76c255ff4f1a85a352cd2cd2a21507e0f37451060d31d0847528b3ed5da3e7168cbd0302f1b03842e63b3dec6fb37357e37fc3cc26721f290726a47ab3d4dd8fd1778fe5133726c240e7b3e398f3d809c6c469680b9efd25dbe890d6936b76a52f97aef3f93872b76506a95685eecdcbce203400d182252471b99b7f4c6ced4cac8faca7682d0df07bc5904aae042479855098cbc41534f0ef17f38f1bc8c272cf72c1ac4a5564dd132130ee676e7d7ec3cabb4e85ac81945c87de08ec60ced3fa0ab3e83c18ae493a851434bfa2c4968b42acccf3609539c62a4e01f8bc159362e15ee91d8aa399d8bd8d67ba1e8fd646eebb4583812293406b05ba5be2b1df9620e6fe3daf8cebd9652bb04494b899f407c7d9ed1c4e77ffade24abe56ad597bd438928e05b0363d6d2685d34d6b51d71012844415c46f13181b146a3af25ae4e8853cc7c7ef6387306c45180a6ef9e97abe1e7d5e10115752c3071b6a213367e8b1a3d1c3703cc1840735315623901d772c61d55ef8c47db10f0eb7582d7a043018dc1363e93f315dd984b8002ea7bf5bed38d3f273276ca577cf99a635cb6ed9d6525520793405be27c86e6effeabb1e5f84a0076bd151cafc59853424de4b3460c673b0820d76e15ee47b6505d2d5c179db92a44042f3631c646d350ea9721b8984660a76018dca5c6bb1223cd03cc844dc9371d32549d9d645f75d2683fdad1df6434bbe43200e506ed2a815fab511172c70f99a85fa3970433e8955b2f9389f23c10141b5779a23b8671eae8b91991b78f635fbe8e627d3e79d91fd1e6e90699640ba3ae8d7e4cf5145f1259cc76ae50b1fa150d8338a9450a5b6b90eec9c94318bc78c9c7715a3eb215aee6443540d211a0556813529023e5a581623cd6d19bef0705a5f69aad4833a57c308144e92899ac5683147cdbd279d5c3a55bbc5e8f8e26a158a3e42f8c5b858909b024b4ba4069e26de66460ff4a7dc92bd54ac244007b6ac6ce07a31a2af3323cb55f07b8f480d279308fe10f2ddb001da6c4aa132b988ad03fb63e0eb06544571f5505cf377a81153d6fbd4fa2b7562074cfaf587ccf28dac84afa58809c0b296e0d2594d3582c28596f5af7500e143be7b49c63d04f49bbfbdf60b024daba5533f945ba90659758e06984921efeef79604059eb808c9fe1bf9bc5351a406fbba7f5d8fc9f891488e537db14b216a0535c9ff7bf8d5c68a2453a8a48e58fa7bf6eb76448d6d0bd05bd4628c4b852a236a11bec0f67118f1267ca42647f6f2303509094c9a7f3a07b2724abd2d9b56b71fa7ac6cdde456ec209be76c419855a5151ec9ebf0e0cf1b86f4e8e81b8173960f8d1c8affed1ac7b818af8e3bc092e2b209d693e80b11ec7da39ca93223e1b47c6127e8ad40a78bdb0ecbfa1f39c84cb9ecdf960abb39884627bc4105c53ee7bca4802b92af60241420cbb36c407f46cc2e953d7e3503cc82287a8d68d0e673e212173d80a12257add5256652188c00590dadcfb7dbb6b35507b853ea5fad4f52e02230cb3d3bbdfc43eb74780583e8dbb851e0257117f4a39a6676586216220c1ca21de16cdfe6e1cc99ea7c989916ad2fed4a8373cfcff02207529bffcb7b7601317450bf430bac9ce111b0fba8d7de6627f863078d8e6286b2d34856426ea90ffd58705444d0dc12d4feead0ffe543811e1ef306f40939922563832d06e6dea7109087ac051a361ea9e755856fd4e51388bc7c40c63e0953c8413ab0cbff70c466e15de5b089d095e8ee8a64e929d26ca3b71ef0b2360aecdfa89284cce08c666f4e0146362f0bb84b87a49fcf2324ebb96dd941f00e2586f7246436eb66b1e04af84482d8ecd2bc8ef9955cbec62afdd754a7f235c7f3c41cd0b36a9024d426b7388d3c33a5a6e858846c0fb0d88ba5798c923f9b43d14a6661c65092d5c5ec0f97d84784fa336ae6ef57c7a5d04804b96d19849ff9074724a5faca538e32c6efaa5209317543159272ce50454fe1e7d068c8f5ff3797a66d5f87758627ab5d40ebe1fb7ce9d69287ae7a5f349a5daabd8a8e7778baa26da0eb237034a3366448280237a165cbb303be6b33c0f11c1e56c50a84384a0f6878f2a99b14cd3b6820abd27d2011e0c37f8439bede65747038a5ff7f00daeda094331523cdb7e10f1063b64a584d3e9f0655268f89dbef3ea3fa4c6e54feebf8f0046c6c811f0767cf6fcc9b3497db05582774047a8dcff6a0c1b5188076e64a9d5693195075f2a05e507a5a523eee4537079f9e5e79210e4af056d6624d45a0eba553ca9bc92171451970102cab57dcd89acebbd7025008325c61145264f42e4d14a76e5c2f1c129d4c054da00501081617d1a27012a6e160750dba73becb5dc05105bfde1f1d0cdc837355844b291b09015fd610628513c1c86ead373730b99fcd4a552fba07163ce9cf6a3d3ac0525593f0648256e8b33fbcf92af58ce26d0f036e11230879dbb789507bceefd2960ea320236a224ea74dd2aaac541664fa3ea9430d4fb09c878169a8af1e7fd4be5e7926cb0b6a352b25f452454474107286edaa145c0a0573361522eacb618dd9c8b32bd1a8a5923f4c698cca0139dc640c1d5d557ce889bb69ce32d85853dfbb0f34da2cf18cc79472906b67f6bacbf287f31de0b9e7a01a356ec9b64653cb922501ea1eda940089ba0f293b667f482e92438805cd6851776cea0920cdefc4062c9b4e51f5aa1d7ff909cc2608b6f28ccf28d574bf67ce80d4ddcce28f2ade0162cb66894b5b2da0eb975cd95ee7fe72fda2736616c8b571fac94bf8c64acd1642d9431118f08a62328d99b2b9d90bbc915db764c4935951a59c369c72060cd9f4273bdca0c295294008c0ac3a149e8ca5e8bf21042f5f21c067147f3bb52b13975026a9df7246afb1d053670982ab316509f2850342913e1322758ed89da02dd79126726b1c5566c1831ccb1d62b3e271875e62cde0df0715d404f95f580b63923f362d416f83fe5ad98eed584717fbc2cb7d1b00101200f4eb4ca5", + "signing_randomness": "72560d4af60a2d3f9f644d3d90b2cf16bfbe93708b9aaba4d5180c1f10ad9679", + "sha3_256_hash_of_signature": "9969aaf80132a179bad69c81b3c634940dbdd567aa424757301497dee49f56ab" + }, + { + "key_generation_seed": "df4853f482cc1d0b3a2d71e9eaca064e57c5d100df79bd004ba81b43eacec401", + "sha3_256_hash_of_verification_key": "9be5c8f2726f6b6c2a153ddad515e43dc434056e15bc5e2c117363c1bfc8b708", + "sha3_256_hash_of_signing_key": "dfd5354cc3a46f56085094c61e6b5a84b3154725bce0dd2738263e795e94182e", + "message": "acb414eb55ae5e49107bd0ac5975544f83104f7264495ae0bf0a6d9594c422c16b99469eccdfe8b8000875b469309891ea42586a615d146de64fe59277a61631b2c7f7379cd52fab3871bade120ee9558d1479a91925634578cf14d35df3b5672f8b5f9f956fa9f7489d6e37e207fe556017736f6b147a8cf664d0e0521d94737e18188a1b7c30296ccc9067e7b55d6e0f2fbd875f42fefecac49510e324968b07372deb10a31c585457e0c48879ce44bc78898ecefac7bcee90d0f8925df2b52d5ac81692e0160f8fd5808645498428260f592e29bb90fcb07d0424ec79fb081840cb827caa4a9d562183d10ee41d281e26ce3ec0069c83e1e446ef82e2e30debe3f409e0a9e6d1550e224db15dbdda44341e4ed6f8b8984716ca87233197528547d090058607ca141424a13145f1e896555288c5e2877ab3b51c7f9248d2d56a8521975bc4eae3d009988cbd73c66931bada0725fb8a3448d43e0c7364e9494fc4e295a700e79972e1ffd626d1cbe0199917851638b192ef9f5c03223f2bbd67eb59a5e8baec3db40616938274201dea1ae640f6ee7e047cc4c13f80dc65e3fcb5c62386015f4ef1bfec561e121f9bfa9b2075bc1c4730503fdd5debce8a535eca01b9d5b021c290854b5f3d49effb263dda34c4e96aeae9e71a686c009b205994b46cfdf1f76727ca67d415b9d21d54312cdc6a8ed0aeab96b580d0b419e2058e5d843c17c96d156549962f81c266233ed2b795fac40b1992b626457f211f08106ad86f5702b9deb9323a0970ad86125eca836e0a3d6ccbc380d474049bd96ea246b8bd9542793a66e15b319aece6bee17adbba7db337d25f8f642774030a2ff969cb5671f59901cb109e661e55fd5e75eb2a96dc37fec76a82eb89d020b4916271cfb0cb3342494fdb62ea0d253fb8ff2e91357b33d96d41530b8b5e9550fe9b3f9f34fd5a2a1a6a8beb93ccc322622f3b5e8487de19af57cbd1481ace02779ad928b17a9b05cbeb722c783b088b5912c2d67ce5073f1801c23170deb1eb6ddffc4c33dd25f94f4fbe59d704e478fb49dd2142801c37ed8f539ec1782ebd2f3253bbe19c5a048b9ef41824a811119f3a6ad2a0d4b77338e001358c61a9794572b0c46eb1e0e575d4da141a415829ba8712b791b625b1b0ea840ee745d9ffe1e99efd782ba25859351f443654995102cbefad7e59d03c9a502ed7b77144d0566e4bfac086a7dea356cb9e5ac02dbf7e81d6ceed4a33da8d801d61bab5c01f259ee3a99ff7f6d7bf8f2160c4bc3f890736074b000c4c58fa4615880f93fad43d5657c76045d7c414e6b85f63aac91f04a616184e04ff9aad513ba767215fb0331a369d36c0ae9b1ec1268f1d0b43c42b786db23dd66465b3af17ffc68c67964c2fc9e41eabc45db68cd2c3d95b8bec787d994bb8e9cf1dd7d4c563fca5d80b3f1fe8e3c7bfb7d171f5b9023bfbcc0cf4371b63c856edbda154b4313c47983f4027f9e61e86da1e8cd787e3e6b50e1dfc9201b9ab92059f8b6d1bf7856cd55c5b1d6c4e6ebf818d481c56f66c79444f5a6544a64a7d78ead33eb805a6ac4310cd46a2331e707b9b0950ca12092402d68c1cc5c3f269dfdb13ab34b97eab50b0745be72bb0fd2d73bea5dd37802393b635e42a0def8544a96e7f40a8d9d06b64e38dc406bd59ac5c4e218591d20b8dba2125978096517ec5c03f9bc6f96cb255e216ef82d7c7c873029f9e1d98ebc0d8e1312b84b8d02e8d680aa56a506c8668b5b9c56d04cf68e37c7cb1b9377c867240cd42fc7fbde0ac44e3dccfd3f877c9923ae9cece0cbdab00ca530f434a33f1c939fb88adef4d12acbd8b2b5a139a3fb776d8223a9846465c0372b8c3233fb5280e936bbe9fd49058961463a4419d939f4f1fea705eb63114f0a3533638dc4d3efd620147770ad877e2354299cec6e5c18924e78dd661697adf89a77c7365522d3e8fc0855187139f7e43e9a0629ee321b2cbd9f007b05c22eff56fe48045686b36c5bac2267f37a2e3d4e03e19b1e422acea31c2e9f3e7541976d4e2fa03119df9c4cc2d5418f0fc7a467cd98e290695b9530b91d5df8c626c7236a5c0fba73578b9a47491ca0ad26a144b0f23ec23d2c5b2daa03bf40130f14b9a427cdff1f232c9cf02426228c570cf1fa7c00a773bc0d70858588542bbf8f581540870897bfac8387cbba3416a846cf9f4f5d3f9dcedd080cc0de9f71b93828b835430898e82896cd3f30fe2af8349db294fb2a8ffc0848692a0b9e8a66ebbfc0f896f8d03e3c6a0c27e0f2177b85a2f6fe31e8aaf14ea5c1fdc54e80cde47ae27a161264680107023cffa961e913c4e6af96c0be37ad859c334cdb8bbeecb5443662739d027ef1b9535a5a46e2169933e419454025623fd6779f54c622ef81ab9289b50758ea34f868ec85aee589b08962b85cf537bc733f62aafa95fd81a60d5c2e38d6ea0df7d1390bc5050e2463e3e2e3a769de2a94abdedfa0ed67cc0ffafc5a05a3b0fd37bbe6967bed8debf02a42cdc80bdc62158e184fdb6672f7947505e2c0a6c7762b1145c4baf30e3d32434d22707044dc99d2cf2d38f15c43abc8632382bbbc9e0f106565906f7d4948d30fb19edcc3748100397f71e1548e58a5a01876d0a12dcc80000224221c4abd98a5022506d24bf4d9b9108991ad3421d4ab9cc393dcb8d744f97822f95cbb2640e73e401f044fe20253acb8b32a75feda640e190454bab695a23b14ae3ef60b00491ab22f622daa89b6b2e6d18e735672fe0eb2de269e4e386c926e23b865e1ba22dda688293de144102f7030fde6df653e4106c08c2467ad7c54d1df0dc5981004876c6baa8720f70942700a154a376c8d45dae1be74910148ee3f2733e591e1965fe763b58c8b28af25e9b3c633abd83f1c0a4f68da2e0b85083bf97d4e919340c0437a604416c4f629b33039bbf2a1f561548321780411d2e8ac0edae76fc3a19f3c84c3be902a1e84fdf69b11a12dc8b78ef257b5fbb5d923ffd548451a52c6a3af31c70266ae8a957b2bd72a51a034a2921b8e19321108ac303b0d2e269d032c3db13f21d558c82ba4158962f2210e1c5fdd96c98d6639aa844f34e40c1b9c909cc6af1e97a8dc83b78c72b30b7ae400f44ca60af37770b3d9147f7d6f5a327f34df7cb8891e71d41d723cb18e0dd324e5cd22ae0d9f2b1d2bfced0288b7aa73af4fe0a8181ba1aa7eae966d0a240e10fe5735d98326a106d16dc49f3fdb19d3a8449c56a74153655600e4c9e38d302c6d4080017d93c628388df94860329baa289efa4587f079c6f03fa03c54540a0ab4b067ee46a5a346f2fbbff6570ed0166a55c258eabd62ad90f060fade84e8fac799f7928285f58557a72e055b535d00bd9a4880d10c05c07cfe7a6feadfcded880521803e339f6eae3ff28a0a471a003358f952320f41a0aef9d28", + "signing_randomness": "d69ab8dc675f01cda87b86f4b9b0371ceb1f1e861100d21bd22186263d4e0e6e", + "sha3_256_hash_of_signature": "c7cf5536a12c589d5b5167ec46035c8f5e7ce964b70016a8d7e5b6c8b316f144" + }, + { + "key_generation_seed": "95da16b844baf559c2cd6e68b237614bb9927d90811106347b5849fee2f48640", + "sha3_256_hash_of_verification_key": "25b6446489933a2aa15253ca8c7d37a4c8bb01200bc62be6b6b51ad4efad4114", + "sha3_256_hash_of_signing_key": "eccf27cd2a8ccae849fff9b3654353f13d214403dbf74e020386dc2bd7dc38f6", + "message": "5f7522ce6bd0ce6321c27b9eaa6f572616201f283c5ec171d0ba47662c2320897805e1551ed438f3fcbdaf9de6f3a19dc16fe9c167a65b6e52bcf512c919561b548496a4a80af7ce25458a62eae92ebf677872482d8647c30c12bb1f080c6b9a56560d64fab73db17487bbb007c66661ea9dda14601ab27a100ef4cf4b7447e51418651c03211f8fb884be91f3980fe13e00ea4ecfe6d54882059a436c90bcad80e4101cc6c0754417545f2d167629f80a3c5ffe45c00ab2baf0494d6c065872b03a987a5ee818b3ef11e47fe1747f49e2db6a14410f0b1f9610a2d6114395ef6ebb231fdf71d595cc1171db9c89d6cf202e42d4fb968ab8105fddb2aacb15fab8014b534cf468d77ecde2072623b7002620b7ac3e78b62ad673feef9f8e97e91acdab171fd415b2d15605dde00d074a770e36f2218f7130f13e91fa4c88deea7e854bcaa01b8458d40625a33e982f0955b83080a926ec240e31f0d9bf477ee3a016e146a3909683410d4d09ecdf32eaef580402f0d416dfc082cf1362e8b79158bd57739aee56dc41a549e534c7ccf3620c7d7d95b92994a747d5efb8ec43cfa8189baa9b75fd54694e512fca388b71a5b9ea591ae9cfa34183de59d284ab16b2effa4b26a24a0e615b38b83088a9827eeb5c29b419bc061b033e0e3fc809afdd3de948412677e0bb5136854532639f3ccb176d54ea1961b5c527ef66f4b3286a583e86208aeeb8ed07d9e6bf1beb33995f76ca480039a6130775895f19e3cd4873abe3bf2fa9de81bf0cb04575dd6ae282720b152cf0ec6a4a04016db0f3543d8272ae56b1152b02eaf22131420cb194021f97060d5ce52eb21b57cc93964dd21344786e3888617152d2abd829799ce47d20158aa93f7da85ca6146c5bb94b512da053c35bfa8840ca43f6509a1477603fd50f5e4f9a7cf8d2369156989ad638d35d345bdc859c52688211bf7ef3f4ad4944657289406bf01dcbb49d560a11840ef35dbc0c7f9c96dbea76300cf61997a87d70f5ff8c51aeca2cf0680b6fe8c4025e1e25b62103d248cdee335f4fcd67597103362003206c507970ea6d78cff4b68b44244019152dbf812675cf667e5e13c8596eb6fea3903bfb25ed08f902722a37f8e460e37a03a2d6adbdf79da20052de658390484b83bbab28d039a303d7376bf555181680b7966c798a1c6cb215257e37739de7b9706cd1cf3ab031f68c82d6ecfa507c104115040744d74a40c49245215639d0cf4a5a7a10098e9ce3564ac3c44f0683ae9d3094784d354db1af439bddf63d5cca668d8180264efeceeac0be1b8e1c6418e45f9ed6c779ecf169143b034cd9f332989d445c83a8786398c507b9171b4d95728575539cbb29c5b804268d88f2b39af1f9572b8daa9feeef69c4a77dc64bf2dbb5e57f8b33ab151769b2d00010d67a2d6f188d6d5b35e5e1873fe2b327e42afb8885a842d26c246f7c18e6bcdd6fa49b300c65a3822121e95004928104017cbce2ab95acadb9802bf4bb049b8e96468353d649654c6f69d774380a5a387d6414dc3000540bab6eccbaa088c1068ccef20036e5c8342fd512f55e6794bf85fe15721d99a1bfeedc218617a940c8c25d4dfafec677d2a719b2cddcd302294b7fa41aeab5606f859cc0d638ac94b99ac3ea48c687d278eebeb396dc5bf2d2e89e880f76b533fa54efd30d8ee38b34dc5f8ae62c637e9a7e85d99e011f62d261ab4d3dceb98a8972d3482cf817eff476b873ac56963bd60183b359713385ba82f6e24be2d6cfea6dbb4ad2e1b5b790ee54d23f64e740502e887629b346fc8fccc3338d0f2921131b84590b32c7cb82cba8bb3b81ef7bc5cb12f0aa0b3c6a5b2878dc4f868057c68460c71d40d4263ac5c8b8317d2d0b63403c7549439a9ef227268372ec3a54cf8ee97714bc4b55007f92b1a32238659ec1ee27d6f2987ab06fee84c3afdfa73240963f076a955bf3c19410e1da6a19b3ea3ae2dd8766082d3295d35436597783dafdadb905465d05fc21fa8ac2737a52fa8aaefbd2ed83f12545c1fa3198ff225d37070694c9392738e89467edb2da3cd1734ce398e32bcb1fea2e4fe1260a2d9f9edc3607a8ac8a51d5da36e99b31903025e0cb157fd2ff5b51c9191cc16a9ccb870b4060cfb0fd900aef62738a58c5726f5164417f084ef14fc0953e3c6036b818c21ca3476b8cc5f8ebaace257a0315031a03e64e7f749b9df99bb56ceebbaa4333bc7270edee90fa2715bddc38d44898a41998b2374b6ee3b8524d3a385c03868ee9479355092c4d20ec32deb51497f4ff34ae7e7ea4828c288f46e5148de28a8c660ee132e5b5489833dc66205ec968b60dab96c2a4452a7019bba9fe3d19d5829129e2a9c75c39416ac8695145f2b62eb9468198cbd48d7670ddc6af2f99f77e7acd01a34ea8e0e974206fbc22656867d09807b980563e06a559b0c3a7e6f43cf8db75b18c0f90c12ff3bd43abce7df75d17e631c08c974322010648fe2e2bc940e6510fb8835df8384eff3fe6a264687256c6bc0a5f9d2ddf208171db55c4446b03cf27796bc77e3c68d8f1252be21877d7c53747404420302ca5ae1ab57e43b158be8b707360a2f59d6a473f98b816fde2ccedd92385202c419278e8b840dba4c05e9bb65f68ae2a635a29110329e8c0c02f6fb5eee41ed225051ee975f92da52f93eb1fd7c0a098f6d1421701537298651313514ad31cb333e9c5da719bba95e73878ba41f9e2512862a80602aa2de1e1d086576531330cc7bb8f0cec38050b3cfae5c8b1d6cb849a579f2294f8ce80fde5405bfa3e6ecb01d5117203a4523591ac4030397de9ff81d5cc91af3002590f5854e852b88667638b2d052f2a7852425c8ec026e48d9ef5e73d1993d7f3fd7f704760562c36d2278c9ce131ec6aa444d7b2eaca3ee888d9b2ae122688dcb35455e7de31562ba618f1183308b30d07a5c34020546218101ad42ac5054d4703587ff60e860a60375fab12734912058d5b0b06430fabbfe0c0b43c22814f56dae9e2713325a31c682c13f008b9a3d4ffa8a454f0f64a9213ff2d557a4cbc64ec6e4eca0a976cd9f27497ba544dbaa3e2eca0f54c2634c719b9c3a2ce37bcc8158a880baa72780f8b1d3494f589e2af3044b4fdd86f4db2df0843ebd9f3518870f55488f41e234ce94e907a69d28bd83347702750db1ae2eb1454cdca37a8b5fc90091f548babf489e57c8919646e977274fc972088a522fff9f9306d2f0ed6c01ff92cae8440d7f3526b8c186d5b96942cb08032886051da2a9fe77e38beb18f4fb25f1152edf9d61347a00a844929976a327be46ffd3e2ee0b6ab1014294ec5d40cf7071c36b11127ff90720596c1b3065e7de8010aea469bb4f4ac5a6efd20591cefb7b94b2006d85ca475fee556f24cc41237c631b75eb594f8342deb4f976d73aa46563c1aa6d0b605a16152315626ba08807daa6025cf62b29176f3a85e4bca483effea7e5939", + "signing_randomness": "88dfff7851225e63b200f8ca04c7df429f671c2f1799907ec4e04f6aa295fa75", + "sha3_256_hash_of_signature": "1478c68fd58bcfae8c7c8ae46df04012cd6b10d7d04976f0456e44f0cd768839" + }, + { + "key_generation_seed": "f258ff1178cc42a3cebe238c8418b4974812a05f43b8fa95639cc46bc0738bc5", + "sha3_256_hash_of_verification_key": "9925bb9d1279b601b101c29d30d7e2132851746fd10b953d9f2a7ec272d7c17b", + "sha3_256_hash_of_signing_key": "55d1fcc43d214c0300c4a43127cc1815e33e72d63089db82b0604d1d281ac97b", + "message": "9ffa507328b2129c9f05a22b81a597fd1b8c27d554b36fd3eb150bc5fa0c6ed967ec5be6f1e52d3bed1508dc3c841360020cfc2ca1b0713076251f2935efa8500573cb4634c78a1d0f87d994e8e2b0bd265a877023b54d9a33282c12397dc74caab07ac2efd140df907651bcd1b37cab2d03f77cc28872291f1cb28fd4bbb5331c2a18e02120bfd2d9ec0c8938a6d43681dc03527fc2bf59703b5160d8e25d08534eb5aa5cc9c10572257d9e4db29235683bfe1776a2d9edacfba1adaf66587bc451d32c524c7934556f94776f91cdda96d2e5caf91a39503d3a742dc5a0efef7c1a13666e200c5e3fd7652d200adef51fc5136281570b7832e0c6e7552972e43291f202e6f916c916dc3fa48858f3d92b1b7efd42de140d43648aedd7c7379d7a4b71751a3348b6bba3b0db71b4c99c41e085e5536a3f0d2bddaa88069249e21e2d9906191bbb5c8b45353de72e00270431847aeb4ff6230cebd1969a0fb68d6e302b78da39adf6c0e681117c8432e24820b9ebf38838545e95cf7aefcf1e9436cf48e87b6c5181cb418132c7bc050b9498720d7d534792e0585f05da2735b7e68fe35dec358da1bf1681f7f62329bedfea3d12bfb26ad9403f3ac1db96d828050f39dce4017b45c5dae4d7de9e9f687a9d7fad1ae0e7197184142f6818a63d5617be9d8d82334a12e68f2eef88a0da3a915de63629550d8a64df591eecdbd1b89eb40ae9f9d65815271693c85f2ca41bf45e4fa16ef8b17d945ec61e757c6c609d8afaee32b3ca628842db255b619f6562e656f6125fb27195ec82fbeb9c14330dab649cdb74f523f5a98244194581503356b5b7ec51e2b35ae889452d3457ead713c0715aa7382dcc510b16e771b3a5a91949faf5e29223c8f1f861bc3b4e77e095bb61aba00eb29c065d6f9da9b4413d61b2202547fb6e34671930ebcdce4c541b3e2dc90073867a47197e08c96f74ed81de5f10c37c062e8d82364d67eb185cd098cac1bc3c522e4fabdf2fbefb66b9ec6e848f732a737fa7b935ef2848c29b1fb94044996eef006e251bceb5be356f286f0fc85e5cba627b67398cbfd6c0f520c6f896353fe75ba323d8ecd9d3ed2997580e7e1e49eecd91982c5da650d6b128068b8d3d72c1ec4bf1fbf121ba96e1cf5f247f9fda7018cb609329b1c95e59e112c393c45ef7138905902227cd21a39ce30397ff017495bc98a968fb497e03de5843e64923683f2e402da63cc25ad0ba13b85e3e379b08deb39542c06a268bbf44990447190a1f8adf0d3ed9ed9917886210864cad84e7c4d1282c4d3bff9dc23e4fa68ef6b0480e76459d1b5e0a7cc0cfc17f59531c4c1cb1d416b7d009ab50173f706289dbb68201c305e39fefad87929ef933006598ce0f0242a2c60955ae487115b4c367a7e49488491a6f044fa8b7afd81f6da09d29d4befe1b3c9eafda4f17d22eaae0b2d1646906d1cee65614640b53479e23831c56ebe12b92997d5fea725d78ca75f4509eebd3df4f741d6b2770521be2ae63ca365fe1518cfdcd5088d58cdfb8d3dba76731f74760a47c9d619a31b7e318e957194ac5acc6867cf8c9c235043d5c09240f346fea840ae0bb16094883fc801da0befac64a021f6f871413249e9c7f5cca92f4eab5713b0f2cd6c950f34ba6fb1cfaad541bd5faea45ea5fb37258301a49d7bc4657e3e986d707213c0f836b030c21593f11518eae3a8a95a2efc8b9839e79cd8cb0e6de59d5a43ff8f81fd35392f0c0659b7679542136782d559897fbcc0129c22f43a30cfb27e899a8ca52453f5459a281d0cc21f902403a596c7f69cbf9a64d97b935ab384fbea5851d831e8420066826d7e11e34047d18cf08283be8f29a8a79b0f477c27bc41b8ea4aa010ecf8ece0d37389ff13e235a4526070f96f415d41af2e053fd4440ddffd69799456e7335cc6d9f4370008803f7babb6c58b6996dc5a52649e25463b5267c188e2dc39b3258636ed8689e5c02e00574988b3af881d30e9eb38ac51c1e00e1c0a411ecf37e314276221d7d8713f7a449e38371854ea26520addb58082287faa1f77fc04095499a3c3a331a38852a287b24040c1ccc054086964fb1ee2b328f3de21a986507cd20b4de4898dfd15045324b93fdf85e5392de0f32c3badd04784012e97cb9ba19472b0c20eb0a71c89149ebb601abaa4a853f2c75dd2622235ac30d97b9d7b1216089b9cc8e879660e40ebcd15203404a8decadc42114715f4d8a6a10511bacc4ddc23520445a95fa3945bc95878bff18728e64de8b7767cfbbaa21f3ef2d92f3d7dfda792bbe4e5b3381077658bfbef8db95b64f9f2a44917b38df6f9391118978544369c882b218e7a7a31afc3eb9a75a28095c4478dc81f9cfa127bb749cc53898409365170823d65a0b46bcfba0e47cc0c5f6ecbee09131f134edd254f4f58b50c486dada13195b1a35739420a45be6558401f64c3b6ac94b73397925c20545621c7ecdc7da9f71a755f84d27f2c6d8415d37f2bf1966a76845216e41764ab96dc2e14c12df3684f7683fdaf5ec771db7050f81a4b3e516c7d5c955201a18f436962476c1284531764a9397e0edbffa8c3699929daeaf968b4524bd98ee62f9a0db9cbf99fda80cc6c57a5ee1099b1eb29799a5b5bf5593cda26ce2c66dea3d40545465c1d21f5b9373556b9ed0ae30e90b836003ca83f78e29bd8d49550286dc2de6407860e9a9cc5eaf3e1b1c73fc2d248b81b1cc8f59dabfb5daade6f2a0b38e76d9e6d0125955d08de7f334a56a8f362cc5d883d56bf7babae6d9e425376d34a05ab863a0d9adf7c6fda574fa8dc60965e021532c25ed4d568412d4143fbf2c4ec2f230d08337a4e546e01f7c1bff4c97f2f27af400caa57bcf398aa5bffe155b0f29a085d5053dfbedc3423818de8fc597eeab2c1663d8c81c71cb876f73ac854286063a2e8bd8614d06b80f3bf56381179342143f4c89b8cefe9168b6a96f416dc617b9f544f9df65ca6f4f7a84a327909666b70cffe889c86aca706a0a1365e248d6b341a004a27d4ee344f03ce6e85d3573e272d48210df7c3178efb7bfbef7765d24754673c9eec14c7513fd8de6386b0829ef0980b826ec9c77c81d1e3b8caa65992db9c2f8dd691c520fa6f233afaaedbf287a57a9a66d2330f4636f02ea3148c4bcd2c8b114d48a1027fb3bd5008d732c427adedec9969aead451e166954fdc207c1a4ec409cac60e42383385187af44f136f91a8461e62eafe6fcadd1e491162e46cfbbadddb72e5b54b7c655cb9489e7f4f7e55c93d3ad50cf84e1f47a706fedf818a5246bc755d6d18ef18702f5a90ce51812a67227c5e5a051133576e9ebc18afa18c1b05c854d343727b25bb10e3b9a3645d789287858fa43734d66ad831e8646fe604286544238dc99acfe3c8285230fc784bb73360f72ed34795b1c46edbe32a346bfa7f534b500c6c9d3ec26ad7ed20d1500e3dedf141df3c2f92e981472f0010a48f25429329ae92cbbb918246f5a53212703c75dfa15d014801a830deb75baa36", + "signing_randomness": "865525fe521f48e2591933a56a03988713ee151a81f6952d4640cfec738a74b5", + "sha3_256_hash_of_signature": "d601c59a38fea7cad04198c40dabeea73c0b96f951e78cf23465e00baa61825f" + }, + { + "key_generation_seed": "5efbbbe99cf5c2b6830fb8e990250be308e662200526889ea973c8d33823ec19", + "sha3_256_hash_of_verification_key": "e4f96f7d31245e1b2383fc83145cee8e54df2e266e8cf65b6922dd7cffff7c92", + "sha3_256_hash_of_signing_key": "74e16a6ff8cdaa8f543b7a617332ebc0bd2a3b9b74fdf0e74e821ff9ba8c5b48", + "message": "e7e845902e852b331ef9923416e492c1641236e4e72408d800fd70774ba32b6b4be04b6e82237a247d26f9a33afc4745c16ce0554774c68b33cfc6e67ae34e42038fc6c324972642338daea75982c71720f1ec9542df94b38434da34a2003fabd9daea1950b7751da6c81aff7d03390f5d63455d417f5d12a510337a16197ebaf921b6a7a9a9a58f9696418eced6b27cb8efc8ecbd9b68714f721561af8553a0d84e30e009a8985d011cb994eeaaf88c76f7f3261b47fc174155c138db2eadb09a06073b211fc0d27113e8fea0da56e181cf532ba8207f5d80d6a30d8bacba540d49a81a0763a0467dba7883766ed6358e809261aa3d8b757c839b532f272c5767671a3a8bf3391b14f5e97bf2668a4e98847f1abfa21e2370870ddf24504f89b3db71e210c46d66ea7296d65c926e2c955d899ac830cd9d06808a68e9b3722b86e878cf21a5e5d41d7f3cd95d23a6344c259859735ae1a953ade13ca103692b33af90ed0345c7b038d938f8f494d90cbd3933b2a80fedc2be57960db23ad018bac63017a04fcc510553226cd86c74ab90e13c72a1be12e4d751dc670a98ec4f81e9f8954a693fc7175ba7e50d340ff7f15d568d0abded0bb1fc557b1e55971b4c4ce8cc1b4d9e239c73b1133c9e1672dee36a2d9527f315c21764648643d866b0e2ab6d2dee61d838bc5dac183fc511c4501b6e535ecc54f3edad6e8edbf0de7cb70bee861b2bff0d41bb87ffc0ebcaee9a6dfb98d31d35cfb6dc0442fc285ad0879e7b218b6e66453fe04207fe814c5f72e49406b48fcb1db145753dc2a2d3e9793594f7ef1a1a6339619e1040cde605648234a51b2f6774b31c7f9a77c2ce3b98819132bb725d288c65901f7001e05fe5326b6f701c337d41c8cf8748ff9c276ecd398c725c36c11857605f58c0b154dd9f3c1b4649ae677533eb0338b7475254e273b786c2fe7db4c13468caf0aa2aecd55dc1a5f868c8edffd8be8deec20a9faa621c4680f3eef4dfe4a79794fcbc5f8c56eedcc3e1963569a36525d4f6a5bdbba5d12966fd8a0fcc70783fd9f61613842f80d000c9281cbdf28c01c6f6aeac10df1ddcd0322e00c4e3cc801ef091d9c1b01e84dce725d57c800d38990251aa1d1206ad93a7dda40f27726d6a03d973150f7a88703724e314c0953d56da6eac442a70c2a08bc66bfa2b0ee11e185131e352d10dd714dde502097af0ad155aeeec2a6b93b149b75dbb898b2b3a7c5fef2f48d9b12a580f54c4eef3ff83a4f13f2f194af551d4800ae86aad6efc82ce460d325cbcfee3400ae939431ab4070d7a7cc005f270896051e32b1051e58941530e250f05af19ff416e65ce40655fda31d2e7a6158e07da08fa61afd5319b682de44afae146129a8b769c1708a5d3479b6c910b2ff0fc872a4a41aa8bf3ee16f80011d163b599d18501335a2be10cf117dda094fe01596c404c14580a7075d04ceef68bd8f813d7de6599f478f3de9ce60b294cb7ce5284a61e078939d08f3d4fd998add3b92532aa54e0c31087cf14bf4ec964ebaad53bd15d04e37948e94917dde181ee3bb2346335ffb403b000f5669019c5281d88a0e771176e49dd0ba22e719c0b731ec2aae9c898e74b2967bcbdce0d7d73057e004bd62269f4e7f3823dcc18cd6c551104b9b896b0ad138dde7c3d761138641bd3eff3df1552659fd97bdadfc59a05cbc622a4492a1b22cff72ac197d61a4c5a949aa9ac09d4c1112f4c1b1cae353c70278a21663e11f27e9ec66ecd4ad56f2179a3fcec37ac3a3f4b33c06bbbd4c8ce8e74825bbda3e58a2e2d928c2c6e6d886274bc0e2175ab03d8721c664fbd6455db2960e3aef0bb25afd3cb0bafb71a2bd18a89adaee00aadbc7e4ae70ed4b534aeeab88559194755f9656b43bc83e3952000d9e2295bf3391904218a015c786de0144868ee4aed203b261fe743b7168788a0680f7484792a3f64782b2b1ed9217b09ae9845dd71ed363f18e8aaecd51a4f5913aab33fea3fc5f1e37e0cd6333d2a8347cf45eb7c4ad967fe6fcfff3565743435ef09a646e75c7e968ecf4202a9b2c23aa8118a1683219b1155c2cabc95c696704f5b270c6d213332649363ae13ec811e9a1090d1603eff745e2fa83379dfc6da5efeced556e46a8a5ff1f2a5c0d911b95c20ec2465ad0c96ae7e16fc36143762bbc0734cf4d6134dcb0d739f7822470e0abf66a0ab15ce0d6096d3abba2ca4c81c1c68bdc252a8a4ba609b7c05ccd913ea56126f418fc0b06de8f76ef651f8085604c16e5910f3b8651ab78296b56b78326e41ac15774e442017fe5b291e5227ef5a4b78ccfa96d6921c8542a8a984bc87e2678903869c52c2568fee4e23ef3cc466ce270614e6472244a4294b31f9438f7e43437fc9c9c5f3efb0f4f0af2110a613661dc24a1c7f7a7f8cd14a943821f16f94bd874f1a32e305db4776cdf6633446724ccbb2488b1b06f0177819d53885127e6eb717c0d6718366a8b8a089aa6ab17cb2581a75ec748123b7d0383f3900efcff77d2e022e90aa41491117758221a0b149c8ebc23cc01c17b9fd39118dad413a391cfa0a5c614208060a61646c7cf1dfad4abc3a9cc5cd566db2ac8faf392c9d8e7da0f84b941d792a8493fbebad30d0daa0d683dcc1583f0c9019622eb6c92fbc475babc8b626319be2264ed873ac063f84b7f83688ac99d732a1e3fc12281bfb1e1e63d48bfbfca619bf4b95f899c50ad0f5fe4673347df2bbf2ca21bef49c7f8440d95a83299960f1e42b457addccce236946de80fd4862baf36387e041deaac3c9751ae345512bb1f423a3b4ca8d3a5e3796d289641d3424ff22670a46552ec68d7d095e8636441d777dbe2e9dbf6b5fede5318516c3886b943f6adf17d8b7cd40b20a48233c9fd981145b45a5cb8f6a88eaa36c270e93e1d876d7781bb92a1fd99727d8e0ae34c73398ab8781bb342f5aacf4081459ea5ec20c30cbb6122344c457f92b20448f78e1a2a291202003781ebda1747061c6ce1f8bf882fea4fb50bfe638685cd638eec15bc24252567025fc5c16ed1f5d98dd90c76e720ef7b4e25a20d262e339c5e5bb5a9cf051bf5fd1f63e93452a179277b57956821cdd901f1c01e634ae18485708a6ed8f592ae2ef3a9d54c9734ffbadc6f0b86d0398aece9374f9acafef38d4b97be9b932b9852f97aeec435311a67ae344ac1985738c72f52b3d8b71f64a916240477fddc5faf02f8224eb35d310fea03fd2c5933047355a438676d92eadf70df662d97c2f5e00cb293053699d51d302b78145c77ab03f34eaf170eda5215436faf0238a4b0d41d29f36052a5278c7d8af9a6ffc6e2b6ffc4c5d524f7640a7170957f3de2451ac75589ce328b61ea7179fd990da1698f5c73bb8639a4da2ad67d364db04771ca118c4055c25f1120a0643158c07cd22b375d5c1dfa26ffcda44921f41d4a504b2279dff03421cad19960f87c6b6dd8c29981cb66c9731f931e43b0d97c6ac9862e2cf711df0ded8e4d06f3957fff9085a95d9fcc95610fde22856b229a3121d8b81ee83dee4a6a9fa3fe8c75351574cb000bf7f3746ca1cc5414aeb23a2", + "signing_randomness": "74de74032fcd57139698e7b190efc6fdabb2fe369a05cfe73074321fe0491018", + "sha3_256_hash_of_signature": "594a2c27359c2b6484b1c6beca92f5de044462b7dffc6a3b5a5b44f8aaadf499" + }, + { + "key_generation_seed": "47a048d8799784f6ec385eb984e70c62ce7c8a107232871b69b99f7bf4c3dbb5", + "sha3_256_hash_of_verification_key": "ccbeb8c815404351cd28ac1b17df809e2f9835482c852a5a5afbf747b3a25581", + "sha3_256_hash_of_signing_key": "c175a848c02b83729bbc0779884f88f4d1317e47dfc4c888bf529948e2842ec3", + "message": "34fcf4626248b979a7a8d306cb9ed69c4ccb5cc3729d2692e0ba679d5c2feaac54a4e06d4efcedf78e19357dae263e1b5d107fb09618a9c34f54f19a738a66b95e6f88e20e01f879f53e8f4c371b571e1438ff70e0a8cd00d608976e24501b2ddd323efe6c1302a318cad821c6ffe641672bb80ac62286c69fcffd93422911c46d43dc9a1f00a73e19ebe6cc09a9801f2a1da708f0f1f98e7f1a18529010823230279f487911cef1e784a229d9e311bce5e2d368e6d613f791ddd617d0f37f604b786ca2bab754e8bc4bd3da37e66a54df1d3b268a5a80379a30a52b1532e8cfabe24168d83cbfd61e2346f901c361f771e0be3e03dae8cc30614c10fb8dccdcaa5b9a25ddd8d61e61f60f22308e12adc137d3d8c53cf7b31984cb813758baa19ac178f2f0cd2155ed674a7509a3cfa7ff66d2d9b1e60be50fe7fb79591c500f66bb1d35edb80263f4b696a3dda0b9b2911d01e76e9070d99db93d1d0c3874cffa776ba24424a6b453526f7c44eafabe13c0750f9df33e82105930139e70b5cf1b09dc3913d6bf4a4859f67fe814ff038f0fdab93522a35e7f81002a395989d68b8b7e4235a09837cc6402a5338da08e7c73dc63c43bac42054c694f4931b80140d6b104edec995cebcc5629f85d09ded8257626f9fa4079adef81d044c18bf2277daaa41931b62a6028f89f95f06d8a8fdeb95eb2eb1e90c0d8523e0b476b158e3040f212390ab2503021e8d6fc0733b963cc6188fb2532829925b59c8255d89f10b657053d0fa1d8e76c84826a4609284503d3a101ebfe7af93edc423ef5303cd946c8b570511e38eb04bee0060e678d03e4134f84f279a570aad0332417fb2099e3f1f279ce7d6ddb080c5d83064d107bb560b21183ae165cbb54cc75313de72d40d1cf5173455aa55c5c356d7c40a2a7023dd95d3f89b515d7598f800dcb7bf68b707978ecaf55b794a17559bd1e913f4472b1830783bbbab5f23a760c78c46157fd1b429c445494cdf92fec8bf9fc217d3ce2697bb6c671baa793cd0c1c84f579f0daec400beada799a9f417fe4744145f21c6f8559afa7a514a0e951f03e5e68c17a8e5816f3fcf41774d26be2edc11fc3a42cfcf00f817c3d0fbf474fd7f30c9c3c6be7f74fcc79fa6ab07cab037eea7d83866673a74c087b5f7542804071d53ce348d2e836749e35af0fb884d5d53abb195ae1ee6e9ae35dc91be359bcd510a7801fc243c07dee92373918aa4f8a89eda3895a52456f7244d1ff007cc7b1a52cbef4c1ade1c2c0ac189ab24b3f260475e1d08e7c5bfa30a1cdd71de5ace80d5fbd1d0f17198b79c8eea0365d139f2ae73cab6fbc9a79786896de0ce7fc747d68fa4abab662a09e0e409f7e652153352bb92f5da1836b0e92b0b644c821b2dd2bd0af193ac0f8cf5b8d88432f0248dab09b46fbef2ef1899b5981e9b33de4e9927ae50890fefc35f681e075d8b0169a2e16feda6392ab9858db87ed18acba25575afd1feda9fb3fd01ecac13c245df6972f65087513f505187c4e8ea54b6433fa092b6cd3af13f4718693904435c55d273060fbb5fda76074691269493e86f287922d074e54eff04209b2fdd3417d8436d1395e638d57db75d68f4f819141b6daf4d13a9a18629cf5f84b0cd02e7a397715dde5476bdc467218d11aacd6ce399d9d54645bb27ca43076b7e4e57fb4f7c4f4b8d0aa949719d731c3a927fdef1533d773cf1bb562d5ea43817a5acefe9eb7e51029dea143e8a1d5f76f9bfd74a26c6d38f54194319a1aaabc4daf45efbae770b9e9d834c09fe45c15d4bbc0251d3df2f2f23387dcabce6ca7a59625e18fd997770d164c338d0692af97c749fb746c0d3944ca4b2da6d3ad7b8c3aa922fc029cf9ac5580cfeaff50cb2e9044211ea522bb5769beb7a7bba0743f345feea9aa9da6ec5f0579cf7a5aa4dedc832fe3f65185a31fd49c0d259e3b7f8fa96e110d130f588cdec30d0fd4860ca6673c46d961fc68a4020fb03ae24b1ae12967ec1ed19abec0808a7ef89521152033f70f406a7005819d28dfc556c79de18584088f40be40a555eaefa78e3fa3d9360a7cebd963555cf208dc408a07ccc1369f98bd840f5c940721064e6c7cb241ed0697af0facf36f05632a504870abf90134a01af00d340f7a5d548a8078c2049600ee454d15eb8ce58c26b3c8185cf9dfcdca7d4b6dcdeb82230f993d51e701d8387b06bd45b4b61dc9da6d3b4356f50c1d4ad2b467d36ac092442fa90d1deb014475ac7ce90c974063459dc951decfa30d2de4c70fba39a8b6931217d0924ffa783c8c3daf048908e4aaeaaa3b7c98846278afdd1753252f39caed7d334d8575ce3ecfb2edec31afeb2bbe67fa929a267376293c2b2f295cd8dbd66106e1d9518be1798949f3315e0454d018c2b706fe836fb37ab908d9d698af495bd285a74e4cfc7612d42121f43fdaa7dcf44da82897b820514d66b92983a3ec819d2ce208d688b6f0aacadc0cdd619d815cd231ad8dd9b6dbad9c47e16fac098d0f4279ab52055d2ff765af6e3618c4509fae6ab00fa23980efb19a26e0a6ea4c9a7dc699121388748449c429b28ad2779f5642f05ff58b68ba3e289f90eb27ce06392616c080d659338caf274d46a90d58f2bfed25e8d4a8c62030a5e89f6b1a5f6112a38661e2f2b5a37bcbf050812dcdce9c0a939adf929c921e7da0c30815da318eb2f350f286441cc92060c970077623eee68b8c6fec9fffe780a6fc85fd7af90172951337af57339e98049132a4cf58874a7418fb7aba0628b6192bb2c43102ee6b1d7e824725d9c75d34a8b69df4a6bcb1f96b57767046c99ec6352751e2fe1075bb4092672379b3518ddc884fead5bd062b0336ea88bcbe0d22e066566347feb617a322bec561e9aa9d2177eef0dfeeaf6231ad56d0cd9e300709c9317b3d334d8d2ac97f96cf2f45b8582c4128d95da8ca207ae34d3daaccdb128c11694eee6d3e8e6ab767b6886b1f7235d85a4d9c7c831c5db8ad8323f63927a638e19497cfb308285a03ca2c1fe2ac4d919ad11511ecc6f28e7d0e0a614fe21b57bccdf83535c7e2c40840ba0014247190c580378454751eb3f2361d7193e160b9516f7ee1d683b336b873c8ba22e97480a61f002a73844c78309c0a3b31be30a192a62bdcc3d33a7a5ba1f6ae0404a8558740cae46e5fd15971b41c0bc39665a9b92eeb3328c328b073ed5b3720d37a1c097af8a6fddc3b2b067680e6caa760368b0e1c052e804e9f80f26b52596202ff2e0af7215999eaf7d3ee3e8916744e40aa1154322dd068aa15960dc38671a4f5889fbe709ce1deccfa80b9d33ad2fd963fe0581a2ed7718a27ca62819d05baa3212ec7cc1c5472bcf579ad52d5e1b2bee637d9827851c419a4cb91db57b2a6cb4433c1bd209648f1fe170abb964b272bcf0a263ce28cfa3a9d1449cffdf643e37ad97182f0031cb334a1eead23d63a5c2d0a675d0ed000f37fd2153e1afc4ac01692701014927601203ed2b8a477ccec45c1f43190e4fbaf2295e32a9383fc7915aa76950a301abe47bffaa9c294292126934ccfc173115a6ca96f3945fd5f924a5017125ad5aac705106eb852ef3190a24420196ecd37f7c67b57162cbeb97dfa", + "signing_randomness": "f76224f0024cc75ca18d75487e0edd88518965dc6dee53b98341db6894165a91", + "sha3_256_hash_of_signature": "dca59b1b9c223b8477545af049d6f19957476817c2b628f5d9a3d3c1dfceb693" + }, + { + "key_generation_seed": "1d9e243a35118bc7c50a50746e1cf19c9fc310c7d54181fb95f44753eab1b94a", + "sha3_256_hash_of_verification_key": "893630fe73bf5ec48386da241aeb42d15bd1d215608713ae8a576d8f45cdcba5", + "sha3_256_hash_of_signing_key": "640db431397f147bff346b893bd3e8813bf463fd67fb1b4db7a7239ffdb573e3", + "message": "96ad5faef409b8a4c21acb1acb596badf387d26656be3eb17987af59737e324b7bf8412a306b0e706aef73d79af753d9b0064ba9ced8dcea966543fe748e2611709ecd1ce6e4dd8fa812d485e91809a225936675369574b0d104a258e3353ee0e021683615ca5c7c531fb29a5025cc7f7323860443dc19c9858f741eb9d24a9f6f04fc839b67153214116e8b7fa982f338445830f915f7c85c88c23ba2a3ce8e2020a9d8dd7b18efe95563e3924d2a341826af51a8584cd026b1c433ef0221145ba8bdc8f73a467b33a9eb3e8cd2a4d671c17d7c28aaa539d1c5bf2f4138639afb89ce791daf0ef0281d52598f4c13d210974cfa1f099a0fc70b1dc120e5c00c33a2bd360bed57cce069060d6380be2204852d8bcfff4918ba0b70b0bd1e1d55dc1d68db1d20ae713b0093eaefa1e33d40d9bd95cff17568393e9bbf5cc1287325d2668f65dfcf44ace2f6c6cebb62f1433e69cd19e6c6532ea93682b22c4c4a62c6abcfaed08ee64f32723e56205222e4ae0831ab8fca8c265fea0cfc66aab1e367201752aec11f752b963792c071e42a8a1ab80658a0c6960147ed740cd07f307cf6a644a98e1d2e56c625acf458d0bdf6216a4f1b9c78ec3f14850c803a4207c894e61a8aa88840a27f2b439fa7cbaabbc789102a95323e06e2c324859db92c6ceaefdca389f677082180fe3d6202ff60dab9f87e3b84841c0a4eb5974d893333f7f1513e54ea4ae0731ec409f69b77089fafb121300042880ea59b7927e9435eabfdcc1019a96e145d5d157998d620e7bc6945dbd6cd78e94c2d89589f8dc8a01cf1b295a26b091847f034937f764adfd811f52b3aa187f3f49273eae5949ff34b64bc86ff11eefe378825d526509483e7191b33333e5465ffb025b269f898ce1f83ea549f1864b556c729f510118921b69594f67b8c229236ad3aee55bd7082e027b5d342c976a549e01618288944de0b2c77473a25201b61034b334968178afab7f8cd1feb6a25cf8dce3586ffaaa861471e2ee7f0c22538fb3c95d2145965c4673e6489764ae24b4f048ded77fe3487ae175f6d4898f69f9fff276470a93daf986a75f685919d98c9c609c795d4785ae941c782b551ef382f47209aadea19066ae5d3eba7bbd99e91943f1e62754a42ffc8048f7b87f128ccf6c96bd760b45f07f740e94491874b06cc3450aaf55bc664b407c57369cabd2708a9c478dff64d292d96ab71eb997f8b71cdd6ba02f52c5035ec26e8111ebf8268cb00df9ecd63bc0d557e2d2e77a6363b00daf25237e77dad03f929e5e9b39447a70d4e5f4b90958f312c80d594e1b1f3d0d23f2b0d9753bf3544061cf0c0f841c440319e74f9b9d15b91eba1e680ed6aab7d63a97b48c0a4aaf314e8e77e2ea6be9dcfc7b5557fec1b996a37c86cf6941325ec356ee75671726bced7d2157be8d4c62cf4bd0420baf2c4223597c0ef75f7a7c9533d14be0d21c37f06faa53ed5ee0ddb025862417f98d2f188895395cf2fe72185acbea952f55cad7ec2d684a5ab94b1257d7abb565b8c07b88c6335ffb9d2fc6f6779cc24fc3cdf92bb3b12ec54360a7cf3579632a2a65c518e57015df1c616c857f83f5f1aaff693acff210dd1e95ce04cca9a0bf385ed6ea2aed894e79d5133799393469b666209371e708d4d279e1ac5ace28985d0db2765d547c2902b715baed5a4fa3e7aa42645f3bbe1e9f3cdb87b1dd8dbb5aab08626591921cb49e552f8ebafcbcf428470719ae40b9ca847f31848f39e4d42049c5d40b0bff036e5409a6a12e7924148e60b64bb83386079b54486ffc8187302893b8bf826578d9ca03a1291983f21de7f6e65458f8942dc1b135c6c8c1fef4f3863a58db17112419590ae57b9425592ff22e596191e5ba7c513ec315ec3476c95a149f6a5ec1cf24870400fdf46217a23f42e0b61157c3cee23e7916b4475a94b96b917c171b1a34db13ad98833e457343f94a76ee226fa5b9f3066c2fd69f14d3aaed1b31f5114780442ebbc88d0de5f689cd910e7464d73423b9d4e03718c5c51871250d11e27e28df1268166e3af328a80d9d335f2d27d2e91dc61cddc7f733e345d56c11b6130875d93d527f93542fb352407185e7ac07051af7f642e34fa06b1376ba15a35d837c1bfe090ba67a89fc1e307dff3f02a988ecd48fd229733f641f2609ec8db14b1a5ac170b104f03c2509d2ee6844c716766d06a6a25d957530fd68a8de6f1753f83ec19ea2deb1a4f9c7986f20ff60a7508ded6547a85baba70577062e8144ba0496777a5218595e021937febad4bfdecac29e3fff2efe7d598fcb86f93a734e4c573e1496a6282a3b40e817dd3c9d631939aab350adc703899ee3bcb1b5eaf6ea8420dd6eb2d4f64a1818aafa97b73c75610b6005f1edc1ec7d8f8db1e5d3e9666c1292515105037d26f2c8d83fee1f4ef5deeb287cd7c1e11960218c1b8bb50453488bab019435065aedfecd8d218bd1e751fe736442e8d09ce7176a71c06415a30b070693a68bdaa5cdf62351ae665f37fefda9481e62ec181ed24f0d0649ad01c89ac422f1b7e27895e55dcc2fd817346d361fa559094b37894c0b478c68a1d7564d089d9d4417d5c7372a33ba475a81fc129f3259c5407bc7435825b415782cc84d85e69d9b44b32d78fa255a895cfd55319dae677ff89d93a3884ce9401775563ff1788cf3ac11cf96daa199e7f4579a0264378a323fda64fad2349c09465fb23ba09069c7fbc79e7288a82f9165268f6842e0aff0e250c21bbaeefb4347d4ef1cd51161dfd29bfaffbedf71dec93f4157a5c18995379ade8d15db59ec4a8b308c2eade1b7ddab55ce2220f3b3ae8cba7c8211cccb3846a225b438f4b37df54363a987c5c4e6b9d20ec3c0096317d11f982184b75d8effd168b7b41317d40f903a23a2649999db36caae31ba5d91998a684d30aaadbd3b1ec154bb6c92513bfc0c47c673254f42b1fa36b995cb737668cbdc2a0d1ba838e74e0e50b22fc22dd048f48b6d1e89e1ccce5a226f63ac7b8e6e9e8ce27050bf3dcd7d0f35f47bbec1caabd4d619cd77302ab4ff6f56dfbe9f5821aff2d72ee6a628daaae4440edcc070473bdaa54ccd775331ac2812fc5b9884915da582eb36f85c7923f06d961594753802efc5883ca484fc64face42de6c3105e23cb90663a3b381d0c6a7265b740bff0a1a017058f06e39a74bb07b63f883cf914fe675e7e5ad5ad44c9f90ddbe23a125d9be02264edc13972ff22ba48ece8890a223ec13addbe055a8b4e03882677fc0d94c9053da6ced34e132fd83810a793350446d60ae5dd0d174b534a3b6f5bc1b497f9406b5cdd414401b6dd881ceabab12cc51425e88a81bd9e14bda18273583cce0849aa48dba1cfc49cdf29242c73c99c87f063b8b739aa787570459c098405dccef78d6d97c21545f2959df9cd62f9c38ad9a849507c23a51714565642dd76c9103154327985f7dcc701b795a7af8625f06367adc11a7fd7b6abbda5b2ff6a825dd43b64a48ede4eff8603a82159a6011f9e626171e4593c0e963595a6e068ad05feb12378c71ae515a82c293eb7d2b01b333cbc7991b44685aa7513b3a58342ba5d094b773e6a27f8582f3dabf54def59974cb8a2499369b5b64c7ac08d32d75fe37371c578073dc83b82a828dfc325976ff282d3f6", + "signing_randomness": "070ea4fd2436b311dbee24426f43a86f263cfb8706873a4454bc5a75c5575b29", + "sha3_256_hash_of_signature": "564209d2af195a6d8992abe7224439cc68b32801c24b4cf097c909e8406a6329" + }, + { + "key_generation_seed": "0a46fda6ba71125f3415e8bb6c2d8c00601107fa563e7f6386486a88f87701fb", + "sha3_256_hash_of_verification_key": "a55a50f742b345a860daa0d25bc1029cc6e54d9acda82da9adfc6863eed5fc2f", + "sha3_256_hash_of_signing_key": "297402ca28d34db25c4136d848163639c944881a3afe7f763696629230cf98a8", + "message": "2447d338bf1a375b66b77fb96cbe7742508b57dff4d33a368ebb8451c2c67b980d3576e6588d8678b285ef288a8b5c9c2726c4a550e764e47fffa2a128533a7653e480288447509e10013ae1944fffafbd9e2baca0b3c7069c07a4186c056fd3857caddadd5f891512daeeb26865f5c89ffa63a64c85a08e41ebe7bd8786a8add571a4267d5a9e426840a0b988e197a09f3770b5b0d80d65515cd4d8390af40e6150062dc4b8661a8238f232692c152c97b8cd5bfe7b5ad863dc92d99744d769087b3edd81d2e475f5cf0224b10cde6fae8dfc3519efdbe66805ad4468d84d3dd93430363677360da8f56cb58a6b775ff6417c1f324380b15c9ba668eb0f25fc2a690b483e856f3327b2d79fa6259e30d7f76199cfd21152b7c6ffc3fc113f70d3930c08b3c1eb1bf25c100c5a930eec2c52664f092b89614943d9d85ed86a2ef666a94f9826c3d116a2bbe49443e2c11748c977716381d9463da8d09612b80a6760e5a6fc5f59425eaaad6c8342c1ea4beedd5d73151ce213c0b155286ff22cd28e3bb88e0cee39cb859900d1e0fc19f6a7237bda8e51476f4844a316752fb347492a928eeb07aa39abdcc0164d1921b61352ed4ac94b82c410a56505633bad53a3e649acaf64c43c1acfcd4715fc594af6fb9e85b0b7ddd6e8621bd12a2bee48223a97ec8502c16b550b03087b6e87c1a860d36322064f8febc52f2b7c31dae7430870259bdaa5889852e3ae6f61013f5ad0d38727cf9d90c67bd7bb3b82d303c6c35383ed86fd5b7ddec824ea198ef780be830a1f2679d24ea6e2feefb979563f511d188f409f0cfd0050fd418414d01e46db3d23b3a90b24f4e96edd4f863bfb333d6a826d29eed167738bbe22c516c59fdf81b032bb55473a5ea2a1defe71c95a1eeb5c028435ad0379896cbbc76877501b054cf1fd2f6d7a9deccd70d0c07111147ef568dce514de96eed61600029c8d103b31c8b344a700de630276ba2c5633419c59e66577659538a6381e45584c7e1d6ed978ab0af89067ac83bb70deb6f2c58e339a5a66176a54d985da6e02002948c62be6f12314240fe18b09aacbce82ea462586b8316c3e0aea00f9998922f8d956120e53b4178223f4d2934a20976fd5a72027c8f4cb33e9bbcc0abd15395151266b6cd5b4a9e2fc1725d8e9ab2cbda47b507bb25ac995edd51ebda5fd19caf68fad8eac57cb5ef0c6fc861a73e64648ee3255db4c3394438f49377cc4ac2fce1b6bc812e5d282f122678713c6c6d452a33c632c0aa47686588752d72b0586fe5ec2464a6db40662fd2106a19f67dccc45692fca03685251d512642b0cee436c78d94c6f5f25bbcb41fc7e5b1aecd52b846a0b70eac93579603e9870f942ad4c1cfc9d49b1132777c6f1c184c1537178e5029067257a2da2827a2ec44d323d13dc6e4e1b9edf5949d4324228687fd54f02ccc3c4dda635fa546a5a6783959b1c48aa9d9c9f6381ebccd979253460857d3cb1c70893ee6f04709e35923883ee3c71c7f33b8cc28b9136b3ebe5f52b9a76817f2f74fdc2f12b459dff32d5a295be374b3fe507a0995bcacf1e7b24f4501b29f1e8b4f2a8cb394b3e459a4296f6439ba59ec88305ab045ff40b1dab4f672f878de1f9e46b9326cb3e2f3457b83ead8dec28dd079af0e984a69ed882e1cf21036578485dfc2debc9cfe82fce0383b4039d147c4c7e31e315fb57b9093daa811f4ee4568e32e5625abe76c5a1ae42a03441dbe766d0ef4df607406f7d489275e8c5d4470866f9049a4ad5c428b843dec3702e86e177e4b60181d2b5f099bebcb25f04c93d087c72436e87a9b3afce78fa31e2b892400b5c1071f8ae0f78ef6f7d71859a97c17ec0912d5ea27afeace739fcf66f489ec6355a3318f79649881cd6c7e96a881ecc4ff6934c3d10d99f1dfd00592cb037749b025bd4bc2832e206c1407e600fc2170c0bb57e5c7af0756830c2a6913e2b9c60575cd4a394f2a65c50e40a43cf5ebca6a8a32335707ddf4633bac7375dd53e24df20af30203b514d3793392e38fa8429b050f58b28cad0146f385809cc7faeff8b71b2bc93d2c6f72e31ae2d07cbb3cb7f43540894e01654edc71ccf4f361a847ec5b1d23c2d4680e29f0e1f992eda3ac41ecfe614fc010a2eed1bad87a7d17468d6fa5356edb25e9008a9bb328225f85202246816e1a542e1dd746a5fd3e064faa1248579d31cd3d65f8fff36f782622402db328c7850d82d8d8a52b897353a2f8b95624d2d958fc1c3ae6466eacca2a6a5e6add4a582d27e07633ccf697fa02e243a4fbb3dc727b718b5ac0fa6aab217e241627e69ca46f05ed6b496a739a29edaeef76992a507130715be555c68a7eead6e8ff3a378d8f4b7bafdee3edb9ec094440e31bba717a9c82a117d05edca2370003dfabfb2efb29510466f74e76ceccfc41709fac4cd8eaa998357170a7a293209eb0bb83dfe5e2f6d73c28d5409c55e95068d647bec42db8098f0089ef8a5fc5976bac421c37dda6c4227bc1ae5ae229f067515cea3d794c8d85564af208ae0fcf836b6c0af41477f99c8773d9dd1923c5c07e1fd508c7436ea93383797f372ef3103546a5278a4f59614a5d182344f0431d065c35620d63d4d001d7f626993241362e67d1bf41419858eecc2626537d44e2e23619381e96cfa91b3d8054681d298509d9b99e7aa99cf8742e37637b24136f8e1b487e9571e4c24ae5df307e4c7c62e55c47132ae404b33e5367c6f24d6680be32d20bc58370145486fd5eacbcf98eb7e7fb6293044067af11879e91444025fe52e24617269be192bb71bd9f95356edbed9df352ab56a854f9f531889a88689d3f161fe6155c6c1e8011d60a46f59c7d08c477fa652b559a80567076b4eac29a85d54c66b35d6960dff75a696cdb17ec9a7b74dc6c3652dae866e8758170d055c4bf60fa1238448cc9e29160df50160c4b0dfb36bca40af0bc5f7d490e7dbca49535742eecb90098a0a0fbbbbc7af25c0ca9bc039dfb555dd8431af188f7c1d0ff786d627c058a0b9a15f26b58aa2a5992bc8fc5aa14025ff95f294203b45ea081e28f094d0d4ad671c885e67b2e9e800f10048158698d56648f67bfa8cc73dd5afa15c1e48936b2596dee34459b484336c20cd77e58bf682479f9aef2fcda86e4f3a2fed7046e5a3828a9b3c0dbffc25fe699f25629a2045a51242e310cb369b730a5e81167758d7fe843261a598e4541b02d0db4bf5616ba07a440665f7fea6213114b6b1b38bc033d70e845445dcd18e23d34d3d6f4a52f5f904ac5d8feca5af1123658d09613209ee19954174a1ac7a8c7f9ea288bbe5a0705f3ce38f30ed5ee69cf5208d461efad51c456507c3729eb338ce15c4c253be21e81f082b0847c6871ca0fc8b3e80115fe2bb8cd8afae69a3c1429d21f149b7446888bb4dcb639819efee665b6d6f69e61452b9328b4887a7c04e9949390980a2609a667267035b11bf862c1131533ddafa518221627e0ee7e4009cd48e4aa9d0753a9ae82aa0257b69d569b4c53f05a75a521b327322c60398db0947d205d2a33ae51cf2cea8c9162dd604f8edbe91f5199d19efbf9896a46389e7bcba54b4aa57cba0d4f9da117f288133ad01a9a9b2a824d54f74d4172be2b1e5f0d3de60c13aa5b668ee6a45397c2e39573ebfabaaba48d1ddb2ab6453fbbac8dcc05349404889c7de23a16eafac8d5e541457c32cdce80cbc", + "signing_randomness": "5d6c5adca2bc4003ff2a26a67c7b7627c67ccda8cc493cf2d0f782b5e25bec3d", + "sha3_256_hash_of_signature": "ca1099a44ea56ab66e3bd4e8a3be014bbbd9f22180ec3a13b585afae1aeff330" + }, + { + "key_generation_seed": "5229dfe11090effbe94ee161054cd5ff58b31e23f567b282db42eb1fe42e44aa", + "sha3_256_hash_of_verification_key": "664ab51baa6bb34eca6fd9b5cee3ac45958c20e63e4403e2e0122df29dc7cb76", + "sha3_256_hash_of_signing_key": "40253c54612cb67dbcf10877ec7c22091631dba5bf251872f442a380e89b2681", + "message": "aafa792bff719a3b794b2f8198ebd1556889c8c61ee6a51470ac9b274cb162af44a26e2ba5ea7663c4c78b4b66b322ecaca8f2ebb6a610b51d7c4399f4a64a870c038797cac80f709ca5c3c9faff7d797963e60983b584130c1b99328aadb2d261217cb95a535b8518a78a6d2f6cb8400c2aaa2daf451391f7b8ab0277a3af88e1ce6f1d3dbc386cbaff15308f073d29838692e645f566d4b3db4186c259bc84606855ea88938cec4f7211bc9b461e39dfbb9e44cbc273e02d4314a037e0a26d60985ef5a35f069d8b51f86e9b6801ca067ab75565d73581ebbbbd98ecb5af47509c8729d82ea0b35f0a376ebe6d90108cd61fbd0cec966c17264f6a87864457f41162ff7210049e6ce2b5354f8f19161e0866d6bc3935815d9267c600dc529521fd092b126ec440d49b8e3a166587657b52ae9e2923644f72876ee94a61d2db0ef4dab33abec0c47a6a725d4cdabd06d4f6a30bd7c90db3778c17b7d8ce82a5123b798d8b47c7f3e968c9e9f82a6eb3c2bdd8fc06d282f5cbf3050f6ff71e2edf7a109f23ab47f427bd75163162c37722bf70a6bbebebe8fd9c39152afeb78c37d718014f739f20baad1597b1f9c4e0b59fd82b834d83daffc935de4a3272d7c2454508c07502943e90fdb56128d6e6009ed09ce80a9b60d51aa2e4e162f7f0c362f6886bbcabe29ef6c7f38b742000b9d152ff709082fafe809c5dc9bcbc6f300b0a7840d0d36f39567d14d8227e7145f7ca670efe917e0f18b0570da3e05dde56883ff12bc0c76c2a1e9feffbb728d991769b7d0b0d34853c76fc0655ae200501c28755f57934bb9f46a3c6ab1dd8e0161c698133f4f2d7caf3392576b4bd2b6f8735d80bcf60656e132442bb7fcfdae160a2dfe3f3fb8209b5c933201785a7e8206096b84a222a68e62501846273f6a9145820f87f450d12c64ff79a843e897c8394ad54aaf4f3b886fb00a6c37b2efd0f6d4dd639c9989e7ca30e4f12eef440946b61d7a28904e1d74009b6d1aedf2fda8b5991cb37795a8ee51bbdaaea34a4c7040944761b9b4b4c12f455c536992a0852f7f07a9aeda8e522591cb4831b0c79fa977ab6bc49c9730186855986035d2c6e5a6d93da43e8825753721978aaeb433ce2f2a7d67c1ffebfea6f6059474d3022817a7329d9dd0e4a292302e4a57174b9c5346e4b6d75d65882ca7339a48c6e7af776a8515014a20e4390f6b4f4a19990fa725f5a69b9c3bd4e8bbaeae49979ac19600a3cec6de154985e236c3d0684269974bfc82301ac7196675f618182d7cf15ee5ce3b7abee0deea5c72f54cafef203d556b31327089a0c0de94f74458cfecb481adfe3cbb5da422bd3626b00c4572b4c2bd7584acd9129a76c616aae51f944becc4682aacafb8e3bb1a42a6a8e5fe7bdeb43305a34a98308ef2d49ede4f41361446a9ae4dfc1ee13d12821be0b01e55b865b563633e5a19dfb6425cb60159c147b18a6419f5085c5d0882656ed533eedf97674d0babb6cf32f696dec0f9921cb3dc9e6021fa198d554b1d83c42a0bf214fe4c0431547384f45aed9190cbcf98ed8278e8a03d551fa284c8a26218f0b0b58d99879db98449cc99b6b399dddad9924e6a7eb20a0f1fdad2f8138bdc7b445bc01503c509066b1603cda76fe41727ab5e027dcb15032e8f66bfa84544d22c501aa6f62b02c0f8764387163ccadbf1ed7238e7f16c80e6c37afec2e10ffb95ab0a39784f9fccd8ae263758abe392727e9ad442a44738d77cb61a6b1540ade751130489015ae5917c927232eed27bbf88481f3ca0c5ed2c31dfa943b2ead4a8c80b4946e3c138a61baf43a72c7a25e16874cbae254d3f14c154f7c60ccf665b566799a01e0f769b60f73c17c840e0018c6fbc10eeda3e35a77586b3a5936b363b2d5cb25c78a3e3aabbb84f1e64df47f97ae1645650fe1751a724ea9bf80744d0f33da6f313a3cc17d8f261585b62a75c167126d899219a26210dc55ab6db2b94e6993849b4986f988efb07478d6621cbf4b8ed772e61b0246a5582242fa20339b2d6cb89ba1b9210a318eb4697fd21efcfd230de9680514a442a13b29d8cb2627a6970bb97bf09c79c6ed7a27247662b25f39c8d675b0747f1a6d9ebbf7cfa7bc51a7ea3a7307ea4fa2a463bf53a645fe701fbf26628731cbc18636567ae633a49e59f6f049447803fa3d4f1f79f38026de9b07d8610c9f01befb7054aa46e523e001c1ec3a4e7084de0cce596dc63d9c1f1dc03f35f9b1918e62acb2640102e1d520e900969d53e83d2dbddc80d1dc54bee99531faa5a8d2dbf8346c7ed123587353dd63823453de350545c176446845bb3522a862f5d675419da901cf7d2d1f7050abfa3237d42753203be251b0364379232d2d9d8642d52a60f6f4cb09ef29fa1e6069f97a1175f8447fe98a813cc182e33ffd8b8cad93bf32a60f1a9e63a79a7f7fb9162783b89bb57f3e73155ced1d0084d5ba967f76c89c61c1a3e944f3b6f78d6cd3d1139a315c5276493481f3fff9b6a6b40c920eeed9efc74108c6bba5a15da736680a23db5672c5a32abda24b49f2011f44fa8ff9c73609ec195025f0456d753c848dc6296920fc32dde2174d37bfbcb86cf618aa0d486ee46c5e1ea14a3bae4952af5d4837f9b8122a19d1e59b909aceba6c849c8b452cd6cef877a65fd83e6d0c6ee35886688f1d877612cb8e671d83216a1f76693d6a4d6a2ec13eb6ca2005328b3c91f51b352a707ef8180f320d6e1685c1ef4d87e3cb77fa549bc12727e59c11bdf8a9631cc272998253028cecee8a2914182b90f586d80e7ece370979bde683f37123090012ab9243a4c145d6349c2791dc44e54956c5e9b59fad017d3ea27d85b48a896671a0ac14a73b5ab9145d8ba6aebf9ea25ac2e8e2c4d16c5009a83d0e84ceb80e95df2cec4cbefc7f5b90a84d408e8c4855f9aa2987d9fc9d8a451f32b367bb1de5271ed35ea153b5d400a6d8050ee82f519bd930245a96c9727fd24d8b94dc53d4b4f00d03172cd6b7f2be163b6d16fd6247b01988a6ee6ce7bfeaff78e983b8ddfba4242730e52b57876e3719d1f9f6cbcc81620f848d23c31e3fff7ebf2afe5011e6466b1889e7ef6281faf8b18a012ceb96796fca9b28e78335dfcb85bbeafaebb0fa75ee2d0d391ca97e05f0fe43475135b13613206a0d88438f17ec8e604b007afdcb9fa1378b7cb96675e0b19dc6fb02508e05a7fdaaf09297a3884aa051b6389a52f921f8ff31970fb082df554226c2613b80cc1adff770024d6bf011c0f028a012597ae56f36eb6b3e864d79639810b8ba7258b18192b5caa80dea4b140d3c6f1d707acd2256d676ae90980ba80e10b44109211aba830ee96e1bbd248315c804d391a86ab7d4b3a4a37fed90d9867da4b93fc32e79403e5d78ae99af1cd2acce65d4f3384d9ceab71b1e93b99704c64caf17b999234361e378b9362d14be3fd9e6c268013cb1fa2ea8361749d635c0429f796eb15a685e31dfe7a76ae870eba120331ac830f8c486f6c0c4f07b658ebb9274a463e0eea101481dd6b58835a303ace802ae79ebef51add98a67b7ff7968815acf4504b9d360f7c0120a00aba1fc558e6cbd8324ec35e0985294563a8d7eccccd9e3d1557a09885770836eccc7aee0f18b81e30f85d695440b5bce29945cbf60ff402b281942d38ea33a4b03e9fcbbbefaac2c455e8a03ff3f35154132c538ea16f0605efb788c3ca8435f6d595f776433585094abc75ba581ec59af701f66dd6091623e4676d167", + "signing_randomness": "ebd1c6baebec97f440195e3be0f8d98ea95b323dd3ac532accc676f6aac784d0", + "sha3_256_hash_of_signature": "c58f1d5575a3d6b105f1cd1212ccd9e5b5644c927ba8cf9acfb5df1f5478ca36" + }, + { + "key_generation_seed": "18aa77795aa6d7ade8b6cdced81a1959a8329677f042283dc8ca71e13eb3adee", + "sha3_256_hash_of_verification_key": "42681bc47e814876b1a0e1fe92f25adf91db761414a872a190feb0261b120ffc", + "sha3_256_hash_of_signing_key": "133f2c214d87223dded9bd5ad9ba876d76fd8b8ff4bf3cb02fad9c833683e418", + "message": "63ec08b711ddf5c66036a13f574bb7be76445a1d1f83c7732b9f4c25fb9e799d4afa55817bcb39b974af92f3730767ce7d863b6a3406450dcbc5e0145d10b7d532da6e80196157c38d1b6d3c173f74d67ad8df24ecad4d9b59921418863a38270b982c4392225edd1845aed2199e2c38b36c7e0e5d2f3cc7f6803926d977c59ecdac67ca290658e72bad633358fcdde2a4b9c40169a0c7cccfdd93e4da3c3838e9308533bd468a9128c5a141c4842840e45bc8e4610a7c5e7535834c5ec73312a50197c76ae984b3521883f549be04e27d97580e6d85d0ee84cd0b8c65bfb1aa005c607de82da70021f8f90b7912c67dc5657e1882cfa6da3de1ba4ed823789c052649debc9085c74528162243133a6ae5c1c6bca3f730525b167d816485e40c208affa8706e3d74631eb4413032730a7647548b77579323eb03d36c2ec37d2389d4a17305f607c78f3073a2f4b4395bbc94af163acbe3c990306ba3f89af9affe785c3f6d102fb2bd55f0c1044034d6a871293b31a1b38e383cb926baf3ab4b5f79a47e9fa7b77bcd58aa35a7f16ddd11ff642069a8a327dfa800049babaab4afbeec9fa98adb9796fbee925bb70ee9e96540436e1473e3ae4c56d7099d8dbdde755a7e101bcceb596b9415f52374c8a3a73ec66b229dfd8cd7ee7d2cf1c5e7f490c7d9381d9321b15f84f640017851eced1dc80d32da3a0a57adc3ef37e021031866e278c7d51ff5ca8e9ecea1082423b41d772c5adc61a8c71c3d4caaaa3433928d7931ee715875bde2bfacaa0a7f799b45241c21bd2ece4a5944fb6890bf24908de58dd3c76173373254a36b0b2ac7d67926948cc0136dd9a5079d776c297fb6a585c290d5dae1c45e91153299eedb731e527f0f62e83c1e93c75fc74f9c7e63311562b0a55459a0d41e034c3af637eb29bc789e5920daadf265f42f2707dd1ad490b5f8a8d24a9968bff11a0c364a779ec385a9a33edb9cfc7dbc672ba60ce5f421b40634270b982d619f8e7960d32e1b8a76cecd13a3b0214dd34214cb5bb7fd530058d5de1fb9e4e88adca05926ce1f5597100f55dcbf64d47fc177ff87c4bd9f6ed7670fa7b7d339edcce6fc1eae069e0c303138689ddfd23396c145b79afcf68125989c8477bfc318cdbd69d1aa6d3ee41f4b1f9be4be9fa58a072412078cb9196556ee56fb7b2a2761dd04120fcd9ae9736f599c8b96bf8f964b305530a6df1f94874f36f07962f87acc0b285eda64d2e4857e26bed40e9a5dc0327f1d91259292c608d6c6d59804dc23a34d1f9f1b69331d68771e41542fc5d669cbc3cd7f8310f87e8fe8f6201e57b475de2318ea6ef9f7d32a728a44334cc9df28df77038c37cba62ea8cc5ee80e571879ad111f35b6a154fdf8d40fc93360d547d02f0743a37ebc4af178c6ce36c92ce6b80b6350202d2978621684a19afe1474155bb962014587b1f5a477092f42bc446d7811c0eb439a6829e538077abbbf03f515f1e6ac018efb05af79069c2569d2cd7140c4b1b47886064dac695d59fde2d8fddb35318d33edad94ad4fd988095b1156fd59551f0658ee666186369bfa84e30672e4659bfbf7963c377f0039e08de2c2d9803fc12d97b5e67ce9536af12daeb3b9903d8d95f336ff53286284bfe8d7ad13ec21c2a9ba93c9a97bd7f6148de7c8cb41ca75a9ecc8f9cc68d888faf6b3e75376b5b16f41e7e6b76a686eb365365e2074fb1d7efb1b285a2357b020fd3e47b89943fbc1596f3fa8289ad844386a691f33daed4b7a6a6729526160f2d32ba7f68ae6678564fca05bd811f208a8fa62f6731f23d46027008246fd4bf3c454a39ee225245e74da5910e7937b36661548a55a2270a9d27114ddc94dd9b9d4122289df0a5700222a977f15fd8e36afa1c4870bd3ce9b658e2d83882aac5f3db814346240ff8c8fba3f36e52ac9b441c76b6f104a0931bc45e202addcaccfb93a486a7734a6d82b9f6ca911448f988626846d413d987c5ac860fcc0d5f734269aef88d41a055794dce832babb7e306f622e5eaefdbe1cf195e320a1aceb4834b3e70061ec2d624c12eb35b16e5aae73053a3290d4bb1f51ffdf48c1a7218d365db7fec15bf0f710954cdec54917600014bde3a901dab1dec0844d7ff148eded9788cc85c0cff26e5895d91c56ba6950c0ba8fc6c773ab4a6091a5de3ac335ddc2110eb0144fd89b3d815ef4a26f718c1acb5723af1da5515442a03cfb9d90623fb21d78daf441000e285e9e7c235c0f31e258e6b3feac048db652b83e07848d2e9357649372b1a55975b2ec7fcfed19d0b6613bfdbb4b5b01a9aa3128ae137bdc1d8ffc3a38b597578042cf183ba8383c289c3d92f6b70aa9b3364e9fc5d43f3cd3f310d229912e91d5806c2a11e0bdd208a2af438be77b43680e2de67918fd414338a763910e1316965bf96bbf7df639266d075e90ee9c073011f6783750764fbe4906ecdd94ee9fb7e4aedb23ee88ebfb018c44fc8bafc66e6b454a3d0e332c7a6b34c2e8d1d26416ff43d768cc36ca9d3168355f1a281a6b2eaaeac7b64aabbad2156a1d781a78a896248c56f3491a5dda8c22c231aa7ae14bd558f66e6280fa65f20b246d815bff1d3c6cee6df9b4aa7f750307a7bf73850e6bcd22ca0ad74b4afc13cd4aa2fb7e7b588adb3a46a23ec88a34f13214b261a283ae8fbce8007c6ef6be255c33218aebecd3ec27edafd252994b70bd67407620d26e8567f4c7f6d636803b6a27eacc3b853706a8d57adbf7f7e142ff149c35119a6172d5884ede7c71e6c34d1b485a684dd56c9d670576b75cacb870a68ea7ff2bb461d9e2fdbf500b2f200110265a3cf24370a3f480da66f98fb5327b4cd796eaf0e559a5519f3c643b59e3b89d05d2a9f9da6732cdc2996408b7fab5a734310fcd73fa3fa5cacaf31ab04ec0b9734407c6dc575350212239ac9092da5812137bfc40f7735bfdf9827f768fc0363fc8c5739c7df828075ea2bbe6321d5a8ea2eb7e397c3d58a953c7f0baa69a96ac8110b125ee2e9701f43eeb87fdf58a6e6266be1136437599e26e8e6e853dbb6ed9df3931c5f402fd09b7e203ab36eaa6eeae72e908bd2b9cfd379bc9b407f0c882807bbd2e91f920eb24137002a48f1aaa0cbdf89fde5c51079f1d8cf7a014207f1b40773321ad952d77ce18ec7b48f2ca054e65420c1132ab67c832ee22ffd8672803cce3de7e9fd0690e55fa1af5f11611e3e2c71ced55e3e347f4cbeb9c93bec2b98e48495585392471af0ae589257ed8d01792112c798bca5107030f207ce567594b8433490d8ff1811f21b03a42ad0678927183321355e3d6908dc1125cdce038cd0469d72458b6cc5e67eb0d78c20819c6f3c4518b15cc63754ff8679915e329dd46feaefda5249ed7e754e7bd55c75cb764b6cc36bc06267b2479cafbb3f0bae32a93558190b65c85dcdc080cd56d51d4105c5b0717691d4db1893ef8ad550f55855b4123a38d18fd67b588a3a4c2a6604e874d721359352b235c17ab1da2758712af8179ff433211b93078735f909f985f557d0de52cb9203ddc67bf9dc8632acd8d4f90196af6bd2e79834371c5e9fdf5992adb04aea186af36f56271f763acffbf94df4b0512ca6b7ca8ff486504e565bda367e044fcd0f25fbc2a6c720867f95bfd92109780d2e6dd60ce90a4ca8eeb8c4cab289dcf99e687b017b37695c3b99b4fe97d7e5d52bb9813c04d03c9ad71770fe0986c7f3a3ffd3a261ac771de88c7acdef253e5ce2b50bc5c576d132b68ccc694ba883770b80f5ed7d527cee816527f69ca2c101747a0088879c3663037db5b", + "signing_randomness": "9f62a11e9b25ed3d43cc846b3f45629e99688cfcf09af0a673676bd209806b51", + "sha3_256_hash_of_signature": "0bfe812a8572e8ffefe02bbf2579086e245915697959fa17a24826b582a02bbd" + }, + { + "key_generation_seed": "4b2d6ec32be9c5d8fa11f3fc0008f4f26b945064d98362ad912f452692ac383d", + "sha3_256_hash_of_verification_key": "f659dae26b9912a2902dfc089504c62953e185c608e9126768398812b2bbb606", + "sha3_256_hash_of_signing_key": "1f276963196e6162e0ab5fa41d0270b6edc8dfade1c41f37df0991822399bd5b", + "message": "7785a08a3892c97d5ebfe52475298ba444674086d63e17e1faec96f6b10723447fc1b8cc758d1724a33e26518798183a4b3c99a7da54038b86473dfab8e626eb3bf54de5581e04450b2821f5020c466505990b173db9f030cfcfa505aa04b37cf0a063876843a042f17aeb1728787187428f8d1010d532c94c7ab2e1193994bff0cb56415fcd2a96be7f7fc2c57c8313e795367a22b6a17ce3b803083a74fdbcf030d91c957128099d6199686f2bea618cee111aa9d55a6f9e8966c102d849ade596a1b576924de0e92dd91fbb01cd93e24aa71eef219a78430d84965672fe6af091d46dcfa9ab906f6240913c1286ee0a152666ecfe2c154cd3fb14dc0f9c173e30fc9958a75aa6dd74822af7acad243fdfb743e47e48280990c2870904ef1c902261d0bd6bcfda91412bdee9a28c628f218e7648aa0027d918b48ef30a9b18390331805c6739bf6a2cb69a0de8766a7b3a448910d181f6449565a363430ba1c0fa8b11e1a151f6cefa3870c3b1d8cd800983ebd41b48c5624269efb440df23ff9bcb31a4b02f6505dc862b2103f76137fc6560f893577bc3fce92ada27f291305f2345ac82a846854f172131b042735d4b76c6ab2dcfd32bb6258b23ac790af2af7624451172fa7a29e0c5fdb3dc3b719b274b2838ff7a8b25f272ac8ea90fa3c8010ac7f65633eb43ff7a0a95ce99717f35d3c416b0e0da30470b5aa20eb9e2b66315b9407a4753df8bf505b8066c5d57ec4ccdd2236b9c58bd7337925191ed7b75b92c9cee626f13eaddecb07173c8160540fb9f6a4d43a1e9ab263b300c08966c247514647dfab3b420202529e963a51f8d23bd0f689bbc4d67d5a603b876e8cd3ec0770f0d9694dfc30083991cf3989db1812b4ac5452358075534190f012f7c0e47734c3ba748e04910783c0b845484461dcea67a1ec731354b902557486b484f67183fc711d10f906c68cd01f46481d040f084271dd784e5b958ae05b65bf5d207efbb5fdeb25366d6ff4161ca3a1cb71b2b9f90f86a315d800935ac0086d85d907a036c4333ea347000a0755550b68fe3dd7686e416483781b563680146697d6fae8333c24adc8a2436852ddadf6061e2b16fd3829c0b55c2e9c2c89f64cb8da02a6706498cf0330742083e9ac4593a1762d32dc4e6cc2d9f4310014fb15debbea324ebc2ea1e1660782559b9b39fbcf34c85fda9ad350d195ad7587aab621ef7ffb63277ce35ab43b01977c9f8dd6c2ae7b34fa7b35d5fa37d8b3719e736f18734cb3a2468be9ca0832dde0b958925a377fe6751c4eb8ff1ad295355302f0a5ed4e8f8c33fd5162542b8ed7cd985dbe3c84401830f6a7eb9d955ec74c7f98b02388b4e1353317cdb5eadaac9025038cc01f8655c7fb9aee940fc4b282748b39d277a7fef462038833a9a8eb50a8719f68b3e858825911f294a80faede9d4c1815844c2632dd20387950003dab80b1a58e541a5e6658af7d4cdd91fd1c08735b584f5c69c5ca94f6b7f97a4761b127db394ac72e902db9eb4b3e0b884c448ff2763ff9add530753263688cf92bb746181c17294bffc2a0b3969a7bba429a481c425b24745cead66286f5df04f1e4421c56acaa668e87ba58e3b07a062d1da60cc6b411667bde6f466b72c9169965bc7781da78a818f779a9b3d7a577f71a1df49aac865a0d6f2668cfd2c77cfa8d306a14dbbde4d3a3818b07dc89d5f51e117f7bfd007d60f32bb1b6bb01e76862398371fb91e0a3d4b39fd9146c47f627a066618cf83c32e5c82592b418bd2f5dcd8d42234625974f988a6f729c60ba5eaf18c77b611dfb187a581e3a10268a965f650fe242ce2fe08aa71515b59a6edfc9cbdae22df3aeb22e773cc2eb373619e9cda23c236ca3f7845c2136e93849d9f6aa1477f4513358cd8cb4e21444c9e5709818801eadfca23f2c23ddfd5b4ebb6089daedd14a21ebf3f7a8c1c80bbf7d37973bd156ac5c4462d29dccb7eeffa22a8b6ce433b600532f33999adc39196f01230614767285089fb262d8469dc66d24ae0b77fd05c3ec02fbc5ee328319409b8e2d7b0ac6801c1c8ba86f793c2037c71e2a25f114e9ee0edb3b83076eabfdafedefa0548dae91e62cb7c29c03413235b8c6eb9f46be29de8f5d30e8d97db6f45687dc4719b1024e48b7dffd0d2b474b2032b4e69b6382e603d4777f3450e2e467c6d9ab2782c0ae266c320d36bf67bd6b86ea9721b22741684d9c0ccc774335430071a5410c1e34b4bc1a823a93a38f5ab4781cc593b13a593867fb634c0c705107cd278c6ccee6d842748bfbd2ffd205c6bdfb3ac87f693c25c832c86d96b00bba0af88dcfbc8ca4328765de27fbf1389c4ede28317bd0ee447f030990e957d223a5ec66ced9d16400af6da8663c4e4111b4584f8f0066cdf8258d90c5d7b439503e3ab3fcc55fdf933e06d704416187aaf86e6c39695dea8b8189ec1299670be03b6a636889cb7f10f04ccd67278e77886cf3f6e2a05ba8d25ab8664ea817642acf5db4d9b3ef80e169463edb6bfdf67172e88d233609b091bbd085b970db8ae0daa5048ca42d6a54042f42445bab03f9bf1accef341b7349109ba0073d3715a9073ad9bed258268aee9dd5202e0edfa5720a317ea5cb41706c0d235465becdc8e3ff0d628ee5eea6aaf1bbd3e18fe9217516893df115e979c4cffec494988b6f9b86026610898c44ab1547c5f8ed5cbf3c3a837ddb6a444bd3e803e1824e6ab931310fe86b36587f1b34b0b48d358f4b97e9774213de7d92571380be2199e703119c5b9836dadfc826b71d588250ac37de0ec05c5823573c102bce44c9f044507671c4e1723950a3c0e14968cbabbfeeb049eb723db9b23cdf0273525c29cc5165530a1f1cf830d3551dd6bded53954947d5c334dc9c71907cdbfa109ebc52d6305477c14159257af8c51c6f09d76fc0085c3d969ec60fb09145e66a8a7489611db3fdefc35202b8aae82d3cdf666034beff49fe49a45c5ec438f4118f338545532ced916de78e3bf82b4e55907474386b9c172f393efe895334f7323cbb2aa7ce7718bef5e7a23af734bd4963fbc7889aa5c50f3955b904b5e577d71b21a293d766865e3f8c212de5ea084a9d22748a8009a7d1858328a1bdf7ba0f4e3b83be9707629252b3339cef796696855a574b4a4896ca68c3d6a6824e3f593069ec0a571e61282f8a29beb8bd788f7b351a8939cdad9e257587a77804f2704f49db3305514b85b449aee56ee40cb2a75d51690194284aacd0855b02893f8dcd3091629dc548705a1085e5cc33de7726a0f521c149003df380abdae96bcda55c44bf9bfa1103150f049563e848a8750625dcfdd9bfe02e1e57489b5b3aa28beaa80f4daa562deabb4bb6a27125369415885020d237a92ccc3a23593fe2183225bfa2ff39b0bef9cb0425375e256bcd572175483f713bd38f937f2b3d4c1f686c5af60061e0b05cc3ebaab0ae8ba21e47a8318bee4a01516046363d152936a1344e17a65e08030522ec667233145a56001b8d065dc2fed0d2a9f02c981a8962f984916314805dab644a5112caa1564895121d8b1fd046f547be282cf979752883ec79af70cf59a88d960f3336f0ae61357877aaaa34699a876144b65ca5b77a684d850d09b3d42cdbfc4539ea103f8377cfe5f9e5432403fab416662c4c83226191eeb7f82b01e0819c081fc40e7b978669c7856067e8b582832dd0b92588103c2616ba2c7774c46840318ca2b1a3798ff7ed9fec087f01798ea2445b92e67e2446126a7406e82ff8d3711311be16e9171531a95c966e6befea34938e6f5fa660f7c7cb533a119377f1d26ae6ae51d805ab96a64c8b80d6ee137f634b384c2e377", + "signing_randomness": "fc6d0cf3c569484851b938f5ac018b833460575e28b2cb84f11b91ce8682e088", + "sha3_256_hash_of_signature": "3450fec7b0afbf765cc67dbd29bc4cb0094de186a2f73f99e54e03af3a7878e5" + }, + { + "key_generation_seed": "196b8144dfbfb47ec01e96a6b8443211d6c9c4aa7853a8131b5218349bd6d953", + "sha3_256_hash_of_verification_key": "a891583d0decf77b93557272740cf1dfe660767a5c95fbc6153ae6a82e2a1aeb", + "sha3_256_hash_of_signing_key": "5fe43ff0283966f2fd0daa64c66e84140755e95831fa9280c5e176f8947297c0", + "message": "ae3dde9e33719040345df8ea7e4c0b5e2cbc5cb80b34fddb959e2da1d67d74d2fbe5aab07c6357a9f3e5f6ef5379b4c75008e9077a1eb025f9023fe32fcd9076c8d2b291d0becf2dc624f9e752b1eea2cf0755fc9d4b2e4320dfd042c68577d58e61dad075bc1c3931aba78b473c0726ed495150d6a11a81dbbd1c840f5f1faacd54e3470e0d994deaca7e6e324a9fb4e581ab447a4ea026da3dc3c7e6ad55e88cb841e069eca63404cace0e3d4c8b9cec33bff6aa6341aa1eb69ad799c6cce358ca94555287d01b0192b1b49eb6f705e54fbc86465c4ba70134afc9a53c1c3a732e21b010002b49b7cc6f5237b794bc1d1f1e30a7f1eb95d195d5f26b46a704f77f80b092117ede1c340622ff32302dca7e7e43c2a4d8852cb508403b1aa8aca27a86936350264811550dfef05d72542c74d6243ab9d259202295a63f54c836cbf610e40eb85e9704041a51bf68578b10f7985c752dc35788e7b7754358082afec9e4b271d36974eb90a46f7d703b0cce941c3cd072a88f931a4ffd098634be0921d089e46637f88f9625b7df900a276b4bb75fc75921c8a8b6668df9946290e11fce4565a76d39d8fa55f324253ffbbf81536581621dee664a9e9e4f4fcd3a9765706b8ea833125a825b1cb30314b7c6c78b301638ead4311932fd4611d78572180ee441648f8bfab869874611c153feeff88a45f7a98206d0b2d97cb7ec2144f045225af5a9925ae7fd3db017e37259b7a2ff6c66820ddaac5651b2ec2e5767ddbbe18256b1d0d0f96cf5ee04266b8adb29b0ac5d55b73e1eca8fe724ee174b76ea1c0a54896e2bb565075f1669d3cca171657b66f343a634f4250287f853b52182b9be50df29021673db1841aca45e7263dce653f0dd84338e49ff5c6e3bb42f1a3c7164704a2a000149114d36bb9231606eda06c712a904c1e323c4aa3eee0bce6062a9cb956e004407014adb58eeabf486b38570955c30f2b5c28179f86cd5ffd603cd441a1fb06519368886bff9c2c127abd079346d762e51c311f196d5f825b45eddd4a48c7c2123e10a3d369d772750987edb96968c59441fb2f47f8e33fa4ced3006766c06bb6b339ed94b8fe57b20d96f1a27a61966289d8ff5072fd11d7ee53defe0014a11667d0a6c988bd16629fb53f269130b22a13aaba2e9f70dcc93d3bf6e611efb006ba585fb8e8720357e25df69c6df388fac792f87cce801fa49a8cbead1698c11b82c4f85fdb4d52a2a808483dca7334295bb3b2658aac18857878730831622124f5a254a464de459f3528c5194220e5bb1779c8f5e3866b0d60931a1a47502d99e2b186785658def57aba676626f9ccaaaf449609b07af7b57c78fa5bd06b2ad2927ab491ee461a94ac37a079d9bfa02203b09f7ef180c1c1c430518ff2d3f2a3582eaeb6668060a2b544e973e8a2b88733a902a0a80f8e4f30ac5d0223c1076482eb2ca5ae67039597514a4866061d5fbdd99694a060d0d0ee43a1b7290ffd7d796a9f1a2142db6e0f154aba8720396b6de939e668447c81cc828ff9d2a014fe001ca718c1d6acf4c08bc7796d344a29fd8913e4ce71e986c46bb66c2610fa797c9e1639df423c338d7192638f621d83a6802e72e38bee3aab064fb606962329997fe908597e7407cef098d4591e5e6011caca701994e4acf572f7c91057d3da06058a7dffd3248ee3333208bff27473e6f1ea3914c5b2056aecd7aee07f8dd26b3c2b8b9656ea4260d38e8d5f23c925a4476754240d0702c5859aec2329e1cc3e426bd7665b2a4ee2e75b41b561fce79690f64d1068dd35a294a8e8cb43a6aaa901109f0e09d985b6e323c30a017e75bf01d0aaa739102c1a6667ed48e60dd4499eab862851558dfd17229878f5bef0cc29fd19f59835579f3cdd4f85684e0d46d9618a205de3b29b0bfa5fbb36745b989211e2ba711527d32cbb5e35830df4549fea652377ebbac6d52787f9ebc3cb687ebb641bf51d3e22e98fca48f99584fb1f3bed3f97f33ebf656c5795055268f49985cea00819a07b8f4b0ecd7beda95eaf11e3498fa7aa414c54c38a08a841b012ae91763be911daef803e2ca385c9d4cdc642a0b343db6534c10d9e1755b7b2de543afe1d3c90981a7bd907e9cb14367243d9fdcaa8776aee5f65ed6dc02f633bcf9f57dae39e8e8261dc10029df7b7124beb67dd753b36892481ea7cc54ddc3a60ef8d4dcec4d5796dde0e7453bbf0fd93fcace97ce5048d75ed1f34b69a392e1734e262b2b2a1e246331a373b5cf1fee7bb46096c76349b0f19be63fe539dcd33a8450be894c2dc21beff0de6a841a533f4c9949289037d161bb97dce31cdff4c1e0ae36b4192594dec3b021e8f3d5b500c244cb122974f8cadf125de0cf832a920dec3a6f7150585d0209651b0faae0f74a36fc8779115b96136805ddd4f6f3a69c06af472f369f481359ff834a0fd2f9ae899ea36b9b061b63d07c1d4ed7a373acc40ead808564b05fb0c6e656a80fa3865aabe483848d14d1dfd66d7ab1f353642ee3417869da21622f6af551659d07e6c827c18ea36e2c5e806a9571a7b05bbc1ba283a8984bfabc555aacaeab2453573f782a4087f0f903af34596e83282a2e54773ac33543bd353a3f855bc46810930c3635a9b70ba7ffbeea95a129ccf9e9538eb11e119a072f806130d831af7e57d332ac889d7d9e6bbd1c65d64e089722f6954f126e64ea939d98084d434ee74b55c549bed21d11264f8b5e023277db52b03d7b8a8e75b12b11d62052e474e435707272d72d00d92288ceddcd1abf8e63a8a9963a48b54f492487b309f69cd90c9ff54b9c5a55cd2bad4a2e0a6b00b188fd6c527a8184bb63670bf626a995815810cc0f280131f5f652ec20609c7d3b910e4168fe273626bf0e2cbf05bc9ccd178ad91bc25cdf178b387dff0b6b40a46fdb6c975349b6cd8ad103cdc5dab8d09d9a5b55622e74564c1e789c5c185cac04fa0ed6065b9ccadb1d5dc80e90ab244ce1aac516b346adaebaf7a030d66fb90fd070ed062a41e0b70bee3b07f1c03887de5f79d70f9955b25b8c8201602784ef8a60147260d1bde8e152e8d3f992cb8255adace9d5dd2e9c856c47537742094190aa867459d20989db11841ae44824979c0a2093d7edcaa13c9de25e6eecbc5124055f17466467e123e39034502ba966cea873997ee25e52de2dbba874dc9ac222b49967b7bedb5c81be09827cab782f458795b2903d72ab16f4423964f82dc69c138eefa3273bc10376939e544964150d9df09e14be08cfca06c10bb2c315b1b676c40762f8209c0ef13cfe5fad76cfc17fe462d8330f78bab072c5465f7a26d047fec4bd3b918c9c761b91b02d820ed7ef345e79a66fba61ae13d3050a27488cbdbe693b800f1e76c188ebd8118c9432eb9e7124d35a1a038d237918f1db83304d10ab5dedf58c6951a92aab1a1a40e180254e730eb43b566a83cc71fb6b9749bfcd3a90b964966cae90fad7406a8a89b1e48c885bfe2db41c1996f20dc9a8dfcba1a6f2f307ef8fba5eeae9631c2d6328d90f17679dd9e8e9660d6bd4c8a1d79c47a5fd46bd2accaca2d5c6407b0f7f31d093ceef0342c67dde3f1ba5067ed1500dc45161b8636255924bf007c4c870990c5dce098c5a26386ad84d0f0ce4860349a147a4e7ab80151fa63882590b91c6ad3e70a68e6fec1a2cf65881a6dc38048fc14de71c702c934c5d3c4cf4c474f906c3400364bc400a7da087f94f1accb68439a9a6ffa8c6439b2cc5c0b17a7d649033798429f211d9de12b24d117583e1c425c2c0348c625cc44e9b976d319e72d4e09d5d6f36ee243f5fbcb190e84de56eb680dec8566f5a2c7d5f595116c628ca09401d561bd78356c634419225fb01cb637c46a627f6026d39ec1c62e9a3e85fae", + "signing_randomness": "1e6d32286c66aee9b6e0d5971669989bde85591faf4ebb36b343a4ec4f8eb765", + "sha3_256_hash_of_signature": "8b34c410f713adb3bad84e0bdd92e938e1be26b6e6645ac79c659c489f5fcbef" + }, + { + "key_generation_seed": "c171793029d0cbaf8d2661a823243ad50d67f2619533180f25b50c94b1310389", + "sha3_256_hash_of_verification_key": "ddc779d5dbb9a2d340964e3ef73324a73ba8ecf423616432bdb8b0264cdf1698", + "sha3_256_hash_of_signing_key": "d6233049a2a0f3f651161c24f5425476c8f03f7e2d31c1fcfa71c8a9f38c632c", + "message": "a7e941d3c14e2ddb4f971c9955868aca753a73e8ec6845ed6e9d3b444c826480f03ac771f92e94380bca7e50303fb79cba608e351a1a67bf217b9816e2af9f89be8a79f661470ca16bfb2c99efde97859ad1d217848289eaf543005f5c231599ff74299ec2a7c737ff94b7465de11f80e17d4fda264de568d8767ce822b3ab9642d95bc89533ce05fb331b86e3c5a296e4ea4c637ea458bced1f89355c0270d083d4920e72112ca1ed486191748b4f730ed52f9803d05a0f2f065be03b2603d6cdb154dd7765847d656b919b08969e41b23f9d376135bd5d924529410392aceb004849550e6cf2903181c9a395fd469b7de2c5060ed22922aa4d7c782a33330714a0af206b29b4fcbe0f12c18948f6634ffd7f2710138020e273cb0dfa735bdcde9bd6cec898c5e564ec71aa7880d97cc711412f28603de293cd5e904e9156d4f6bfe2be15347b9ff7848eb51cd0785d6a649ea3514e02695c7e3c4f021a9992d67bea1d68e5b17db2e0dc061ccb5ababa49d110055467f9dee61aba8f3e5c713e94a8a96c3a8afb698887c1fa4abc5157ced33a834dbf0f5af9eecbb5f2ad7b63b4c2ca94a117c2b92f3d51900926e26b101fbe6207ab0884cbfcb15f9f98f95b0d08e29390977f4d3dc710eea3ae7433d5ea87a5f710f1fceab26d516fc19fd272f6b0f01ee167f06e6c33273481f280ca64fda0549c8db884fdd467b93998360766d4cac4c8de783752fb6c6d7b1e47df23ceeca572f2ad3e2b628e31984b9054448ed1d90658bc658a9caec0485512ce084a535e7c8196b8bbca5d26c105c41e083f8d56f1530a8c1b36a7f3e41fccbac7f342b2d026064b304444192d4873fc57978e44151896ea6c0f13d017f683b203ba1de677ed00f2b737c4c69e53ecf16ab918939e120e9fe14b2243eff0116b24c6654be09c582f1e62e75efd8593e62e45ac36f717815b854b47a4ddcfc91fc533fa85bcecb6e560cf11e46d2f334b396d68b275e7404a70f2a805a64cd458a8e5f114a89124ba1866f917749ff32e59ee71948bd97f2d4128beab8bb0b6b06d84c6d466bfa30fd8100e48d951d0b3e787ef9611a56ffd64d970dbacfb1b4df064b1cb5da9918f5c58a10f0903b64286b1c1ae5cbd00eb8b363bdd7a7aaf2111c0c6e86e15abf6c1e761fbf027425968cdc19522b44ff3f56335c59760fae6d9028e76b284330f7510f2b55b6f46adf90311cc785d35c2bb49272be514cfbbd7a2b7b2e8c0b6dc28cb683d3d581f547f83bbd3b8c7b76925e44e6da89d5eef17ab0bf4213ef9c05b7b473901d483c647f416b98478c7100919c28515b617a27321841baa174c1a2d3494395294cebd48eea14bc3106ca9c69d9f6485d6abf1c2b1111a8bc602454685ca61ab4ee4db9f413caf8f0f204f04d40cd36fa5dab629cb53876db3e16372e626b6bc892c63c6b6c503c9d22efe113927395206bdaa4b83d4fef4feb42fa7a71f7ce2197fe282a02d0fe50f96b1f917a67e50eb79cd3ffef064542f7beb51ab05b56afd7aea5f4164cc9ba37d8fdb35a3deacf0cfb555161e7e41eb798160798be9d01e3de0c4288e0bab19ae398e94353adbe9a43524ace35830b82fcfd4b1dc2800ca4c38a56b7cd28bc3e2f69a0ac4655cd79b5789a2b72eaf93b018d4d6f4c983d08932b22c85af6fb07df0a786d98820e1b06bc17f62d6e39739790a13049252f1b9102dc692ceb20c270ffe9b902ab7ec5a4eaaf47f7e2d31b2195f5f48ad18d099c33384141da14e151ba57f6b1bb97901457202cdb83b5c713bd8a13f6e3e276c7d6c130ae287ca8931d9eece06ab7cca124d6d02d497d55ea9151a95e8a4dccda72d3f51a7db3f2879918753683b01ba1b154da83e6d84ddc9492f2dd8c128a30c75174ed1a6b8d93d08645270bde247782e882418ea158b2a2153b2d8f75c09932f324ec199d26e9f3c4c4cecd807367e3981e137858b98bd1268d2c894541ec99bbbad19a6856ea16a1e56b7b193baf79ab89d4e76327405658c4ecb5a8626302b3a4618aeac7e11a1199c4bb08c60ad78fea4827b59cc883b2ca7038d7845106de9174b2b8c17267273d23418af560265000543ed9886884912b4160fbd372fcdf706ef642cf1829493884b6cfe946ecf6140106dcbe11b3746e33fbd4b5852b732230b9047004f4fafa0d4bd7043c7d6595accd1b2771aaa76fe05a0c80b7b221dbef79950fc69147816cad0e52c05e72ceccf55fb4dabd81ecdb476417dbfdaf3b555cc90573cbed9474266c89fc55ff0bcc55602a51a1b5f91e425a1a58dcd4abd09bbc63933fb4279b9e21298f9fe0cf1a93c4a19695240e8978d604047abc7239f5053ea650d781307c50dec4d5e2360adeb9aa02c0f6fec5784784a271169ce456e1c32bf984c3323656ccc588c97e0ece5a40fc7b4ddbdddb764edc512de63270f07891bd160f78b8ecd3a4d11ec4c68ea0a0fbd0f23af9ab261a110f431f926c4995b05462e0dabf29d9660abbc660c9a675628270cea7ec5ae9b6f298b17b2392263700b8ead9c845ad29ccf109a2ed66ed5baf9c935754aaa1b84be2b5339f9bf3cf5e80af16967863fa8dca64f5fe873da4a6d33e39a592749b721fec203c0cac527ca96de7a96ce9a540f5da1902c97f960a05ebf0c32934f9b81244c945a60fd3f176dd8c261690d8ec98d19607129a50edd51135ffbaebc04a0961acc5a32fd058ffdf2c6866bf90a3e177787e7061bd2011ec08ec118ef0451cad010b53c68d0bddc701d10920d697ea3439b1a0f96e6256b7712f59c746d1c74c20b17d461c3df635eec83e3b8e098034f119b9d9a79ada735158eac3f434e805444d5ea2ec85cc8ed8f5bccab7dbb6ecfc2e385781579af1263d9fd32bee32e01db94703b5c756b894def19783b12bce2a1a8d29d96f329cb0791d697be7e0f05dd5c9dada52e1b8c1e5f75a0fc90ed8c05bdff86644b1ee61989caaa271061d4222818c894ae9eca2da7326e5c24ca1eeebe3720d2127ba997b0c572ae30615f8bc4278057f4762d46a39b934ddb2a0903fe1568c1bcc6c37e1f7c145eb7cb20a6a4b3466a7aba58b48be94f7e14cd20c87b2768358d06e3f607fe5e9dd1aaa8477975660f1e379b9ea26cc00cea8cfd6420f2fdc7ee6393aa17cef88645b821f8f42fc7dd97b0e16c04631f86ecf1cb76a6502fd1c13917ceb26a83596b117d5336387ddbea56162e8a5bf2fa35e697245bc7210cec13bfa694ae884582924168bf8ee2f61a734e37876f363225e5ae19b7c65ca6afc31c8b37bccb308a9c27f3e9902de365e288e6cc46e329e78be914b85eb980c0bad932c164671ed395d5d8317c133e2e000a10e0d20d0f408019b33d9a87ed7725ea4c5abad67e0cafbff31dd236e59defab7ff2cb40f479b56b261a32656f016deca5302a336ca15d10e0afcd168a4b922b79c11cb21881220374492d64df21453b41346a85174a0a4a3c1e973845c856ca70d6d25bb854d0c6bd3c75cd73998c7f64e35a58dcf593c85c2440a6aba4e470f87e6f9b4abe127b30f8992d8aad0be38f008d9d937582eb3aafc68f516d5aaf2503acc96e59a151d2d4b072ab6b38c54928d6656441c709f1c1b770ce6efcece11f8b3602eab63e0c629bbd8a79a96be4cdb072780f3d287b091fc94ff2c0d347fe280bbac308644bdb15a3c653863edd945af0ae725507507b82c283dc9909ccacbcf357d7a19703401b6e4474b94a6cbae575b942501a281b8166fdc70e6b4b60c2f57a4d66fe1197d301d0e0c7bec12cedf9496bca2183d04632711a79c8374b6de35c2eecb0239391c2019c720894bc7a635df18fceeb9aae16b3ce92717e2c56903d20d0712ef80131b8c48635163e97efb1fabd1500d061c93ad935be9a65a45a92e4a4e885268e712efbe5337214701baad4c73e81e73bff19af131f0aba105baabe849f", + "signing_randomness": "0b0f308ad57477b710ca5e549115be1d4ec0d6c3509bffa0e662f441f7248779", + "sha3_256_hash_of_signature": "f6a10db69aff6849be575f222fc984bfce1dc8267d0a8f3c267a13153be19c83" + }, + { + "key_generation_seed": "615fa91f3d206b908649399f216950ec7b2420eb04aec6abfcb7b4528e8e33e6", + "sha3_256_hash_of_verification_key": "0f3a7b8eabdc609aa40be3fdebd259810c00a81655db69fd3e20b02fcbb12033", + "sha3_256_hash_of_signing_key": "b9dac2181fb151771607038c8aa14ec361774640213d753e20661d0c983b523c", + "message": "e43eebe157e43d9f54130c668a153907d65bb19856a1b7c2fd5e2c770fd6bacb13baef951eb758485c128ece4f3e9377a58a45eba1c3a9ca5c94b50714088700d6fda933ece3a6989ee77a824a9e99674748a90b7f227b589250c9e156a8e50b74a7f49de036fced86ca0d4c02e217eefcaef7234f651ce4380b86389d7331c7657ac283f58c781f904405acbb68661310ec6921c1fb7483e74116378086d4a0c9a52af9847bb3ce0fe97f5a7c2cf588db3b6fd725ca83391656cb38fcb6d79531e56f5d42fc0cc20d04ad7bbf57001bf2f8e6b335cc57ca2db23c247ef9b75bbba3159030975d65b9aa7c10e0fa4f615f77126d5271129d8839a3f8da30c79174373c4ba643e4c4f0cb26bd5b8b9f7ea56de459eda15037d8772478fd9f7f7e06f3b422df0b425dbf1e91d3893ce20f78cdf1910c5d4674efadf122f41d6c7d6290df59fa029bd82e792e758ad4388f9d352e9d2fbe3e58810c380d1cc5768865d24bdd92145dbd1ee0d4724c769ef5cee12db2ae2708b4c8c7865e70ca31386388d991d46c4dc4dafc5ce66cb24d455bee01488a7c764a308c7054572fca0cc74a01a2b1f191c54146fb1aaf55b834f998b50909f3d003271e6504985dc836b5c44655b938769639799f2575bcfa92f13d32b283a5bda11177ce1f66d6b30788415bef598773e87b4c8c41f0ce6633b6c945a3b4c46b74f30945efd99cf3709fdafaeb4bd4c6bf605f89c7a9b4eea1a6599f0a32ce3f2c58587ea8bb3fe6495d92f2feec52bea3de2047f5eea7ea1453c762201ff1291afa87923107f7ff586e00d07824ee021649abd2d6e9ef11a1d31726ea9277134341ec57d790949590a963d25d6fadfa9ca21e43acb7e5ed4cb6e8bb36377c2618997943cd100a927d395376871acb9619bde9b1ffd5e48e271952613875fa3acd3e1f2e872f1d672aae6e2a575a4fdc4fae2dc6a7196e7eba94ae5b49be41e7295433adf49a6d2d945f43699d444a726423cd9164b9e28b0aa4485b0c767a9398df5dc5f23d27889c14b1abe98880e7bd5df9ab3d1321d5493a0a8b91ea4827627a9b59308cb0104cd8da7d9def2d47b27074ba007401415e900df03f251c8aa425f0fa59d74c41ba7a9288c8e280141caaf6c6932ddc4184f81f5c33f0fda005bf3fb6a0a9169a709875ae475302d57ce96d3db332188202597ff29d1f9ebad2b0ffa27c14ce9cca58c923283ba10e9fa1689d6c2b8804225d706e09ff97ae9cedc27d256e8736daa54382040648f2f6bfbecd6c3a9bfaf5d1ed23ead00eab351f1e0bb4c719ae6a1f5d12e7f09ecea62a2f554b18397fe1400da1eb6694635d7c9c626e0fc82cf8df6aa4ca88b69f78cd065c53f929baa58507fd3e3d8124c4bf287d452af47af9f4d926dfdb529a8abb8bb57c5c7611a97053a0cb0b01c754cb479c6cd3a3e867bac33e45ea0bb6bf77e0b2ec2f136dac0e259fa309fb5f6d8e7005e1696ce203c5d054e5927a87a1b4e81e73f22fafe61d7d64cbfbe519d39e716bdcbb37657e71b9390ff04b3c01c6f6842684115cd7f5aac208eea48906890248e58d1615634cc1263cd3adc14b67f1a1a8ed2626e7237af5488f5d269973f11458e3e4fc2ee35a4bf49c2f5f2361939fa243fa8f33b54eeeba9b0453701e367a7bf4d698c62da64732652c68c20a956522826f8e29a764ba93dbc98fcc87e59a1423886694057e131333c5dcdff3be7a1f0d344a2debb90051721e0226178deed353a136f69481f83651be3281c562d6127914cd24c38ffb327786086b08ebe89d03a33bf7b5dccf90de9c4d907d308e08a616c5343c116a098786383009dc70787aafb4529cd27cf85f946b8b238ad2f00df109fc84cdb48bb52b73e1de066636176e8c6c76216105486c553511df1f0664ec1e04ee0b0bd74a08070207486b7f326c3ee73188ab5bb7f8f5643093916491d62f0db18675ba4ce90b2ab310bba4705b65a581fbc5e76842a99d4926ae5bf7b8eabce5fa30cb98c1bcf0e0708da970096234d47bfe23a4f9ade29be5a8b6bbb748ea1c13d00388ac90b65ee10be6a9ac422ebddaf5482422aece19e702f6d26ed954d4e489cc48b2e39a6f168e98e11c1dfcb4a843354f1afd447962e5090ccf51ddf6643ce0afafcf3e4363187e69c31ab796132eeb04f2d4976a576b9bc8d9b1d491b74613c1af32e3d2def408abebcc27e4a915c983e10b6090fb2de6ff9e60c96cf4f940b09aec048e7a174711798fd76db15dcae0e570be3ac147e2f8777a522555b0898bcd7b04abbf060fa72b04604c9a583fefd02b2af9fa035f97de4daa4ee777f9d6985149db6c2f0a33ee1a1436b38dfdff87f831e83399c6a884273e612433ee3958f37c99a748df151e3ea011f4df5f0050597685e0230da1b1c7095e1203ea7099ba5c43e58ab0eda60af65291c3cc9a07257d71ca6c9eab93cef41294853a67a5b11f9192c96a36c701f142dc36b046218bebad9904fb765550598f8e2f49f5f0ad2608117196751e7e4c5cc4c3ef425a921c1ee15f37a1f80df1e24163ca145edb0fc4d988b8c7167acf9cd94f919ac96e5469859fdaec54e1970007eb9699342a9aa044a8ee478a3ecf8b59b0109ea7640c218ecc1e8cbc5e2fb61a1748b7c038efdadc2d096bc29d95b1be770d097afd8b0fe02173a1b3d7110f80d6c849f1afd1b01a60894b16140f9b34d96071a753545159c4ffa4dbaa938bdec287c6b83751c5e699724ab355d1fa0e081db286ec83343877c520e856c4adc65322aeb39cd87b7d8e4ff9222e085ed84c58b7ff513ad77f8a9eff2760a03f69ae5dd14dd92dd3f2d3d98e97b1987086b3eef2f2e822c851b7add83903786c050f30c4a4f4ba9361e49acad503e2a07ea119752e12d4fa09dc83f7a48ee3dcc1f09475960b6839ca736e498a128f78e58279063d839aba88ac9e5bc24bc07bbd2de1cf2e1ccc5987e63f83780d0ecf07eae21c8c752529735b37c980eb320dc949468c69b17da8ad612825a84d0529eb97ff8c4cd225fdfd1563bb6c5360abdcb3339434a298ddcf5f36188f3ab501e505828e8d2fd6dda062ad415c56414fd7557170f0f57bc5a401fa648699f3c7f7fd8f1f058849b817fadddc24726df851d3644414f55cade30a5764914675d574ead4d4db8725866a6c51bf0eb23b12fba1e101a6f3bdb98a2884d0f2b8deb3f279e9c38ebd0209dd05c0fcc6ea715257355d0d6be2c8bc7835187cdaea43a8ef9c59e88af6aa667a697a3df8bde250eaf4341a835b5ef93cff97656133b49e13213949a3f368d985e0d6c793319f4284dfada383137dc5b000b7fdd85f27865dc633562949bbe4fbff75417ab109f03015bd0f67728969435efae791ac72c6aef99a385a3e8b4c35f58380149c653fd78391a7c3b26a3550d37f9639164979288beee99e36ac6f44d0fcbaf0d210839d563a6249059a30ce6f047f5d541fc8a90a18610a8befb9493c5ac804d34d40881ca82e673788870705bcd585044b11f1d9bbd6b17d8b82b7ccc0554d1e3aa7f2762fe01385571c9fa7a103d07c1a209504876189de4b3c5910c26c5f33ea725a7d57cc30a6ec8f3eecf2409f1234a094556c0f7941cfb30fe86f208feb73c8e8ea8623640afbdb1cc589768a714cf945731debf4519b70870fb3a50f1fb368ada3fb217704a5d46d879ceff9bb72667acc673cb196afaa0db1160cc2cd7b260deb791a94d0988ed54b7e45f33e7cdba0fa105f3af3cb1521ea382b1266df304c900bf53e195ced03871a22c50da166bb9441cec83607083195d6cfa17297b678abb5e03950160130b47e25713b0829f64d2552efcf404f65798a86d5899b72150a91ba00f7dfbffe82531497b60c31c28992377a2dfd5fac8a9c16c835ce4dc24d0389277e6355c655c8a33c89bd48f55c13ede24b9bb348dec89612f0905719743c95c0e8b5653855676ce171f812eca405b6f96f2212d1a5369a11379282ac0c5ac41d", + "signing_randomness": "8dd2a9abbd92d21f6962622708f696df6957961c0e80046a9c77a7cf9e3e364f", + "sha3_256_hash_of_signature": "460a41834ead012c77dd856bae863dd4b3fdd0c56952fdb20a7601913c6a69f0" + }, + { + "key_generation_seed": "626c19b8553b2d9e5a47a758615d80b15be11fd016d3a1962d8de58ed5ca2219", + "sha3_256_hash_of_verification_key": "695ddc646098acd4ea90c3b6355d3f9d03c80ebbb49339c245b8ec130e4436f3", + "sha3_256_hash_of_signing_key": "e1799bdfc0bdbfe5e0b71c8f6d7e733955468a73122b74cb94f0e013b845b363", + "message": "c07185e0343df2a4201649ad5de4cffa20baf5dd43f5e4a6c81cd5143fe72865a7c036a2dfd617d96626995c12efad019ff44e0edd7028f29e3657ee3c0d02e9ce83ef0a648fd7cf183a7bf7c15095e0f9278b14fdf6c983cdcf2987dd0cc085400906dcd0d14aba60124f4b7494adbbae3a8d6052122575f99792f7240eb17864dc6d231721140e43f1110e73eb2e3c05049783b33aac4e4ca0a248775baf81fdb03d114508928bec3169a810296b5a4dac27e7c7f8d01cf5943cf4d8cf6ee6f9042bb300e50eea3224d35c9628e38c368ec3b42393fc820371db6557216a2c2d5a230fe3a7c6bcbdd89a2be5cdbe7f783ba379b6a4237db051e6256dce14dcf641190a956e8e85eb2638736b899ed045636ddb7a351f5a4f4108d9d6e0413f92b9d392495299128a5f4acce8c7747c675efe05ed7182db51c515b345029440ab61a904d2a390122680c951ed4575515144c5ca80d6f14d1cfdbb5373b78e09d04d0544151cfa1240790cd31165048d1484dc4d11d05057071db3433df071b367e00fd38c386dab689e4dff6fb421b2a95ff54dc29375c9d1c18a76c79acae3d3f35d4cfc385199a4ccaf6c9f0421bcf58d296ec7e0d1b95a6c4bcbac1271f94e438360a71a6440275591e41389b30caf2626a865b9e59552cb198a1d4453eba6d0f6fc491a8a7783b4a8baeb81e54f9189ce493efc1c5d830a4f637f2bf43cd86b91637611415c95685fe79966174312fdfbf33a646625f97521b5cb1f008135b824f1d6d8373006c7158e62b1f794ae34548a0c6dac8b60c559d81580ac0d84034a501516ee36cb4082732918365a5ab787face591ab02be6957ae4bb96b58e2b173da019d3e0cabebeba0af775779f14bfba8f595697731522df3c80cbdec16f6acc32659cf5daf193178307887ef1be1b48b5806d0fa9868a7fb853708b26873857786b974709c687d6597bcf6c7e476c1e47cafdbf30b6311ed434c0f998c4065399c59073c1f2bab1d46104e74ea6c976d416e58bdfd24ccd957cb431870de5da8763992ef68bb18075926b0e4e826095eb3b8cae086fb1759c94b873a1f4df477e0ee9eed8dfd7c77508b3f0c67f69be04355aba9344960639f6dd6b3a956dcd66370338617a365579c5993986b4f748cb7c990344b209785e22a40fdcf8f83061d37c9f1351b4473d6c74abe6b3eb2a7d62ca0f0c88a0aa8a46973f781df0126e8d55d3e9c41c2e3884f84fb0a06c484cfa0c9a0dfb8cfd573749c711c7c236b0f2f144e1ba4db2525c093deed29434fe43cb3040c5a374cfef33214fdd2d660398e91bf070a4f5f9746c2f08c41256fd5e955891146ffd38b155987e6a0fc47ac2a5950509b9e2c86b9dd9929378f43ef3935f1562672498c5640a22315be15b001d4b01418df8eb41dfe5c570e850582d8916c2e7fc2b728048e24bb9d1e8283615e039c16a2fc61011631bbd8f2beb24adf9552cf5797ce05d9d1a7e7f3f5455017b127d9bacd32bad0cdbd3991bbcaea5fc988ee7aec0b1003732f25489edb0a1f9897247cbc40e60f1dd276259ce19deccb90067f7293a68b683fb5232acd2217b8929859109d6852a43892098630a67d72b1cf4bd5d58e20c5c18b85d69df74ee8cc69baac7da48eb71a160f03b68c6be87a4919736f14363f004ea3f41dd37fd8e621bf433bca71e17565e060f3c0f889515d0a8c17fe0d6d734ff756256b0a62058b95422257780de000557df289f47910cc272a14bec737c0715f204c49f03150082dc904a5d170f7383f04f1e355f50f80d5461cba53490bb2e9484806d369d61fd00ed1ee5be518d04a24503b1c4c08c7ca084902a3942c04143807203287a985eb3fcae3c5309410cd9b9a548f54ded44321ce8c2a04679841daef7fbb6aa11091d240afbb467d9969c31c1cbf6b24f8cbfa20cb4cfa404b1310400271664763e9c1cd1b6fe5ff2a0fae22ab14efc016ccbb19c5dd5d047750db4addea3e7a193128a5f4d7bb6358f21b39a44259695904de3440bb28cf9466b562065c387189eac2f7522c9385dc2a607f6f9335ff8add47c7ba932659aff69b1f26ec8655bee4f97fbc846e48111cbe25524873d1db2f2282d0472a2aaa3cf491c26ddc5e1be77866a3b692e417e6717a4f4454c56f97f063b9e598865b6f71136d65ddb0f3cdec57decd5a57366ba96e4315a88b4ea3479321468ffff508d23b0701a62ce0cbc0fa37c91cff5c5a0433fd61ae11a922575f5baa714de46a58d6efc79bdb10c9af7e9950a61d44b3e17e3b5298501146485b562b1570ff5798b47641d67091cdf90902b2d762e3efe94c540de4a28269cc416edbddd4d43ac2fa82d638dd9bf11f3bf22fd81cc4bd4759d7d864eea0e8e8ab71796254b278cf9b650d1fef38b8437362b2d69ed84c54498331c6899e20c596fee7cad9ed8d83d86774afa6e56a4ed34b0b0842b21ccb67035406dedff0cecb0cd089929ed5ffa0ce210822444808bad99af603082bfe5c98ee4653349f8a43db64cf90190c96b0446cc9cd23e0d75b47f54a731e8bcb0a4c67401dee87876011033d2a526067fb73786fbc1ce696130fce5d5379cdac6788875d27c04783b1e2ef41063d57e3d6560d1ff48882c39131c95bae5a9c9392dab6cd17eefbcf61c464a4dbc08447443cbbf3fa80481f3bc1a5806042c07f7a7ad435875ddb1001565eb6b7b872cc6c853f771c1dd5d9c16bc27aceb3c7690125c1907c7ce904852108cafe76351269a3d3ea8812fae4fae35f0daec8e8b186f760005524998bb5de475e4df85209da915bdc972218ae7db7e2efa05a7d752ae61cf2f3dc26ca2d282c8e32b4838524be460971e077348290fa0043fb7616d821a71dda3a5fb76bfce0dc84aaea432df32b05133a26b46165297ebc45024777a868b8b1b0dd6f97658be799bd366cfdf99861e916f7cf06c034e4f79594f1bb6ecd9b7347911488928e1e473c4b8c73297f7ed845b9ec59020373eda57a436c1c9d1459c6114bb6258543d8f4f97b10aaef5a2e082ea173ee69702d83711fee6aee8f6b260d03ab74c3b5d8fddb81b208e16458511270dd1da295f25cde7e44a8349b60bf0c59d4b425c1fba60d2bcba47b906d2830d8d5c091dba756e61620d78b2dff28407fdc9da9113cbe82219bb2cc05e11c70d040bde821aa17b3e981558961ca571e5d5041f7de047a1727d9c904deebe561dc6dbd8876bc77c27322f512d6171bc03871eb0fdece70f119bacb41d1852220cff26110eb0eb78e39aa1b2a4c2e78679f53683520c5a57fea71a8e96e0aed33118dc4bdd035fd88f535b011d9c7deb6f406a072ae6c091016ed10a5a4ee9827882ee27c535262d1d745aa5231736f2deec8a6017bf0da36b416c98ab71c6824a6eeff3564665007c9e850fd02a1f5e201b534627b92d21a493df293db9f24de70c7b49a6e07acf2db6c90b448681666dcda318c08aad08d3e257af7e774c75debe3b3c07af683735e87f205b0fde07351849c5afd07d5722c6aa17b6ac2cc3551c305e6ac31e3601a236961f6618cd3a0f7dcf6f65b8ec82e27e44c8518cdc16ecf79374f796a3daabe2d5005b25576b35b021497c5a8f9b98da68d80e56a1cc1044c04dfb11d36cb147eabfdaafba0a93fced8675d7d6a9f999785c0e7346f4c68eb17c0a2409e2f5bd4ac5551ff66a9857c66f642f2a385131377b6372884c417e01bfbbe1ca748ac8969bf2c0bd8944767746d1d57d862795e8ecf9e8a5ca122d0259ffba822588c5eccd14cc6ff4b7354cb572f5bd695ed9d85de131fdd97dd5d6ce7844ddf9f3d112028b5125ae7a77a4aeb2ebb554682a26f457c43fe96d67c90be7e49ff443478e82d3a48680d737d1260b8210bbe962efae6505e496b1b6d4f1042a7b971605e2dc50be3bdfecc3010b9f5618d3a1b2c1f48888b859e4d6b63ca9d29990b6d502fc22b738b203a83d597b48d73c41860e4e99c57181f5b02f108ca193451025f3b368cf2741244f42b27cb9e57260d2e127ca166b32e0b9c927b247b31619b1d4", + "signing_randomness": "78becf9804af979bd36022bcdb8e2b5d5a5096a3f0a3fdd0e82b0d636cddd1f3", + "sha3_256_hash_of_signature": "45277f86d70f2478c4788c65f4a5abb1fcb2189e2b511d31f6ed06b2c4b70eff" + }, + { + "key_generation_seed": "b0d4ba39adb4e8712b3a3e6495aba2f04a29e45c68671a960bc0d8d89900c97e", + "sha3_256_hash_of_verification_key": "8fdd525a8a29c743a554d10ec88ae1824edf40cf7c72f5087ff711a34c35f77d", + "sha3_256_hash_of_signing_key": "00a390b30af49935259ae1aed7cbfd5bb0f482f29e78b18c6a4a36ed1a120df8", + "message": "836254422c7d13f1120012fb9cc7cdaa1d8b72f6fa3943aa7de75263d3df814bbf2e80c3a204bc0f9ae33e4fa82ce893d35c57e41c7147602be12455b00b7949a3195264a3281cecc3fde34802b28c6e1f2b505ab6087d453bd6aa067b2370124840bcac4605ee4f14edfc4b4ff19a4d7a828e60156b49b4027ac18dccd20294f89ccf03d0cf47bb2f22d3749eee69ee17ab5d8e4dfccf36824d23e3f95e959d0494ffbc712ce3975e3a661b3f9e149a0234f691c2d820000de97cc016c43efe958da469f740610fd22b64d4bd2e30075e22bcfd4ab41d952d2394fc629f016ee1cd61aab4581f62a7b8648f8f8cf02462c81023cbe2755c91195a5917fe5a8b5058ecb8daff91dd3f73fe38665666dbf79cf6f203faf94a5ca3f3affaa2c2bd5f5dbc011daf46fd7ceb74b5875e4b5d80b6edb9817106b91865267e78731662218c8ede73e588256fb1ad57232aa5533d25bfc54452612f0c2aecae6de19355e1d508b888d18ff9f6d7d68199755cf5c210172f65342269ed96c77d80af8a244b43a99deb49b97a6f358aadfcff6aff72ab39540d375165185f31e0f1a6f97722ee365620bc5d642f8cdc59f7e84fd8615f4a336ed340be6ed8451997d87b7904c1b9a3a0bd1f8a01afd6a2d9f5b995e3fd0d44df8fbc8389b6cbb5537816c91f0efc3d2349f15eee747b254c5bbf9418bb979294423dd6de4d13484408362582a86d082350cc79ebcdcc05b70110a038736034ce4f3dc1d17e5d11c9c7620d40730b61437906933193d1272f7c89c701d495ed682f1335b7e1c42c994e090a67d932a8e825f4b9eda8f2a94b9a1f11f10e91396908a9d436dd01bae1d1de2c6acf458c0880e3f81adc2240a99e6083c9c188982713db243028ab07df407218ca6b3c4c93989ac96d92375834b915b724f2a105d6240e52b9d7003c67ff76f7a325d84abbc229266bb40d1dc8784ce1a4a6bd17972cdb26c274b06337d525f61b5bf952d23fa13757460b7b8a3b99eb023831f4fbef72d62931348622041ffd12634947579bc6e16bd1eaa8e8b2dfd54d74efced79ef4ff31ad42036debd0fda3b7f3f8e7a3f45955f82936a67122cd42e38af646cf565e294f422fac1e7d274185896f58e9d0fa1fcd3f4d379ecf5b566586246216556939bdf86d6a417c3bf77c64f95d7de8197ee25b44eef00209d33159710df001372c3e3d09f24b9b08b8938c522690674a7588933e1ca37d2c14df50777806ef6fd2285771a44f6de90475c6cc314df140c3962dd9d70c54e58cc5fa3302d69c80c6511d9d42a51b7cb7fd7fea8d8bd65a66fdb2ac80d945fb7ec72e138f5566ceb570968d84b60068df20c6cda2ad48372dc97424793fea8d2136923070c25f47c3d10839d1747b613b93530968d5e97a3fc0f563bffcde7b42c839efe66c3a8655d0ceb5af7a37d23dbbb52d05cf6fcbffa7c7491703349819ad94ce218912557d6c87937b2e7b0473856ec78713c29a02cf7b2b38e0dfe16804af6c2ba8607026892138011e06b4af179d63dbd97cb917b6507b798e58d74f485d3f063c044211e428fbffd5af2d7941900299602d3b15d5d600b435d9a21948b8d87a35205a3af9aa9ba491d56573a93c35af6683655e04a7a17f1b9709ed83e70d82a3df59a2fb7c051abe508601f322ffec089c49dc666ba04366c038ad59d397022f0f6344255f4d98bbb17120441cc75107005a74db35459c63770547a4afe59f2703894deb67612448ba7c4f6feadc1717f6ace410c6be62ac319cd33af285d17d55f500e364a0abe71d357ae0802af464b6d2732f3fb94bdb3baa497f2e44727bdcca5a4b65ae9df189ff1ac640940ff4d479a8072d34ecc523dc8fc7c87fc89a540485ae7bb3f29b041446ca427c0b48ca7515a1e31788e8b53e1122d372b6557f8d2a97cde893b20e60283954e2934af340a358a4376dd0cfcbfe305a2ce7b72dcfe2de105cf44833f548d1bce88d34b60bd29b69309dd87f4b91de10ebdd7d7f87d6231307d0ac784e0496db725ab97656c34e60b34b230f37e30fe326296c4e1bb88c0bac261df0e5f45e6e126103eed6b1ca146d58140a8893d847e92d9f3a0a883e8bf830147cedbdc7dd42c1a58a826a8a827f9ab26eccf64f68e9ca6b68261260b659b47e0dedbf5b077982b24ed9b36e8466dcb21ee69b5e2bccc49a163b4860ec2ccbd65032776dae601e18ecdab8e35c2760d5758592f6cc074298a97fc5e82e7da84036fd10e0725a0e4e58cc4db30499abec0c7d95d88bac2c58eb093312779bc1b8619ff2762fd1ff009273456d829394664c31ff6d7848b27174b36e59fb65d6bef6d974d5038a28f49ad465b28857cc12baaffabf3652c2e22b46b040e579fb040a0fb4b1daf0c157d35407c0b78e305ceeb232e7b7426c95639b1cf7b079e80521faa538e51e69255576650c3a16e143d0f815d2cc89eb00aa13af20394aa23cc6aa99a9f297d886ab9af2655d53816e066a02cf21c277daddef3d7d0825d094fd8fbd5386139757efd0b7f8501829725a4b70ff1dabf2958e07ed21db76266a88483ee7c51a7d215e1b41d2464911abbb1dc71f9613ed5446e4b0c97bdd47f22b372fb7662956fdcf3b108e0107f74301a054fb004925b041af354c04c20fd370ce1a014ebebd8311f3265a2f78b48124521a4aae240d3ba9f94fd33ca4a92d24a029e0754831869b58f670435a44dcdd7bf75ed9ff06dba52980dce49c1c26ba0965de3623f459e36127ac6afad4d5598fc45a95173d039cbbe2cdc7dab2865fb6bc0fa8dfd33c4a826cfc77bb7f45cb5aa73377a27271ae41630dd3d4e2722581537fcfb233e5af8f04ca824012b5c429ea498f4ad44afc249de2229fd7266fe84173a5ce44632b3650d6e1f278625d564b374c10c1afa3f17432cbe4b65327c6b6e0cd2f99b68ab043c5c6c99d7fe7fcf940f4887d309d7bc0ffaa5dc4b90c79266514f46ca2d5477f2b84b04e30dcafd0224170fa6d4ba9ad2a6dfa8ed73dff9d5d40d43f02610032719a7c5646ccd453cef409b4325f3fb6d9b9201fb115e4dfaa0b4d29959a44518774e94b2d4d6d06c7f065973becd203f5cf6cb59f869340ec6baf0121049db3e1146234cee4657c1b821af817da27bd4c9b1103c81f5b5161e6a9329d83d6e4dae1f3299858cd201222d34a85e2991bdcf32e9771f3e701897f647d62729c9805cbf118c9fa727b056a7271a23181b92f033de1ef113a856a884ad527b8deb92085af3db509fdb0265fba3376b31bf753dfa477dd5e247d939109f31cd430a692bcec4d9fc7c5b4630cab90c64b75496bc7ca54d5621fe3315ad03ebf1afd6d436bd2dbcbe707b35f916cfc147bbb5b8ad2e80abd692834e42e0724c8b901f5924212c4129f7451b9dd860a85855d1ac59f0b6b87a66b6a395dd81990aa3debf64c91cea6862b5793bafff81677fa2928e950d94a6333b0e77a15ae461e710be70afcb9fe6e0c21c5ad188e439a6e5138a2c5ad17126e759d48491e3f3f93f81eeb77b7b3a6add96917cf0beea202eea5adb3d5593a3dc9ff1f8f05dbf5a2707edbb6640eff5b65a0003cced2eb480942a13c1f1ccdf9994f1d11dbef0d3ba7c3801aa508c17bcf287a928b635f475195d88adf9f4c1ca7d3d1462dfd0f6939b89e5ed95f177bbb12253391876492bc01aff1c1daaf0a1c7821c2a4e33f52badf51987e010b391fc984328e020206ee98e9c8e6763120055f99725e48356fd800e11ce973d00c800c353a5df8b028e1e42f817c7433084c440e47532fc639172533df35f0ff43257841c3e4ec7dd7f601eaa81e9886fa3253844c195a62f89fa5d292536be8cacd80c94bbcd1a83c985936353c9233e512431a8863d7d8340e89307547bd10b16bf2c7e0bb01ab8093c70e4f4c8fd30608fa14ff072d81048391c07ddd82475a280d4edf81f739ad1a13bc6483c3c37bf52ed52ce8d568aa81864acabe225bc6467c79fbf43781f29b0c508e6825d4e56d25e45a8c0c6298765069fdcc66b2c5492fddfff69d6f5975fcd81041f30ffd7813ba3219b3139583eb588ddc57851e581fbd5e20127ebd", + "signing_randomness": "dbeaa87ff265e2594594bce653125b5235dbdabba4586bab30c34b5a3283aa26", + "sha3_256_hash_of_signature": "1d19e31d75e875f31b4de351c8261b9794f5ed5bdee643bf7eacbab60ad17780" + }, + { + "key_generation_seed": "e04328a783c10dacd96702d2e726bb11ce4ecc571564ce7cb10722d1c98c2842", + "sha3_256_hash_of_verification_key": "6412a141f083a3a9448b2c2f1091ab0ce1aaef4d24f1a9a92e3ea4c95900aed0", + "sha3_256_hash_of_signing_key": "03ddca346e330bf3e1615df1b906ebc9ec635554ba7723d1f14523f77b24ecf9", + "message": "bd2b4058218a15c008a4bbba29592079583f684fead3e6b3f09abff0dbca23670ae4496077d47945e5f1ac3cd4add5763581285d80dfb43bba9c0730858293ff6a15915ab203fbe65c118b87ea37dfa1e06cbc0f24eba3f43a8be17ff1daf4277cda2cae8aa924e852c9d60524b98306927746c4eb26dc9475e8a0d0f920f33e1aff9d07ea5561e70865b2d8161b86fdd7638e7a72345dd72ee95bae1ebd2c24d2a5510abe3fc2ced397a067d215f6088d63fa63f2247427917e5c4fba14f0a22a04fd0ac1d948507751f3523be2b0a0cf2f96dc61f8187adf646d6914667759d49a6df9a327830effc9470cec6c82ea127a8b0c6510203879faac4323145931e146d962846bb1a6e84cb2c31bc686e388c853413ea7d3ebf7c752c6aec774637ee01f2817a5af133928af35f23fc3541fe7fa749a863a048efed2f8cc2ba86520b97fde0324c68d1ddde1e430c30ded0b25664ea676aac6b1f22925a40b319caa37dd5dedb99de4d963630a6fb0e8b00ad8f2a2b9bcc497a00099a70a9dc190a2ab2a058930e63fd6df342a625e9a095ee79137caeb8885117c7a9fb8df7a35d5a300d6f7eee40578a7507edc38a0d6522474e672f156fede7e1690c3bbdff40342f1f3ad3c34325bcdbff0a68249858c777551683a9f3af225163c9323a4ad5e666e0a9f44c6496269038aac5dc2767966c1560c5a09207406f3c47157d2fe5909346d8acbfddf3e3d19fe48b7c60e1c8cfb2eaab19e736b2595d33a0aa034726cb6146a01ebf5cc72eb1182b9a4bcef90a1aaf74079862cd775f8f773bcc490f6015b4d5469ee0bd95c1a32a1fbf283fce1fbf6f8cdcfc1884f4d2a899f3e7a95414de419d56462f502ee703cdba007c3bb78f20243c35b882c90cb7de3cae3f0468079c546645977347bc183fb0a6cd24481391cbdf9372e2d6765b6caf8eb0145bb269a47a1b4e2cdf9901d6aa284d919ba57163ab9929e715341bacd81f35bdbff36d59a1edabff3cad2c122386a6335348a3170337b94e4336b2b74e791981656cb5234a6f84db4142d3f323000fa98be61527f7548dab6e83928e9dd2e461f08a5bb52f241bb42254e5746fcce0f3620abc69a6e275b5e06a333360f9b809562ed116aa6cc2334694aaa4169310ed6af695678de22d3e551daf61c0a6c5f6c0f36fd3469a3b977f6d295e75abb804a43e1e7ac4708208a94e8368dca40856f1d43c9865d98f69f1c0ba9c8b33ac9ccd18d400d2559b1cdd82a0c875b5e136b97c02126c81a81eb5d1e421221564100450531dbd97bda77c1b0186527ecf526ce6bcd0add5668382d984af9277a21d40c06eb4bbbb0ccd6f64e90272fd632d47a388d301377ee745fbc9cb4c02e1f096ddf303bca4e1fb4b6df867676080cdfa6a29cedd15003ee636db8c74e7e293a087b1a5f62334585369d12d9876ed0f334c6711146643fd598f0d69bb3475d219d1f89066644897a9cc5630bc84c0cb5844087216038c8fb6750d0968d3d3e2d29d93639486c76dc045900ae1a13529e74beceb3338684402bbc3eb36870e0b37584e9f309bfb0dd9b966f0be1298dfe55d1a94a6767cae5eb3120133b7d7b71c9f2a538a97f8548fb176b0e8923b14af28ae26306214f1d392ae63c3736b9f9374ca10ebe93370c11bebeb45d066477f374866c8a7208ce6dcec404194bb1f833de0aa4700ca29681fa0f72d98679dc3e1e142852347b01daa08e5cbbfd242f7223600804e066fb5c98c8358370f5d390898fa44023a30f824f1c6a95b8e23308b4be474d03e34cf72be65f90d698dfe0d2828a797bbf8397ec87ab9ee00c76a1c7b3ced0100d3a1030136cab9a69f05cbe58a4a56a9c700bc591b87783de59369f2e62d5b885da09f25835a6dc06f954c19b347724244fda69e3356a4ef60f6a41cff3bb7cb22ecb128415cd1b89a9aec12b66f1ec23b14e7d7fd601ef7b000a0c96f386216f75710eb2c12817daba1d1295e7535331cb90a9b0d8f7542e73de2d93fe554063f57274df27bfb39bc4b78b72a88473408086d8df531e53b5be018e076032d1f8ef86d7afb8e8867b9d7728a25acfb6856d83592cada4494977678a9f4d134f49a8598a8e0f23d3b7a09b5308243410ca6f47e0bf8c43871600817460bdeb74e7d32c2ff7c40ea4bf924e795516ff7c7bc8e5fd5d64cc489f1894c6bcf0e9c312b1ee7e2bc68739372e7402e6aa2ecdca39c18d7441f0ff373946559c475e37d4ada64b98283e5a64be7bc2d1a1c148d2cdb4eda35f591d3a7e7ce15162f50ff1b025f87cbb82289fbe7f9c32db8f23012cccb87aca7d758d42019b9a8c15f508cac9284928f46f0dc1c1b6c6b4da030db9286ff8d3762ea4a83d096ae04f98e9416d3dac59e04f9e4e4359ad76926bbd9570a3d5811f69a1c4345b646bd946d0168ed62a7a431d920d707d8cc7e840bb9cf13d8abae8196d9177e8c28ce0dd9ef647eaaf0d3c97e52cb31b560ea7067b45aefb5ec2b7c7bdfa3996d1c7e467636bfa1bbe11d1ccf86b64ade9faf9287a23502e9ff711ca97d6cc09de814a67ba6123a8e4e67cf6e8cb6f7b36621bc6192ecee94d61860703ac8411b16e19644a6ab01813402629af52301c9d76a94cee22b1dca49f13b130028991c8ab383c8461433383da92ab34f1ebb4124b24c6c391ea44ee6e736bbc7a2d4660a878a600ae39b7dccaa51adbe90bd705ea51ad13c05e611749d43de336d396352cb0673abce7473decb0fc708ef28dcbe18c85ee0068fef64685acc3a7d0da9a21dd0afb10b95d81f6ae437022218b6094ce35d01248ea85a9ec6fb56a7a2a8453eb03e6ccbea0f2eadb015d8be3d09739eac07ad9e3f17d13e5f71cadfa220ecae90ea50bea87b19ca6fc5df31874d51723becc80c8845c9ea718454d2817ef8afd99b63090cba6c8089afa78770222fadee3b3b829cf36a8153efaf2cf28dc4651ff37a8921e402ef81a0f457fc1802ab06a759bf4071f082bfdc100ab612a4584b5ae19354854101ab0173d7d6a5a0637ccb58ae58978a8befd5a2c51d3d53150c336c0c0c2a27b442e2bce120c4ccf8d97ea4584434a6f48c0245b63b2255bc52adad4eda9279412d70be457f7dcac492fe53c06edeed766b46ebc3419e6da2a2847251f75c62a5fe7ae74f0dd5af50a447da6356dcc828c5f1a2c0c873e57041eb1158296c038b91f2e13d3d4b2887b284384a9ecb8bb378bb311f4abb19e1b90eb3a399c03bfb4ccb29aad80c55c1636559fc79a6c894b5bad8d529bf680631541a45eb0e57ba5b458a05f456c60fbb593dae90ae549416af96642a486f10843482afc3989bbd1e8e4ddf0791204f4b720abd2d8995c87c8a388ecb14860cf83b7a4406fb6c8c9393475082d24e516c5f1af91ceba444d8e460d0695746be057ea8d76f8c0c80358f3db2ae5b996272737516ef5e4ef5a1fe5967304cb6d00090c9623d29f0d4bce8ca3cbd54a30f9597e01e5845c1cdd8777e18c5d5d86492fdd0606f623d11a28dd9f02032e3a378c71b757b52021dce6ceec63792cea24d6dd7150ac8fcfca6554f7b08a5529d59628d0f35122504dd1542f6291bedbee09f81aa744a0f6c6dfca6207fbfab6b9e17e8a4040741f6508471e72d227d0fdc50c13f444310245ad17bf819ffbbc4e0485fa68cf1f0a4423f251538f25da989abcd008c803d368f626438432569f12d1612370e4c6c971079371081b37d8df7ee709198aaa2fcbd443b96732aaa4e6924a461b60ca4f4cb13e88d539aad709a3db84d2d6d26671a9f3877125b7a358389bbeea846a32e949db9a7853dbc7d5add92729ce1b5c00680974f3ddc6a8235c7319b6cd1ce5e0b66fe7c2f1115206c42b4c02990d79efa8be94927543c19ee93d0ec8811f9330693696c878cfadaa2d56e877d42a3680ab2f6a576fda7bf7957f781655cc664a0a4a0d16ce34d04d7c98a9e0c93d2e6d42870fe66864660b564ed4f881693d466bd68b6470af03a5a6e703dbb40515af5dca7142c4c8d79f5be4bb01a1b56be9d0936396a7eed9a84da86a4f00dcf676b4942d5df6e1378ea26d9118a54e17fc623b83aadb417ec82f9afcaceabbdcfe2f0b6ad4bc1601b4e24f547d61d1c1737adbcb46d98287372c", + "signing_randomness": "e5d67df73bb08e2c77720037ee0b4b671d14efbd493cf3f935880dedbb2edb7e", + "sha3_256_hash_of_signature": "0071a4c1bcd5a010dee13acafa73d30845210273c4064040e658393be2b6a764" + }, + { + "key_generation_seed": "cee2e53099d8cb576f8f76c5c155470f87a6ec5f7d73256a0a2aee62cbc53597", + "sha3_256_hash_of_verification_key": "5e45a02bf595020d54b459b8c3721b3b386679f9fd052b8c24e592c07c4a3e94", + "sha3_256_hash_of_signing_key": "2ecd252dcb95d09294df1cb5f0d6a25756d0d59cf3eeebd365d14e6f006b6e4e", + "message": "4d83349dd620dc2cc0e9ada524b9be9b195973a839a042f4342d69e6b38918507a9747fcdd8b751d7c75abce2b482b3313d4c74ea4e7a4a91f2e08a059536b651508307b7f4c3aff5cf1579f90f32ba1e847778673e3956713c14661afa2d11ccf61fd8f9bc914d4b6e6d09c52aff7fefae325c180147153c9ae1924c9a2b8de4900bfbbc6797558b000c5adb9a8dc4cafb458ad328f19a2c55d5434bbfa7be5057e56511529709992bd6527e913b46abe38dbff90d4ab3c024a66fc0f8fb34afb96e22535a0ea8f313a087aa65355d7d5989c486e103fd526a7a6d812c0e4d8c081bcce4dcfbc64b68436739451be0c4b67bfca71be955ba9f9a23c223c7d0ffb1b2196c9c9845b6af341a363951e2008bdc4f3296dd0e1e3f480f2e4b0ec77a002eccfdabcc58d24cb0baa26eace96decaa0f6bf1cde0175afa65ad5c23c5e71b50df778208edbe426aa6e876c12440d7c4fccb42d039a14509092784baad37d9b8edf186cd4fcb3d9f8b0397e951777d602b8af613060fdab6b358302b3fd28437a06694f36ce12a035f09d677e48d077cefd1676d8fe51541bc19e3a6d6a5d879c4f9eb4713b7c0f3a652f3a05d74dabff79a302fdaf147531fdd57924f49e52b298219b03d6df166b481f232fc85c7cf52838969ced2dcfc18dd8c95891c498fb49289d1a982922a0fc02c849ac3bb7fa92cf43a64464d5bd919f75ada287fe657bf61dc07b3808c0fd0d71ea24de5353268b2c17c989c29465ba49111cc479f51a8cc623cfb6ff68149e52c77a7d85b5ecce66c05900ab9957bc7ed39e03649a103b5b6bfeeb168b7c1f30dca84aea509fec2b215dd95558a2708839396552f517a8fda28c3ed61f84e1b2e0dcdfa708de50d44bfc65bd4e70260c437c8b5b7158ec7e2301d9c7aaa68e0adef89fdb601711ad2998379145b29ce3681b513dc3ba9b2eb668c1b53697833670466e21e767361c0a4362e5b8ddc38ee6a9c4dc5205eb808b93c72ffafb635b4254e4f4496bacc753c8ed0bcaa88db683ce77c8165e8ddde665392cccd57bc07573d83cb3aa10648281efb08f92aacd8ab6f9b5d7fc66d29526bd57e421220ffe375b26c61a0ddbd9807022eb3b4b681a43e7719f5ec255c1e19ae6c542d6deef3b94b6960c18d0d7c8110b88f995826073b874042faf97f1ff034b8257418ca269f5ca588223393b0179f9817e08e7212d0d410ea259ea66bc4a00e7fb1190a732bfdbf7adea0e4550be90c3e37bf33baf436955742a2632aede259235702ea2e079d99a22c9755ed34c1e3ccbe746e728a932b1852f692b103112b303033ad3ce1172aa066860df570d21ebba51fab72d5afc4ae8995f532ae384cccc3c4a295af76a803fe076ccc920a80d82a9b614760ec43208579ef5dee164356d62ea33953e55195eee9b2e2018e6fd9d19a9f49258702dbaf6edbfd093919917b1b6734f012e2beb4f758dd481fb8a8d7796e755c6647501e28862b9f5b16ffa1c5d80dcb07141806fc348881a5a8891bb632a4ae4292a102d71504d0fc12c79d15bcd0799d30c7b9e72625a7df7dbc7ecf9eacc627ca9ae5d71e264f2f2a9d5db8593f3a90f3915ce480adf800c99fc2c8692f2b57b492bf9d84171f8c29af8d5549f82d3730927096ca18ff0b0c0c0b8b800508c44d5749b92d7d48f7fbd5c86e408ece0eae639af475073df5ca2cd5083bc4ff8852ddf5c399946a6b21b0841d137f583e0dda3a6046f082872b783eca3e14b21a2af61bb150847026f2371812b1a2be72024226f4613da860ac2ffc578dcb171dc27b896eefe49f885f9be4cc8766f37038e01cf20dbb661f507b2ecf2b023203a6259b0a018fc00b2ca9b3107b605f04388d5493ae7cc4bdd093ce761a92847c2a167739e0750b427b2aceb3abc5ff751a5f32d36b589787d4da509c85ead751353ab2c68a9c14b8b2c8166aeb6f27c7f101221c306aac74aab6b4e795525fe12038725d7af3d2a6d60e1ea85f2b94ea24f1b72fed9ddad4c8e5da484e80a2150de22e6adef41153d7b4331e8f011a3cd48dab02876b067312d0dc736e465f99ac3c9c56321507e79accf652e3857c749ad92dad15350a6b4b67229a3905db18ab2053e2d4f92f156a1d76d0aa891364002c991e632b53fa217aac1709f37f3402f43b0753361eb2f595f9fae3d7d96ff050dca0b9657f4c3ab49ebdbfe8816051c4e0aff32c5137749d53b062cb61f7201171b5dd716e9ccb38d00e50955596845dff602200b30d375a854ca4e9a7276ca1a1d9ee92a04bcd78854be251f7080aba6d8325d40b37054596ad80211a50afcc1dbc177600a70e648d8beb4fcb8919214894cddaa6d63b6f6c445469a6866721d4bf1117f25dff9d65fc8fbe5b0acc8b9039c7f94b2a5cc6068a0489e2e13a731dbe1094fa8558a601addb9e4dab04fa744cd5b95a9d57c52c8124ad950a5944dee2c55e5c8540dbee5823daa624f57fd5be994bab3ad4e74ea9443f8b6024bd6b49adf3972442d88e61e04fe8478ff28916584ccb65fb15686991d5781cb7eda067745258ea671e0a2665f94fea1b5490669d1ee8711518bb911094957586c8075e3bbedc47be059053a7658adfa0aceabdd46e0dd9647b34eba32e56b6305653ed386c50e79e15084f00f003b1d12504fdd8e47d03d9f7572276047bd22b82b8e81f87c86e6f20d2a756b16f291179a97b010f993c0f839c9a1238cfc9bde8074405cf1b35df423c7566ce965681f21c969e4f3f8fdca72a18d5daa80287f53b5f8429fea81612cf63ccf1b7a13512db4d1dd2678fe1189398032eaeb4368332972c728ad726b7290302c3c5acab6e73432e825b9046f846adca9d93780a36095aa5c51e354cc6e9a910cabbe59130e98f4acb3cb6d4efda9e2f78748ed58465937fc81c548ad038fdc32aec46b078cc5a7207658a9706f1c9653359de6c4457dbfa71d300f98f9bc5daa14dbdd5ef20dcede7e9d3f7da5c932ac3338ba40e46b17d89fe38f725129991983d4a81321b394f2d7b20d66e3deaaeb6fefc8cff0b68a766e27ccfba66deddb1f541deb3c1892ed2ad5d073162f0dd06b82e8878477bc96e03101c9b5d9d0ada10ec060b45e144b31e6b4de283fd43538b47178398fdd15b01ed421ee2c65847f7a4e9aece2f1d13971ffc0157040782ad4b591dea0906370820dde1000490ab1c27c03d02a0f4b4bfab0e56d7257288441cea63175cd6bd11382e6c873154332e627ce82e37c63889efbd8537ac35c21ad7a09c986cfebf13b19d5677c1104b373f3b55198d075aac608145ff9d0c4c12c83bb41036ab32227629eeb4922f172281a66c23c35b8a3e92de0a10d5e8c18b9a54d6c30230f3a8263986ac535b6bf63eddaf6a02c9100b712ec4bd49851a22af0e647f259c2e19b9acaeb6147c476c90745a353f6252ade8212a9f7c215c0b3053bf2b4e0ad225e8b344ec14c1b839877349c3743e8337d9c1eb128b06939c5a08f60a46fa700723eb6652fc26440d9bda3c99c10ad0742c2f039be6b66749b77e14f8223509365053e87ed870fe3906a16da6c62945dd2112c96a23942b1e14431aeca7dfce3fd4d6633e0b661fb34b0bf05c4d21e689cac9b6abd9f507f08e4aab94bbef1c629c0e1cf344e66d3a3e100b615bf762dff0cefc5e4cce0dd908f46c94e7411a151e713fe0c18ed33c4c03e55e12c0ac366da5c757c7090e0f94e2c34d93ea3b226adb2979d23e071f18c2eff33bcf41baaf52f4b44e38675dddec89c7bfe858bfd1ae70d96d0487972d70f8d8681982656ff734bb6323aa91ea14c6330c71783d235d9f094cb111abc4990319bbf163891535aa5f870164da65fff395db68b390084d4f2448b98cd56103e49caaeb6cd040c3aba8290284e9b2bc423117f4104d89b1b1607c6d34ac30aa9e79d8753b97cae90ecada6cafc6100d3d6d91e20393e0dc95b981fe0edbcf88e046f74184a96705ac226fd26089468e432d525643293bda781b64bacbdfd6c7301ac42aed7dbbce7abb9d67af315bcc3509cf03523fc887e27edcbd7c74dadfd0f126cdb49e28ecad38080f18a775e6d824c18359935d921744ea72fe293f299b530d9dc9285ef174ee60e2ddffccffe89960baba90d955cd2c96672513c758142d29a1ad79ca9291bc6782b64717f11a71e6d65a1a71d", + "signing_randomness": "608d2f9e284f6aad9a362af4a3b89cd2abee755a0a286e8efe4f973f6f24659f", + "sha3_256_hash_of_signature": "c3c79912edcf38c09504b2dfd9caeaeab2e3359eef964a48421e3a2cc6eda3a7" + }, + { + "key_generation_seed": "02d9755c369932e7f99a2e1614b03e2c86d713563785965e008ba987a6c89f49", + "sha3_256_hash_of_verification_key": "2c1392957fc005054ced1895357d761ec661afd88779c89a37894b936b11b00e", + "sha3_256_hash_of_signing_key": "0ebb76eace27c8d4f603e3bd0ff515c8ce51daf4cd956a729e0b99e780a04e7a", + "message": "e0f434dfa04ec225ff6b6db802a047e221bc064e5be89a5fc13937ae9d3f22b4439bb1c1bba01547a64ab3e810bbb09706d01959e2e906a69ffddf0c56726bdb58fb039d66ac5d77c7f0e9a8617b0c69176770da328d38171f39b5220279186250139922c0dd0f7c3f96d48615fc66db7568810931d257b230258ffe9cb35f87859e08139ebf7432e948ee3f962bb9015cacb8499bc69597abae4b841b606657e2e3c51ff5a8961ad42177a9e73950e3fa150439e2063b6555624a6d8e3af4fd5710fbe722b8c6267ba5df56846a085c56444573d692d5412cb70e443761751e58c41953bb9faa3ce1f4564c825a02f0e1339cd659ab1480804dd2e90e3086aaa292db39c6e2aaf1b001b47a21cc721c0c502c46ef0479bb7d8cbdf8e9c136397febc2d83c0fdbb3ed4fa6868068477206a26d2b7e0d20507aecb2756b888fcf5b446217de14ee6a20cf7e7b732fab22ca3abbe81b2be18463acaa3132773acd7476460536111cdcac98b1cc9b2c36aeb3fb318340f7397b4b4ad6aa87eac94ab7d98cc12ea5606162877465fa2cad276cbb5d36c40a0b014c53d2d3a96825e237342dfefaa6b9456b5ff1dca859c5976f77c3d3cbc9df355237ee9b4b4c90a9dd941294431db76dbb539dc48669e7aad21808332c8a4fe98b8f043fb756b526890452fa3c3527fcd584cd33e38ff9ff783538d39a184b7b3eb649e1c04c289fb65998f6cf5d5bbb0609fc3403d85c6df269017032cd24ac540e1b294bdd3c3a0c7117cab02b1a0063a174ff26fcda687433a667322320c0dec1ea3963f3b14375882b3478aed43c2c74debfe3a734f8b1a5cf92007f8fb627cc3aad5c6ae4c31846b72e7573041270ff40e762c0f8dbceb7512d44dc260a97d5ca7d60699981ed8476d8651c35c8ed498fc2961d1e38af46f3653630773209a63838a9222b813c23db0cf4196d6654126ba2b1840a7180e653b3d6e10c4c7ac3cee93b0399d918a52e59f0215b09a119e634e6e8a9886c877f157bf7b7dd827adedbaf03c718ae037c0b262588171839e952721de72180f8eed00b01f53e098b82165199c53129576036fc753a3d33aec92060dd19aa078a496a2b214b1bfbb747a1ec64071b0a078d74d0212e6203c9698c7449326a42bcbbe8d9501db916c64307d5f1083bcc36c0ffa18c0e4410b0b17d443481c3673d17bbd7a366a5fd1c3c5b3391a02eda7596b4f869a91a32b5a02a05611371231be035edc716f534724b5225e1a72a2b2cd357f4c326f1dee963fab680721d40dd70b750a019e70885515f43946a0dd3dd042969139f61eca0e9ee3107d3d28ac606ad53f236303e1fe986c38825318b7c4597b14e1a83b81295fef49fd0f2c1e14a0b146540d853db9706cd224b376343317bf7330b0c2721a409b856304fffe60c24c441d5e2797d4696c0fe046d305aee93cc6a2d89a81eb19643636a8b424b310034612105df16516ce9607cc0a2bac5835642c6ff9572191bc45e44d9b40da36b607f570ae8c39d490342786f31ce6764f3f7a764665b6cb93e54922c6d89db566f494e0ee069811ac82e8132f2f388d68490cb1c2172d2979fce3659d7076b4f457232eb839172963f8c342e2cd18969f086f451d33bb774f3d00e6fa2be02292f2e5cad3adf5dec28932bd784801e69364962bf39e25455303e1f289052d2f0cd4964e0ffcde29e7c074e5d57e43739dfa42aad636c352d363e3a23bdd134baabc7cd1621ca638ded7db7051f0456641ca872ecdb4d3c2603ddbbce16637010e782c4bd5230992e2ee7dd904f8a83ebaa7b4c3cee15b10794ace894118304bcda9e9b1376331d2248b802557aabcf913e95f783715bb5e90a4436e4bde7d651397a70a24257c39e0516bb1f548da36c1f1f92a416dc1114107cd863f3bfcb360286e774b21296259756ea6040cb61738eefe29a67895ac69797c640e03f0e9e731647c2da93373920341fdfbd50eb6b737bb0d9fda8ec8784920407d4f41486d8fc616430768d6431ccd789deff332b239ffd1900800cedd9661a55d6d96089007e9089a117f03d7858eb4c3fe2d07e91d8cab88d2ba5421846069fa6d4e5c9161a140cc3a288100bfbe61c3b0f0e820ab12d8fc54b054a0f4c777052495b45a7d1a883e67663dcf50c2230ca5319ab31cd76435dae41ce1ee25ecd3fa0c7e83b0168852b2cab674127cd7bc9ddf9dd4b57eb40128988c7c8994dc6a5fc939ff957f06c70a4056e63331f9aad254ebf2b8fccd580285bea486d91a0c2dbd5823ac8f6846ddabcde25a2252f8da1aeb32e6969276bd2a7f94cd7dd3143f3181489272b1589fd385ba844f90e35982b53141daeaed413054cdb935f3412e31d99c1147079cb487feee85e3906daed18106b8c407bbcb7716ef9d4d34e2ff04709c7457997ad6fadc55a8fa70bc907815805578a11a012c521a1325754cae2e3f7c9e1fffdbd4be31dc534961c318d1a894838e0c33806735dd11e408e500995b86b6ecd20d325347f792a3381d2a45587d9b6ae0aa27533732a6c421ca621aac42335848d9c0dd89f14eadf2f92ec532756cd5697ad752b6260c598ec9f0e9976a950b22daea8b74fcc87f28b5e9ed83c0339e566259ecf06e5ce209065de87feee5d1e9c466004b34583d6ae89b590ead6a96cd2951705ac764f329e28c996ad6db05f6c69ad2a39d3ee230f6501f1760aa41ffd936c9dbf20de3996917322d32b946062a3c27d8bf35ecda22403ab684cdc680dd166562d018d943369caefb9133a4bc4515cd5f9c08e7c22d153f0a7733eb4eb2cd8a74a4c85e40dadef6858c5927b6eeb2b01e9b7ab02f7048c8869991068b00fc19b9545ab42181dd5cb5488222a402e827f60a8d87b09ecc88350032f998e3c10a88d4733227334812ec97c5e5fa85faee1a1e28a58641531b139aa58bef49780dceaa408986cf3c40e226c60531945a20f91e5dc31ec86c9f9a0545e5fcb79a13b9afe9b133867ba7a38152abc6d9f8ee10090bb71e6adc6a6c2513b066f2565138bada60b0bd339f9be1aaddfc90dd272b4146d0f5830c6a53e295c849c15d001176e7774fcd7619d6ef1a30ba93cfe278ab4806bbf25ce4a4e94163f614e81dff7efcb015997f5138e22b80b2b00ad7579cd84db5d1c7fb16e9e8c5d9a5ba0ad0e0a7de79c18839d673632f3d2c7da2062eae844faccaf23590b2fbf1861405ac347eb9d723ecbde54cc96bc4d8ee2178f353310e5d69230c5db2841d2a06a3a4e03e054d99defc6004a6e405fa89b198a901ea1ae9f3112a29f3aec5698a42794e04d74d761e4aa5ad23de271969baf124450f4796da1eb1c01480436ab0f5d0b1b2e6717dd87eebf137420961f978896077e40b2d2ebb5664fd8ad89bb9333fdf46c33ef3bed21bcb5b4697451bdacf364f85462f5cb9f546657b4744edf757daaa4d3a9a2a6f281184c3576b1db0b540f3b36310020bc6ac0c6454a7cc8ec1182422b17bda202729c270194cd6044210d2b98731565812339edfe5a0dad79ba826d8c566c7d25dea9bff0badf1e4e5da2b884966e03fadc51c6d9bcfe877511157201dab48aed1ab038999e5cc3fe58ccd37d40050dee92e0bd5332413a7f0118724084ee5545fb51942df1ef399f734fb9592555b5f32290c53d7e5017efa2b61e29fdce90cc3e7c1b0e545425b1d3e1acb9089daa786cb0122db3ff27ea0367751a5462230f0f248147ebccba2e16d214e9a0baebe989bba020f95b623cb14acaf2be6f157dfdb1e32627133f0d26c7b65a189f39955ee31d9b507b43126b06b9e4524732c8621d2274438db7ecaf736ab7257ced950eb68bb868581649232793ec83379a16f40781e76f5cc57c48c3f5c2989bea803e1b63768436d39ad19bb77db46aae6e8473ed5dfec983f49e4b8e7ca6bf476ab2f0272c0c2dbef1bcb064d7400bfe1b9ecce13578a20b1d5b48133a74c5c59cae0115bc3b50574580bfa99d58bcad336ee2cca5b7994c784bb90cc8f1b9a0e21b39d5eba464de34d46ac0bbe436c2f419d60d8ab13786f9a841b52710d1b49bec290de317b66b6855abe156c07619a4b998cc582e3f54a7f457f1d2839bc3ebac937ad3ebc6a9e6e845379cf1d66d7c59000e3f6cf6823b005728a95bfb0acd044eb35d5adbe8933a3637887cf91ee74bb910fdcbe797b0c6b1b056500542bd39781bdf13ebfbfe949d7ba0b7f31102e63bfc6e22693f97", + "signing_randomness": "3564fa8a5675b141d97e6e832cb5ba14a8472437d7b64514b7a9440b88e3675a", + "sha3_256_hash_of_signature": "4b79677c7bd6ce29c613407704d0a50d3085422a4d6e99f9eb5e59b208c742ff" + }, + { + "key_generation_seed": "2b2bf7cbb0957a86bbec97001b60c7c6ad98a56e94542ff561f78fed211da755", + "sha3_256_hash_of_verification_key": "9acc56e7c0ead6d866f42119e9687b6ac35fad4d59609b746bf21a99f63aceac", + "sha3_256_hash_of_signing_key": "6d128d239a4724d38571fe618a71982bae417d3b25076aef21e984dd9fb8a1f0", + "message": "2601a39b6d7d91de539ef11c3b67ae3eb1607716f587bad5f60d311a9f4fe7f04350ca085eda6d41c4bb6c6e13e376bf8a314ddf791ae18be2ec0544afd3cc27bdf270c4550e9e78d497b92349ac07755bf9167b2958bde919123439d6f49c3408e8d88021e668a0a5fb6799330188e35ec5939b77097e3737c4f664d01d85faad0f583b3e95ede125587e2a79991750d5cf804325c72dc8ddf3471ee8fde02519d2d0ca7edd651eee30b3be335ccf7fb02059bc3a47ee3c056d4929ead4fcd82c8cf49625d5da460daa299718556bf0f77cc5cbadb99b64c8ead4474601fd5c79309d4e63aac392853072619efd7b958f0ebde5cbd40acd57df269a8810776d6dff2e637ea57adbfaa08df8d2581c38cb262dbb4d1f3c65a4fa068539d2056e08dcf03baff006edc688023a20728b227a99fed3b8f2bcbed2e3e6ecd8b8665a2e4d233b78d7c33f6e3bd9d0a24d13c8eacccb53a21dda9e7a34f9a0f031091e65f749c9ebccf3ddc4097a121d8c68eb7883405ee34f6a8b0208ea8d5a3fab53fe2cad1110bfa6e094f78d5314880bb67bfdfbc2df8aa250f1d7200ff9a3247c4976dbd1bbe99df02a3f246e5d466f85ed2f68e0b2de06b0f2448a7b98fbcbf5872bcae71bf0db4e70105b020ff130141e8de86dbe05b7d2a234ce2ea83a38e23a262e46ffbc837e8a71f657e443052e9a49dea4e344d497dd2de2afb4009d681f232bff4feeb173546cbcc4c80c9f85b1ce125be678e5ec62ef04433d55d4b8829b01ac165a440fcd6594f2c0cb456c8a47444ab05a0f0717b8185930d9738e885d24dab98e11ecff7d7a48a4527f94fc4c9d1b9d71f5e6bb39cf92b1a6d0509fffd42e77ac9ad6f50f8fc649b96b8ac08673f78ae8d0ba2b7243452b33aac44b06a2b9be1ad6a12583d3590a3f9af0e0dc35da88a257170d315f32f3a889601d6729433b7ade0f719386723eb2a008634749f5253cb7d9b2fc99a1ae1bbbe7f00a536cd38f8a7237d3992c3897df412f5b1d45e1ef5b5dc974d49cf8dbf785160bc527543458fd9378b3d4d3124214ae5676185794209ad0ee73b063cbd5b7830d00f817ca0d5cbb597c44d28e4885d935b7bf426c1339c500daf4f2033fa6a27a4196f233256650472f205d2c5e00e7087fb73027b0c6c9ac5c1d928ccd190b8a6bb33f512ca8e2369dae6111156de47a24469683f4721a25652ff87474dfd92a028b3ec5bcfc244ce442752a7da1da6c33fc22573bf0b13e371ca9fcc86c76fcf7a1654eef4442e47399835a06336e62952770c6e61c573cfd07b3ab631b8831fe3f5dd2c6df68ebf2f8e02ec9f6b90a371ed5e62c8463780ac453ab6f72d38c8f5212c8b650f63b98e3c0886b6a85ae8e7256c1efb30969532cdbf72184aecbde2a17b9811dd4222d080049c5d36c532cc0e910779d64af93d750ee96bda87562ebd3830fead07a3960cd6de7146603199563693392d3cce1332df35c2c8a2c251911d38e95815ce5a4ce5596e2d77711d87cdd54d22e8f0ab431bf8b24ce9c7bd6d077e436543c70b02f338841af0fb86b5ea4b6a47e27c1d83e1ab06801044f546adada437f3ce7d788a1c92a74ba540664658e70d4f2711979153ff1589792859c3bf122628479c7c35eee951dab8cdb0d4d150c2da338346988d34f8c5e589b231b5e00849611ba09711bd3a0516fd515e6c4ae1e8a3657c282c8120c97aa7a2e3baa22b6eabb8d8212a9a48e7759a9daaa51b538f662a05fb897067b7cf9d2ceb47a1897214ccfc225ce47cd60e86f7dea49e220f7ddd6894b30b66460decbbcb2e42b31f4adf0aacdde544b9124ea5ecb04b03c448b17e8094d489f516d23164d2317d3a1332e0500f1423136c8535d69065e880af34cf7e36db5ff2c18122e41880585b4d188411e86b370a024bd6e28143ea2eae52eb46be334a21a02e21c6755c0182b9a055a7d4c7b056e4930ce63edc79c9fb4e2fbffc58f776086f3487f02f8d1e7c8519c7f452e75ce5686a037b3642b95d7526acd4a81a47112cf96a8da7548016a22e9359198e871dbcc5852fbe14eecf3ccc5eb2fb5ec31d10474df7d63482a03e11f4aaa2eaedb714786e21d03af1cd644d06bb05ff7b3959601580bf50e5f7f82ff42e9cf2ffca0c67ffc52cedc53c7a5c9efb6c21092dda374d1cccbc78bbd9f5ee0fdf6da6ac60c95f7c2e96f17e3c379a52d5dbd1a92dd76d1f5dfa19ea0408e0e7f7867445445cfa60bcefc016e68872fbac9098fd6a8e84731c285570b1beacca6f4728958e7924f7a7b7730b9bdc9aaebd9e045f464071843c650d06c96d487cf8397286f81d93d0cc2008a62ee32421e5231998140909474f6d98541d899ea53714aefe652a3d792e4c72533332c3133707a49293e3b2e06ae18f2f81d601aaddaf2fd09ec59350e0979a5ae2b721771682a1bfb5748d000f9736031ca971288f34993df10fc06a16a6dbeed8cdaaa8127f3b71432e723558f0281459820a0f4a75a3b2716f976bdeb88be9c73f31623050d7c1a96c84988b01d847309e1b6d7b815883f83c9bdb7fcdaefa8ba69e25b824812b7d54530a3ecc96611897661158dae1b4aac112e9ac13d07fdc03dc7d5af23c08c5e4bbff737238fd3f1c06f94215bf2351dce9cae14b4dd4745ac0cd626054469c6a5286ff821ba192706d47ccebc443dd67fddb76797a8b78dd0daf850cb5d181c82298616e1d3a92f7fc82fd256857915773c7ad97cbb9710373299ae8516b8a1d647a13c7be848e0269ed6c8a91dc50d0cad21430a3bc9e718a13d1966a0182d9a24fff7ecbc7876c868af2baf2d8b782172c6719cf140e8cb877fe6d78779e1bb31c70c6c9a6a77529c51cf78a5e4fbd7ff6153b5195817f80603e5c5810c38cf43ca812eca52f73f045e33df4e3d04ec8c5f8b4a7399f6cbbf0d39dc951c476b9bcc002720ce89f09c3885673bba9c90d20dccca4a82ce5beb38bcd60afe2ba65fcfb01c8793b7ecc0f0b17a9da74f2e0fef4c90b5132fd6baf8c010fcb5e8e7faead7f2e0db29bfdd1811072623cee274ef2efb0f7d4191f332aaf20cf36ff89a2edf15f7b284cabbbef46901271d8c1b180f736125c8a44fe164ac7e687e9a58c3b1775238bf1a11f99bcb583d0e3c44bf4f76dcf9496a06f80ca52e24d55b54ab849d3040b4798bf5292b0574672e9f844016a52a4d4e4dad2053207bc97215bcc1bb93271c03c9ad2dfc7485ee2ed399236aa06cf9a12972e21afdc587a6334cd1d71a7539362d714ba26214664e3b4bc39cdb1db847583db8e002a2aab451b4e5bd6fe200730bfb2745d03c82b640f4ccf58701708f724effdf98cb04c78df36b7a866cfd596bf5ea18445eea0e34ed514d0dc2625039049a0cc82711dbbedce339c77f9fa1dc60eddd8d58c8f144b0f3d00227afd8710bdc66d29809728d7fbe85f08aa38aebe5605da29a09cc0526fee84691eaa54dc3744bf5a95275037fa2f600b1f91e502d5d81af48f8ec4c1834fe625fcdf2364067048727559047e07062b4d8a7d3851853bf28be9d2c511451e5fdd9459270328a2612dbff42e1dd34005a3da1226a023162f454923c0337e6c74b44bb27a3b1ac82dfd68b0a6daf93473d97a9e4591ec01a51cb6b47e2c7a85c1ffa73c35e5ce3003bc4534a2d9b16ebf9fed6464cb1e0cc665a451616a62b6a8481e4506a73883198c144a06331224d358196c815c811b103959edca35b26bcf86f41d9c7638547496787885ee62b14af431cab2ad4e0224d33476c58b8b0833bf13b50be2b1d682ca7dd194b793ad2c6e4ee25aaf95459302f0b4daed907a317bcc6a5f8d76ca9aa0d799f8ea39f330d6244bfb9f35e6223a0f665a65f55eab9bcbab446d7fcd424dce87f234864d2c27ee84600ed9193afefb6e7681bc94f514fe0748eb32d32262cab880d79cd4fe5cc963a4f688d448f2db2dcc5b0ca87ac26dd8506512c100273b8d4d902fc054d48d8bf9ee818ad9619f68a8904b613256db78c881cea3373f0cbbac336a78cd91ad9d60126e05cb8c16e9aa8482cf1b806b2f9c57bc8d63bf008ab2e49ede8e788bf96b9f1db2918dc5063f3f1d5b9b1c0327141acc0b4b248ffdcb8bcc127050d27c805e154a4825dee6be9c8d4e42b1f5efc1eecc6a45dbc119afb15ccad19789eaafa8b1715111ae32e2aced2278803b60e2fd63a43317498244a7cf7342342b60462510e19d83240dff5d58e762c093df326ea503fd347d2a92a5a4680d5e13b305671c729179fa21be83b0d83144e63", + "signing_randomness": "2d34d02a0528a9fed0d2ae45188404317d4e5e5dbb22c710fb65897bbd3e582e", + "sha3_256_hash_of_signature": "5c5d5ebace25e7d40051847806a81040ba7ccfdf12785d3629168dd5ae32b5d3" + }, + { + "key_generation_seed": "049569cc5fb969c6eebb8aea1af1fcaf46f8a9e6cd6c796fc7193592bca9cf23", + "sha3_256_hash_of_verification_key": "33cacb578199d410a3e586f88d9e977cd28419497d4c49542be154185d4ddd93", + "sha3_256_hash_of_signing_key": "ac57c2294201d53293ad604a486df2670392c554c226e45f3366d959b5b83288", + "message": "9163116c86e64d90d35cb216fed71bdbe6a0797a48cb915f5a40fc8d31ad340767058b28cff0c240720327e12e653c1f98b5755d8000bc01324db2820781b94c4434fda76223845e0613e2526a95f28fb4a768b1487aa34dadb28cbe8df4fdb510dffe672ff004f37c7ac32072a24c0f12a050bb396ad56346f4e0ba75c0efac162288a7ee8a63255dba5cf451a0932fd56b05e40edd491293e045a6081f6586bdca10b41a6970d8f9a7b3b6b58aa772eefa9ed22c9a24a384d6947770862be4fe45c5e0e56fa4d116b79699ace41e5d9f2e4c245059cd798dd986a3763f527e0c9d5a88a09c4d76d447348509fa7d9bfbf3dea59ea57711a3b1a9352123d4a74df273fa24a89bcab42a6d455b5fe3c503f1ff638280f87c740b9e4c5ff20133cbdfb8d08caeb7de9f26811d437e6ec8c3143c0419c2f5135d25c7f40c7908c03f295fd26f1a03fbc7285196be40adc6fbdddc912b3bc94b0bce08dbc2185ee3cb766325068db55c31ffebe4b1f6848ad4fc201a5fd056916a397abe6a66ff9bb03b037b50ac509e46ca441ed45812e3334fd7036d190a7991e55cb817ec2a63cd800f293277e7d15f086618b55ad395c614d168fcedfb274fdf4fcd50cb976f68a266c5365e02a1ed0221ba4e13e70304824f94251249ca23c089b4d54e02ea03fb7c9841dd30404428aab2519d68cf564d75d18530c7d062496c120a8f5305aab23ae52255ec919eb0cd875422b144bf47f7472349558e746b0eb5493f1fc40abdadd2ed84a8b31221a485052369fd0b552972c9faeb1a78e826ba4dfb9e91e301db589e9d7c256e7051692c48534c6a5e2bf0f45b78aca66d5f53e549827e15d64e2f294f93d43b9f36bedce6cebc05e56ced3f846635ae3c384c3fd55b969ca31e8c625103c2b24e7ee45e92984ca23a331c5b14281b20116069c619d82d6080c6fe35c3a3fb2e73b695cad9c5d3300814fd65738dcc3eafcefcd24361aad13a25b3570d2d509fa449612bdb5b49e0605d7eb78449d1db40660af0f3d8bcd4869b6f175cd28ad72fe2668c3dfc1d4963d0eab309dd50b74b9d2947f86fbe9864ae5d0dc69b55b182ac1d914b11f631193f5f1f897ce52cee97d7ae95631fc2f2a1ae9b672165432eb2e5633b55185afa5e883268d8503aec10774d25d39c800b74405414fb06c55b8c48835577884d6b4f2f128246563066f8f34d76213e0720e899fc1f11a3b0a591885d82c688e40d6b44b54d6c7c6973156e2dd50c40a28d2ebba60f5117d64646caef72974f4b8362e4820ec04f2f373da8d883af27518567688146f16bf4e10969e70be8ace5d2ff6a135db1dd738907ea355fb6d243904f6427d11592672060da14443b55a9089167fc9d5efb2c64b0069795c341f90daff684e566611ea87bc40a4c45f22c23ab6888a754b89e4c95bb54629ce74ec999889c82714b5aec703de7bc080b0d2e622ed53b645688ce164ecdff4ed66c86049b2f9077f2a94cd685294f8ea9cbc1de29a48d39f6b308288dfdb47731e39644b576a298646752f5c53d7943a5d0f7dbbc9604902b61b8edefeb5ab7e5bfdbc1e6723e6047894547e440e918038cc13b47424ccfe1a207e08a40524b553c750683f5f6c960f05836fb9b28c59e1b471fd5331f1811ddf3eaff73798b7ffd6c9714978988c440ca906b4782a410372d70ee65a0a803061708003688f576e2d3a22580b706149a24b93a162be9f1b546680a1db2a8e54a576c28b4772c50a55161b2994514369c2192b2c90017cc8282f41d28099f38b2f1f0d2c0e46b444417a2078755591f00f01df0ce72b1d1bd255a14d2bf67ab3e630f95a5da9bd9e10f08efbf6fe722cf000c32460fa3271f18b39eaa4487c1ddf828b6bedf4523837bb3425ba1c1606e8d5d1e6182aa6a74f068f3e90b42641347ca755779216afbc99603391fcef4e8e5aa202bdca24b83ff42f4f01232d3f2831cda2db76fb93a4cf6e9efb71b5438a4b74c3190a8901d73566c50727559ba9bf6317d116e8f5536bacf064d3f86282e0f88dd40b63e75519c6a8e5664af8e1029fae87930f523e4dc7c2dd6dc3296a42a59f178d438866d929a70951bed05533eb1d818b7c7c595971c26b1d436d26897d6a6eb036a13511ac4a3bd724f2ca57fef07d2c0730800d35683d745125f4237add64b538b7dab0d0f258daf7de1a74f74a2fd010cdee810f514fcf6045f0cc84e2054b5f4ec2772718ffb4cca9c9be77f8f007333860180d60ee4dd8ce976e63ff49aa11dd42fe6946515e59da3e602b1861bd3f63c89362bcfe8438bc71959a617d8d63331a3d903bc5734b777fb14f7a2b063d79ea8637ac52c758ef88df217b95fa8fdf1009ab28d8a4f318f78772568cc7aa9e3b3e001c0111b1751b698ef1b66383d6b3ca942fe4f66fc97613cfbbc03eec9d0b7e08f80939d9a2ea1f72bda7b0d655ac3a94b4c699d3eb1bbd6076e63ef5c1fe9ce258b55d21164ca7ee03bb53d8ba4306f695e648093542d769da95a35ff3a2c071dd8abd5a82e217d82317065d50a87b689ae3a2ec7887957bb243373cf986490961220ea61ebe12ac0287b185070e124fc518c300620b4b6d4f29402b18c2462a7985c00e2a87691053b1fdecb7aa264f33e27c6b201ca6065ef79e5266513aea92e8d3e646453c089b5eba66d14bc45844d0240d2e7737c16668fd53e38a93d6003146019777c03644c300d06927ef6994ac794914efc5be0ca81680ca8c9752908fbd2d56d7fd1fc1c76eed755408f1d7802f0d3d0f347d82b162ee6f0a2a890e083c20b822fa6c4ad627f4ab5d1526d83d897c244d6ed4a427b23b4a0c19f4e8889257c1373764ab7063b5db8ed9c2443cb012381a2b3365eb568649d7ccd52271f25fd22fdc397e4c9c536ebb452cd2cd10dc5010bf433f88cb58d2b9edf2bcbfa83b782ffd4388f1bce3f8f9af5ae6be590bdcecb1bfea846d2f0199eccdb0c7e4d419f69b6a428eaeb462b67aa40340417bdfebb6039aab8242e39f6c11ec136d73fb315cf71414a2a1203af08fdee34ed0072c27462395815f7779012a41ec526be53da954e1f7a7ebbb68feb15cbaea8add6cd0f2fe3d3615991ab54f4c7884e8a80a9535f13be2ed944b3bb315de8af2a70439294cd53f041f41d3562be840c78efcb08661b1731feec46a9091ecede3a9fbc2dae42c72ebdd84308e95644373595db62157dba7dbf124bb45de6c2837b0066673bfd215ff915a8d41637eeb029c345e444251ecbbcdf79e246a80aa4591976a00da06c759c6160ed1986f8e15a562417da55109174628e7b11d49586882851205755b4f99a875ab3599fdcc094e4a2164e1764d24de805fd7b20efef2a8e23fea4e206dfa1fd9c31d90c1fecf745d3eb886190827d952703aa6a99b5000d8ee9d51de94a82dd053b6aa89cd7e94e92d4aa93a9224d3f688b5c834a53f2993638166a3de78aba7cb930cc5845f9915e6523683715a187e940fa2a978b5ca4c3b80db62e96a600f1864bf0b1aac23b1330b13eadd3a2f07ce7181d0a9497c455d228278e5cc3e4c00a2ea3eb8e5b9ce2799256302b0f8f1f829d3a3ae8aa7cc4ea229c5af476c01b8d48a9f6987df57c3469b6ef6dfcb488a3d5b91fe17b5798fe154ab8399a2e75f0d15b2a6aa91302056266b22a38a604edc374e2d2155abca119c11dc6827a47e3cee7032f6e0f59708dface221e47041cffc59ce0334d9b7c5e91c2c320a70ec2f32906624128363c893909f47bd970df652d5e6c2324033f32b1653a039f8c051d9dc8f839c50f5696e9e08f7f1cdac4750b429af03176ff6e643eca1d8fc710c6cdb0d26074d85316f4c9084d5f453f6d36c1cea0e389f3462e1478e2503c1db99fc46f3f0627f173672c21f3cc3b483998192e81efa689819d0007762adbd141a058587e030a3568e412d25662c40acdafc3c6ee30c10cc23e3ddedb6c73085c90c89b1218d67a328f06c3637a786d4715cb9f9d8b0b22d920b68b0557cc80a56fce0b6e2d6627de576e308757a8f37821898e96785ae323e413d3572205b0a5710143a2621c258c76c7c3ff7100a2fcae99c84d1ab1cecf7fc5b1e4698bfa3ba2a0856a65f2d4f291a4a164c0381d70d1213f7e40fc4ba42c43ea8e70043e27c5ab0827559b7cf7f2587d0d2f93c6382cf54e92764d815280d68c554e5b6fbb351bd18635786299dde39fcaf3efa708a3f18701eda1579bfb0bee4fa1f1ed6e09d450d427e4b91f4552f87f31f06f109e74af4bf301481452aafa2146f6375da467ea008bafc3c8408aadd61b07c28c55249ec0c8bfdb00ea", + "signing_randomness": "4847d6414be08bc04dceab0860a93a697d941eaabbd52a6dff6fc4ea33d4b60d", + "sha3_256_hash_of_signature": "2c2521643c48d1bfa0da262ed9065a80f6e80cd9ad1aa73f0bc867958388e754" + }, + { + "key_generation_seed": "9d89b9a327df0d341cd2968ba9218bbc3e934502cd88919d8bb16dd3d39febf7", + "sha3_256_hash_of_verification_key": "5df31a04ab9735734fd46e0f2797203ccb8d5f48c41ba691d9bc9cff3f7ce719", + "sha3_256_hash_of_signing_key": "2e7b55ecbd6dd0bc9104ad4a2ad6372655621ba9861d0a132626bda8fb9bd055", + "message": "02c7c4451da90503c43fded1ccb3dee468a6a8d9e56670cd8f6a58e7941f1bc5efa6e2afdc0141a2f7e8f781d79e70b4813263a9dbc8d8a67f89371cfbd90977ec96461b28bee4c644f2c91e96257b1909b84ecb25cf438a3fd6b835e20d5cda56a1fb7995fcaa0ee1b5327fb1288e3c57cbef0554ca5ad6fcd1f1865c6aec6cbdb24495700ab5aaf078d8516ca4fa3a231a97c77bd150b127cdbfb42c03702c9027b2a5f6594b022ef55b63bf3eec27eb0e9529eccdc82bc6ad1f011f167d602ef1f175da5db4028bf08a053af2c728ade93b37edc2a75b7b6c6cf38cd1c07f359c73b131b13df76139dee6795f1d85b47f29ae97d0e40cf5dbb67360044f78940a1e80d9d99fd5ab0185210d8769911bc471650df0fcb9c3af038f7882f677790e146e612fcdd6fb89f90b7e5e46cd648f4bf8f736d69f8a91e4806346b4366fd48d1481c0b47add82003310b0a99b779d63ede1771f50221651b2d8af40f48b92ee1327c85a1d2ef2d86378076beb58556fcaec6029649a0ea5fde517a85d87704210e071fcb6f63317aeac3eb3e9746018e1028c50c790a45b1beda6eea2d646dce401ad5d7850a5f69cd85301920de77ab0d01b1361efa3e70ac05881bc02190720acc75a691d6064f9d24c79dc72476309e58cddf5fb2a253d857a79c8e898ab6adc300eaaf208820cb02f5f2cd317f4052d40de28e52c55a0349dd855d64e8da8296d4f572281e221a3d27ef76fee67fbe5484e6460c99950763b801fce828e93d2a633a1ca5d7ec582d7c463da5a9aa8056bb2173306f3820bd0a3273742789b61af89ccc42b81cc68745800d2a59231d5d28e832f443a871de5b6b10b58a8aa7cc9816014d7f3545ddf1f481b7f0c9dd41b4d96e5db767b74776c2253fa230df65f3e0b944b95ecd4138e2847418b084d9f9e0798cb5247238ec12b88c10a5c0c645e1d09d09059c72e33c28a472fdd8b88eaa93c63be7d980a12195c2ec3105df2bb81cc9c3009f7771b6b813cd12303e3a9961d6731af55ecfe5127bac68d06f835dd5f2d584fc0e648c3a4256e2a3d4b81966010964657f33d1fe0400724c488d5aacf9f2c0b802cd812c8452e5b8e2b17ff4a1289d33fc405f5db4ecab4a73fca3634756dfbf9012c413b6f64788fd0f68f8ab7620477acd3c14009377f3dd54b9eaf2784433d63341323f54d113fd63d7456afef885f13c13172a37a5dc82336b9515f8f7f4903ef6dbe9cb34930743b6ed11265cf94aaf406dea9802d17bcb369ad0d9964792f74d338dafe47ee88b3b74eba8e70774edc1f16fa876fd62b0bff880ce252ee4435b1debf36f0a06a4fb406f01d618c135e6103e2a39f4c9cf41ec93702ba76ba753ab49b5836c20f67d05943edddf47ab8c5b81f4bc22d773305076f7e5b697a7b25b016190072f756f19f397884e0521595326ca591672684a3be17c9f5cc8e8f4848f7136762178fbdcc7bc6a6c6a31345fee687b0505f72bf1ab7eb87bfe5f896cfd42dd67a239c70648b39bc0c84da33ca17838fb4213c38b68f22914fec3dc50194e883720719e9b5f8d037debb726dbd899abd97853c54b0bc347a322bfaf961c6cd6209c98aa81b8e2595fc151b1375bf4fca2dff49df40a3d1c694edff6e9687e73ef62dd42ad7a05195a7f206f097196aa0e4d68f8132d4a00ceded940c4f6ae02e6d3763073462c7a4bb11778290e744471ec554a05917e52c5263ff02c07bee055234eee10b79175dc164ab2051b03598df1d4311e87acf4aec45c55b1a58b0f05ebdabe248a27c0187643cb8f9529d31fe0ac4a28d780196da00dacff5f2dd64fb04e7c159dbbcdd3343bcb7ae188de15d923d2ac0af232c5389dc9c949fce554f7a0425d4f9b28df2ee4b81740c2b5a5b93f0f7ab75ebd360cbc78b11c28608b5bafc970cf3d4455a20a198392d876edcf89e2639b50cd84ae21bd50fb077050ebffb210be711d8ea807ca66493650e909911fd3cad99ab94b2ab2edff192d9d75257818272e147a9c54e06c53210fc091bf4175f2f44423669716fd9a6c4f96a0c4be17839769a806453e55d7357fbfb3d7a458e70957d524c0e896398e135bfa68a0cc136fb93ee7d30ad463e32e152fc32cb8e7f0b05a30eb13c0df98bc187ec0a54856d2efcda10a82b89dc8cd21c67d9b6df3d7005ef3b2bc9dcd5d55b64db40b74fd322cdf9d9911a00b5a02e1ad5ca9bf65d90db709fc1e5fc84be97574b09c83b49963a51228a667bbd84bfd8e0d90ec161fe5ca73bcb8d95fd7afd982ab7ebab51bd2b24cd6d356eb850d2c65593313d8ebb97e7dfa450ae982918582f86a356f538eb05afd460566d79f040d36c93d3c645b636560007d51b121de3fafb3ed70b475aff9617da4b52937c628678b109c3b76bc15bd02b766a394893d8ec966dfd8033d12a8d98ac5be201134325e32cb6786f4faecd7dcd05aef5f3739122b817824a672e71deb312cb7dd6a77116b30715076384297b1962efdfee6d6d2b2ed2ea4dd802f4784872d825db828557d4d927b7232682ad91cec3e508854f529853a8797b7bf7bff8e3c180980ddf4081e96a12a495acde0c73282ac78617c68a55a94573e5a37b859858d1e19adc82821b316b9d346ecfc6dbffb3779f692a62d20d1bc4e730fde2aee826e76638ade3dfaa11057b0bc8a80e8905b15e41d9a4105109f18e7e1362149ae9c568d1d642d65b94253be2b13e7230f8bcf34dc87241d1de72a65bba111c111cbf5bd618cd02e0a06e37f60b3736631073a6be004c1ad5f0091a82c87b276f7c5aaf6938c886a6039df23482e2064f6af05636b4c6ba6b24a29aaf2174af4bd959177203ae9b160f81ca6764948afcdacf6bec0b987c6dbe178dcf47c137c64809483019c5f2072d0301c19c500c60b5ca913c24a8f28f50e1578d806ff9f9b810ca14bf5f2268fa18dec67d973eb1d975aaf871abc980d06222493d900cebd8811fa20d5db8f8036430f8bd7f9554f7cb47f9ebf389f66c3ccf9f42db57affee074ffee4eb3e11612fd8a8fe02cc4e9d2f8bb36c505cece9dc87512aeb5d8ebe33328c5217ccaf2e1af1e38bfa84c0035decd8d8c250fb4d964e8f0ae448aab740d9ee9d794390686fe9a95183f0d5166d479c51014f1f29d8fec616e1a4e7a9c86e2af790bc7bd7bb6f746a2266332e04affbe6b9512e6620681c3317dc846e4fd7974e8ae87e370ecf9dfed574e339cd7e8a663ecd1a7bf5842391913d98686f7f2145bbc420f2f58b89131d5f3be41c85752e13504bcc549a8f690cd2b0e1e29e4dfa3cc76bd398bbf28f33a00c3915dd719f7cb985e9a0a7cc8190bffc8bf47310c71418d7a6c629c491eb8e455148bd4438ba6b7014608b0ce6a1bc5b035bc174c9bffd966d8305fe9e5619bca3fe4b39e6732dc652531819ac828f86ea11360678e786eaa741382d713ae26a608d582a3e4583d45744acedd32670b5ad4a1310301b28a174dc9858a55f0c1b7486cd66cb0635083b0c63016e40dfc533ab80c9cfaf1378d00769dcbad56b09da3a4e6cdbfd8f3fcb951680020dca58647665462e42f42dc14e7b20f262d3ceb0b1a2ba807b98d66232ad7d3839c298564bc36a134cc2447b1b9fe69271960459c0a6f897c1878140690da7d41fd8aaa05a679fdc3037eb2885ad3c82374f4bb991745351292dfd8e54f565e0093776b7ea65ddcd500beb4d15af6029f2630a0062f2d4fb331b47b6a5e139d385016e1fa490eaa209636b1383b7d7dc1148f07ed2cc2c03fa7fee09305f34c57b3ce899c18462b4f1ef88c1ac5259440aab48c5849652aad9d3cf3d31f36c7f64f918868182d36345ba5bb7a4ee088d8b081eb78fe977f5a5295177aa427215bb26d1de33ad4b2d610a47f8c672eeda703a04d0fae4c5961f13ad6fca81863d8a394135565d8b27904a511fd0621a532f84a47ccf4fcc2114d4c369b7a76822959f8caa25a6495081ca9ec3ac3348a981618592c090b6439cda2fbc932c8697b3709323e3388af8efa1b9cdbd65a65c8f0c302330ddbd10e0235f8030562452ede447ee5a5a9a636af6f615b1210aa7cbe69572b3467b643bc5f5ec3f9ad15b3ad918993355e209acbd0f1393076da3b0950803295b6571e476acaa04d48a4627367cb7faa83796c4178ca9071dccb8d3ea70381b61f0c56d515e0a765e266dacb13056317ad8737a1ad541aaccea1641946e331229f19bb54c20bd51e63d63bffa13110a552fd0a95ab984ef53bd639efa0568c6875b2798e3a0578c940c0c4197d3587bcb1cc45a99f5d37b1612dc1a4178a3e288fbd79ddacd049159d6a5416f9ef3f38c74449bfb2e6a894566c5c17b4555e154f29a93241463690", + "signing_randomness": "31b225a35a621b7cc7fb412b79f84624fb7278d5450074cb3e1cf467b589e64f", + "sha3_256_hash_of_signature": "b4c57615a3bf964125e09c580a42aec44d9c5c573811ba426262f4d9f0ebf5f6" + }, + { + "key_generation_seed": "4544c2f21054605b0eee46f62a87dfcbc3bfec473b9850886266f478bf9e33d7", + "sha3_256_hash_of_verification_key": "bb481b212ad8dc01cfb6ca605839c0d58a4c4ca8658aaf747fa4eeee72e7a7af", + "sha3_256_hash_of_signing_key": "d99157f7407370a86d9ae4fe5d6876ca9e31bd5798e1906dfa8973fc8c9b74fa", + "message": "e13692e3cc06ebe8ff9a292d890f0a34dfe9a4f968f196b475ac4df553a30e2fd5df008df4d7508302aaf6389b6a5a9135e9bc8a5accd2bd2df98ff662b763101d31e24e8f182fa50840be27f76ba5ed645bb4d3f7f2f6ce25179a47fd7b6441a9b3a28783ceedb425b2912734a75d7d03811172188253bd8f0f52eaee84a9fb025f95ea1b566c53297a6a090f7fd8b21639523e073adaa750d63da61631f933fedffb2819e0eb3074e9e11e10b102ac88e2c8d6cf408fd241ad301f9b8e18a88b74cb4b0dac76347635dfbb3eecfdf84229babcc003c6e4efb7394e25667dd7fa47d36e027559f53e98789e6e732e6aa23a71607677fb975c2852367c5ba5e3d10b3017ad26f9a38ce803929d08a43646ffbc3980b359d8bc2e9615636d4e5de8de6fb2465a983eb1696e98dd33faeb7af8c2d30506b22390d7f9fc21c7a016fdf22d21ed2ea4175fe9f5f44598ec26452700dc9a495675431e1236865f2f4aa5bc9c9a10eee9e29b1fc4fefcf8f24bf94342fc7e19aa6534c3b771d910aa419ea2bf70e2c1915891cc630a3397551e4f34bd2192b70eb210ea67cf152a35a3f5d0878e153579b42afafe5068b2be2b48127ffb54553b7a9b6f845e7d72c43938ae42bc03e33b836ab212909510aae7dbe8ee6d0eb8ad84d60832f3151273a1e09c514c3aa4cacd15564643f4255f36059022b91ba4137ecd97b34be3308d40ef06bcf4f45ec625b54c7347f52a21815508199c8b7a6212779cd171894da9fc3de2a6ef5d76bfe03b8199ed1dc92b2a403e4da009cbc0fb597c5952be32579eb8e781eb12d935848c051029c528cbb68cbc1de0102b42561e21f48e72e028c2cd8816a9027914571b49d2f94c9189e1a7f18d7d3d0a09b3a36edb8a084ace5fccc77e3e42eda0fbab8c81eaf170103ca757981839c9448362bcaaaa3f20c8dc653aef36953559f3597e1915f02a8d33d0e46201fc794ee055e6d9955b91fc7aba1f136c280367404725cb355fc2f129413581401f98236d2a6f8bed7fdd7ea99060dabe3f0e8ce20b0e98ea80994d1673e8ccc6a0ba4a9d544f3d31bd95c9d3847527a978c1f155efd84b6a7becfb749628ce82e80285fc7272ea05f953404e437ad557f38fd9bbf77a69b81e4441605b23f2aaedb00c7519d8e9cb4cae5f8c3fa74faabf6c12595ba045f647aba7168c65c8a6006733d1341435495c7088c3361b50c43787ec24c24f57323466b5c088e8097b44666453010da38ad65b426e72140af78a5448b2f93df3820f013fb9dcac49604c86f2b2e4ea565463917285f148e8bfa9e11943ad3b86b14ed59a190cae097db26daf8fd2a642676a37dd90c23b52c82ce028b80a805d9ba05457f7b6cbaecba4094822e16c14d6e2291b731d581b12fb16802653360aaa6a7989d61c80debfcce81a36d9ecc84039c4f086a5579d36ff5d0cbe61292e4fc3d14277af380a9c1dbf36c2d61f59cfc0d62524e042710bff5ba719e56ba367ffe849d660b9f7f3b638e113bf2e1a4db1b8f65a0fd680bb2a168a4fd5b4e0edf3208ad47f1ff4afbaa726e38763cb5c84c03da3d1e32cba873b9a0c750922cd3d0a10a4877eafef602f5c875fbf0ee2f4f0af7f308ef934f7e8e74fda62a860bb594fd061d1b2bb32ba613339042fd90e749acef450d204072acf58b18c365e4f4b815f1e837453c4255d53bb68d50f3677e7173fcc23d2b592149a9f3dd615868af91f705387547862d34553fd45b8df643f596dfdb7aba47bd5d91445826c86fd4d30365a2f9a3cc0913de19707d072f27a09eab906304008875b5be3526210d6b8bc8663975a1f78eab9cd7f7305cdd4c00d6277622e50606e1cadd639730101d088bc2bab295ad86ba8e26f5ebcb3e9c7c543e533a7b3c20f0f89001775f714825dc8547bab06f5b99c5305ef18372a184569323fe269d45b669b9a222c9defbb0b2c84f42a57ef343a5c12f5712eec33985df8f0c566d471a9403fc103a3eeed42829d8e3e5c517bde29447841ce96c8ac587df3e4b6227fab386140db0112ed0d2846355c4a45e94f3a0718ceec13fd3caaeefdf0b7f89f502aacf8c9d96d01b5549157b7df2be65bc30c889e69971700286c561df91c8cb923001e5f0e21d2c7a3dfe8d1af07fece1eda20c031b29a4389f265d2c7be64ec37b2884849ef30fc8a82d2f766ace68c72f0a4b72f3b50884749814387893db2370a3410f794c64cd24bf0d13e44ad500ba9816f9baed72f7593f758592c2e974d1207a664b869130baa1fa71dbc55875134e7cfa276e36568f79483886099a1070c14c6e4eb87523e04c0154a2250624261211723453cfad185298de06d08cc25fa18bc58b34ecdf5d9dbb02541bab4a2af110ae09130e12439f1cecc34f9ab5d7be36c827a6f2f6708b543d4ad2e424805e2a74895742b0a5da30cabe4ab45f40cbfccbeebdab9b8eb8f78781168b5bc79e04effe1757ab0547b9bd0d2625673ce528d2b4874d46df0e09c24fc413ef9ab4c3d2e803c1e316d77ff5de3368bb925b2b1f6ffc340525663931f5595c8aaaf9fb0dccdfa4793519a66d4fde38bd2044c60fd1de15d60ba878fda570e7aef6db69d2527a1f1481a9d05ff2f6f621238939acf5d2c37b2bc3a194a9e65e7441764a5ee37b1fef3b8c9c425be1b5ff0d05bcb6a3b91876ec04ed89a31749fd443c2b85f8f388e7070d77dee37e2b666628cc9a961236dd24af2769c1f613b4e77f8e82d1f410ed59f63f1df19bc53a448106de4f8efb8cc37e40144b0f658a4135e25a3cf36d8692def2677e4bea3a9770f19e44d55080625421d5badebef3b39be71c08650b5718a9b2fcefc4becb26c4b63c43f6557dd66517d103907f82f9c2b965b7c5e36059d2159183f5acb8b5ff5e6b92e94d53ab25ae955424e80edec4650be293e836da6148392c500ff4b7672932e90e068569b81ae335b2e5013ccc95f571948d58127eb1269a08d6e897d2d9b60f3e49847c05d0b3ac230a67eb6d38ffdbd4b8d82d7b9ec803429c701f080be86faa165c0111131712db4957fd84a8936ab55558c69d33d5890cadd08d7f0d4962cf9e2f69c7517e79db14b76e6e188f5ed95169a2a7e4c0ebc2175ec2dd44abcf239ceb3e22f955ed25da41768ca5fd9a9ae15faaafeb431958a679249ab8bf879185e8fbf9986b96a92972153b4cd0d1be001e5afae3ad1f0b1191f1483738e728d4ad240538e5ef7bc9ba4d5903929d74cb64241306fdbaaae17b1c3134aed2cc394d3ef9653cc62a29c4b0b9be04e95e072ec98f7a80a7b575ded4a1993aa884c1edffe056ec475d934b4eb0ebf418975728c6e9cb3919b2b67d2c71228a4df1fe2c8388e3a2bdd75549417fe795f1947f857b1c0c9ca021515fd4d79e691493b988080943c394bf29e4190082a94f224afde5853323ea51c06b41547eec0da5cc202a048d77c7b91e794c51e72b02ea7c14578c11d9df48e099465783e496029ebb6d42d9caa52902a4694355db01dd7f5d7c113ae06e3f712fa577e937cd4fb817659f93964e194fe7d509a81c258c69c3415a8f11d35b414339fd1cc1d4f50665d9111592d1c3a3d69fcf6a971c285a94f5ffbfe8d2fd2746dceb3b218d970d670d10135126e479d92000d41eabdeea4c04d1748a4908dd39c60a52aa5fe29c8aced50dc1295b5c2c4a98e3c62ee4f370f4d3e500fe27b66f65bae604fd558d66b7f09ce36c36c8b5b4fed193ef56d1d8df0fe6fe0031466a1c633203966fe83d6bff843657dc0af176aa8d5cb7312cb4e072bcff24d5f3828e29b2037e8d1fb63537c70c27011e9a97e3f04895f4e84ac69c55d450b46d5792a5d790557be64f765fa243afa98527b976783e7acdf76a7e1dcbda72431fc30d7b05197478d8d74077626ff7409f95b24a1f1bb6b803b9f1b9ad5b06883fae6c4b587c309a63f3b2fc9619032157b98c1da9608107e87f4fee0dae995ab86ac9869446cde92441f0b9f8240e6f7f7aa9189d92b7faa3280fa749ba8c7729f8974049c5cbcb8c6650cf1c16b8194c7ae1a82b40b8b04488fcc69e674362fe4821d4c1846cd9bc49234bcc464013f5f9a082fb83d63098c331d4b1c9129f52259ccaf4a9237f8ec5bccf06f230c08ddaf1d0c21c5930f55d3d5f60cbfc447e7fcbc75cd199733f8d17bd043b67b0c138cb0c9c8f2e477728f27dee573796f71b013689b537aead4991e67f2f5eb94bfad9509d7c235c9e55f68f26b9ce8aa90834d170f8b700a40ae9a817d5d17b1644d25bcf1172a5cf0c755a6ec04fafc39db06aaa05f5988e187b9e110eedea9c84b99ad29a4b31950f2c870a1f91daa6a5817faeae516fa42660fcf56000f7365d8c6cc11d4784c6fc02e4d0c727806e9d43b957bba124c980c31f81facc6d46f6c38d227eef8f0", + "signing_randomness": "6df6d37e181d0f28606b9b1180547a805bdfe075eb51c4ad47de897b89a29a43", + "sha3_256_hash_of_signature": "5acdb157f19f0a9a1baf48746f5f3c13ded96bb6f17068f439509ef20b326c08" + }, + { + "key_generation_seed": "d9931e321732bd82ec9ca1df12ba48549bfc7d3e76a404b71892f4198777ffbb", + "sha3_256_hash_of_verification_key": "6a3918e5f82591b42eed35bed2ad08e18fc149f9b59a86bb0d4b2c4049b80425", + "sha3_256_hash_of_signing_key": "ae662a624ef494a2ed8988df6331de7e191a4dad0785de5fc669f81bea728f4e", + "message": "1f7ab96e8c14d1a5094672d7034fa8f81703a2cc18983c972cc66736cd98b031ac8a479ced21a1f634938df85f3e83161646db81b9ac3ea22f80980b8e2eba4e9975714e5a98985817f426c41f3968349686b69af917564a2648401b8fa127fc3200dc16a9e663d1d345ea83131e21229dd39e70d7270de7577a7e9635602fd2c30efaf204a9234f0a73d21375658b0b0b04927e67f3f5534614edf5137badfed914a49aa301000092da93b3fa4a0ff592cc3a53f4a75b54fee775efa421eefcd6e0d32fb5cdc096886076da940b26c6e07f12f6e08fa7b3e2dc42055308e5607a2732717ae592a6909c6e084252a5b08685fe8c6c1da387b0aa9800b67cdb3ee2fb21b9be5e6b79ab545563068441c0c9c1e68cef6028a5cedf27d3ca47d95094c9e1e68b8449758be3ff8fde148abc420295dc76e3eba8e11433217fdc3136551a5a41c1c7e7d6ef43601946897fda54842d8f73faa7eb7ed0de544fef2a95c6fecb13c8c0f14b5b22493f54374184b73d5bd47383bbc5dd7bc1beac0cb8e66d2f413a9dceb7e1d0ee2d63b9eb28db232c33a95b792ae67d2591f5af59ddc45771a0e7195c4d25e7f4079359597678b0c0a87df3d66a686a9215dd566d4722c212ad05a23e1377e37e18a6ab3ab8bf5cd47bf1baf06eb05e4c150ca67d7e52bd297a08cfc97b575752e686b83575f425f3a450bb0f596a60e41f7183f463007fd019ee255bdef1d98b7a0a12ec33b3e2bc9bf0cc8f4860debcfbbd5e40b2adc2cd10ec35a341be7a49f8d204fdae86921b7de5ba700a61e2b041a8ea7040acee844892e5cf025ffec5322ff6d765bff1107c967a12eccb0489f64f8c13bd7057df76485446641aa7a560c7e73008c46572628e1a225a8d3f6d68ddc9759a952fc07cd43de4434bd3391089e900275e9ebc92563ac1403bb7dfdd182092130e3e6aeb7b666f4ba66c38bbe1f726f40a07df6c42079a6054399519e26d765ca065f4ddfd27a29cba292699cd826fa9d3e7ee31b0d76813879db5ec5c7f454095dc3bd27323dabd2dff949ac760d6137334507816330fa67d886021661adc69aebd882a07e01b4b6e5492399ecdea99222ee785c810b30409dfaf2a3ce5a05d699c2368249c9588d86feaa778b4860d6dd442088a21d2d9d0b49b15ec579776812af8ad582f1c44bb6432d7472300b5440a382ed87ab64b20373a0abdbce391d0bffc9c543ec686449fca9d04b7141836a416720bdff250a06d7651a1f98eabe4b340b2303591d0847aed6ffe423b6dd8c0c03459c381db506f531343f82c116323899df1e5d8db8997bec12eb70103f0bf2b3d53c4d4694052606ee32be4f5b35450358d7d85062dcf7f0bdb51364700baf92cd6ace4e2c10e6cd9a332716f5f4bf7598466a99238357798a499c9b8be77690635c57e7d87a904b3f2278c0b1b23e5860b0532f152e1626c86fd855f656b5d070bc81ce4634a87c8ea6d6a433c02dd2e6d6561b25968b149a6f3bba40b749f188b84314b5778a000cae91a53d59860ee6f7df38ca0935cd64c08a34bf19981c17951b9c39a847d0637441452e38ce5e1d9b99bed51b86705cebb8d3244c40bb8d70f846936a2be29c21604a7e6bd3e655022b929954f6c9a5743f5fc2127b49956d80128dd582ceaa06fc174813e5f5e6a0a4d7d26756fb28a6588e9410722591cce2a6c6ed0976b98e1fb0c642d5df8f08e96bae1fe10375fa1d7c70806101570fef1ebc8f58664281e2b61df2081b655013aef54616308504f5f4a1e8f156680163489d3fe7bb0a514f1d2d57ee6302853d7d03c767c7bdfb79e2b8c80403f26f6edbdd6a890a0a0b9b76d334e0f729ff9c47bfe960a1c3faf77e81b9ac156367423dbb4d766a1f3b1e67595effd76287f22bc37da4f0204633e804002eb7c1ad0836fa4d01e2fcdeab8457dfc3d8b7f1151bef3574f8f4653aa3780003787b8891901abc8250a974c15f2dddf9e1be6798647eed710d06cc3fb4c276bffa585680fc632d8efd1614745bc3c72b82c53feae935ea5014e2b321f69badf570fad878c9590fd20fb7bf1b31e373da93d1a8c63ea45e698ce060fe70aba0fa84f37e836f2ad2998f07101d3fc7ca2b08b1398e1687ed5a8ce860ef9b4889ff436b74d13281d1f6a7edf1dbe8989bfaeefe6a475e65217643e757006871e664099f5b3846553603cd9eef8fc195807361fbfdeb8dee6a0b79f009c10df397ffb865f4ebd0473d458d553358029c6b5a95d6ffee9b645311d10a8f479b7e5249aa87e3ded08311b4ddf3a458fe61ae294a22643861826acbbc9b0ea8b73157ce15d1ff35098ae67159b07ca7499398c26776dd9884b5d3786c87d48e864d8bbe2b73e2890f217e135bfdfc4dc5e805d9cefef5268e33db611aba6a5d57ec82b7246a63dcf3eaf3a51cf503d65c206d2362421de774158aeaffee45a6b5ad5cc0b1de0e2ea74e97913729a69e9c00a309ddceb7738baf4757ea9cc96e055bbdf692b12d8b01b92ce5ecf3d52187402cb7fd961a2672dc1875b6ea22ad7f5f42b1b52ba2d780f2e6c5b25fc7e30b1b663e3a09c8ff0b5c302e0e7f984ddcc62dda65fd996e17da72f02a16c354bbdad44c5b5044759bd53789b98bc58cc25fcdf10a9cbbf0fd6abd58a4cedd92c5d85ef22b3c5ee5d9440ce42995517d2f7352ce997f51a36b9fa5703b4c6491ad01f406fd1b5bf85321026d28b51354dadedf057b37743499a986469f908a01f3c1b74def5d8e2f57ed25a80720b540333109a0a65e7984b557f65429f3d3bd7ec3732a10d7af36dd5d2414a09949a0f57f37bd9021d2c482e61437cc15e9dfdd92d4c212c4fc6c22c54591e5afd48210fdc88040135e433f50e45874e0d5ee2bbc857f2c80e2fa4fc7acfec8eec0cab351f677c790787c715945c21bf923edc0a58878ae09acf5fb5a003c9c0b6e30a450ce6dad4b626108b88e89f1e6a7bb3843e1ec8aee35af69e81773cff71190f819ccf24142d60ac51b80b61019ec7ed2efb6c5f18b499fc9727bed2e3324f8b94a522092e0a98241e29f8f14c6561df3fea0824f9cb0fe10bb497e427ee62085e7aabb2900fa47bf27c1638bd116c5555c076deefe9754e8ed333d72ce9423e27ef640fd5199c0cafbcf2da1c5c34121a69e7e0deb3c268fe60c6797056383da43e6f472d225116f63124498271d3d43aadcc5871f2349ce040be068d72eb57b7827a7d9aa01405ba0ab07e684b91ef05418948f6713aef1f4948399e0e6130740cae3e481a6366295422be3ee2e892aa9fee86a6e23e2ebcbe654989fd93d1c4e7d62910e1223bd66b7c54f8dd7d373986e5d4141bf0bde98dd13aab7d598d698660f11fa4bfb0ad09d5c27b65386c8673e6c4ae9e8e30f8dd1a5a3fe557a3c29dcf99a7c376200ab595c49445e740e3daec07bc047fd6ea4fc6cfdc23d7449f9d1170fe635ca36d3de5b57f1cfb182de240cd4c1e480600c449d1a8596d8315906a53954201929e7665dd2e27d590d481dd394cf2e8ae19217f1ff0cb511def7460dc9e49c21607247857ba744b1384344b4c2d8ce987512376f66f1a279509281242a7a2a58ed500395418138abdb9c5572a258d157f4d3e88ed216bbe9cee3bd054fe61f94c59a4ad19aa62e456b86cade61622a6fea877575eeaea20c76ae8a89e7b44396bae0eeeab1c23f221a3df2b2cc683256a4e5c8207eda0b235562ad3b510f9d3fbe0b51cd8f238a0abd2ec182681606c8fd111d8ce1ec1cda6db4572303ddeb925ac1fffd75e321468266790dee6bc0e85070cee749d9e46795936324dd1388e1b11aa617500534b8daf2de12b035f73111b770f5f56f5c6a4152c45ce0e112e650faa9f3c7e59e3410745c29fa59cae5cc37fe4c6594990e50df1576b69b2b292afc58a804743f49dd7c98c1768fd19ab4213ae4fb197492af5bf7fbc6c8b507673539d8515dd527fafdd8ca3eff629caa720aa11e65922678447ad4ddf5ff943873df5203afea4130ca5f633e104ab083ec690cf092d208a98006e91bc7e33731d18e592869e564e6d3ff8bbbbb9837ffc1f1b92de0f5dd4a029c51e3f64592cac3de1b4ca5414f894b7b0b7d73d6bf1da4b908aceab47771da56a8b0536301fc5fd270caa55ce171332f7db2eb4619c4b2c1971ebc0ab8b0b11fd54c24285da8428ab9e0150d8897216b133ed554de8cee532024df8b8d9314d7c9a3ec60464f9c7bca8c3d4fba23a7b543ac111aba8c8f1bd54a243d565dc062f84cccedb0a03375fdfbcef8ad8cafc440d3e6f988dc607ecb947673dec4ad48724c91a6be22a0027e42af6d94d26d188d0b7b3a5af012880fc0105dd2f11171742321dd41a0401415c58ad4dc445642a2cbb466788f54d270bd8df25602b298b62b6d0fa3ada97008a99b73a807092f8957f17eead9d53b1128fbef1defcbc607ea92afbd353e95f52d33ab7c1ebe2", + "signing_randomness": "798a5665ddaf05bb01749ff874f94e9d7064911360c455e47054436ae1bba8a7", + "sha3_256_hash_of_signature": "35c86c71dc2a0fe0f8e8d7e036440c8e862aa4f41a8068e0c648dcdb7884d8cb" + }, + { + "key_generation_seed": "f838451e4a5929b8bae9084b40b1dc0edfb76a9354bf27f981960c88b0ba3a11", + "sha3_256_hash_of_verification_key": "b72d2e09b33cc9c250e847936d3287c5cae8c060ffb41aa58a517ff87760bf97", + "sha3_256_hash_of_signing_key": "0875f7872dfc6948864e9b9b1c110375fcdcd2713e14c92abba85133351da06d", + "message": "de897f02ae7292abafa6a0cad52929113410f2ba972b4184e894c4d31081420751560956f49ce2b772635625afc3ca6698fbfde4d0a05ef243df190ba1ce780eb572590e01e6e283e1963f2b0722b0ceb365552f65bd405f1a284ddbed07ba61c4453d30cc28c83e41590e09d7bb6932d231285205d61332fa9263b8a2d3d7f7fa20f521ca4b49f249896780e08c2dc41669bf0777278f87bb1f72cddf4b998062b1642791f81ad474d6d8f963dcb4458ce11108544c41cdf19145b77038c7e8adcd6501508c53b25be6e787313018620d1ba647cca4a5a8399e11815eaecec6ae66dbc576699bb0ab44de111ab6f252256389efdc0546e641de87fd6a3a724716257a9174f39542539a593864441eb79d499fcdf2f1d053cebb3a1fcc09419d2c553c2265b3dc3943e0341bb49130e9981ec59945fa0b23e9dbdbf352aba0d925c4333f2ee1f2c83c847efa78bb13263b893d7cae029bf08cea2a5d1b5b997e403a489c6d9a124fb8386fe58c2476894e7754b8e5a162102a119482b5e59f8d89c8b1dea70b6c80641c77bfd12d45c5b3ce0021ee500a1665abcf740794e0d3e7e8cb5804a1e0d0c81a107dee80bf63bff8ce2ee2dd602df279de39c579b417a758356d2b48b41e83495dee9adfe4506e03f19dd096e81405264d408b2fbcdbf41db5ced6fbdc2645dbefe5bd038382993970c7686dba3fedc24e1f91ba4b6cf70b2e832b97be24b6393273a519db0b4446e98d77e86ccacfbeccb18939013c66f7a29b10de2e88fcfaef656b858b7dfacc4f21ef5f328c0ef604fedd993510ba40530b79525fe8d336def0e5c303539e664a9360edad7268f70df4de199ab3f70eb2ba65e2752bf5fdb1e853e6f4efcafbb31d8cc23155413be31082da958b01682894a9057cab66d4d64a6f3b1d81c5b75815a3e0caf6486b17339174276a84e11c117b060302dc2ee06a03c0e15395c0dd32661638f059a385578c1b792349a41c511d12ac7185b060a831ee296e6626459c2750faf3afb579f6f6836d566c00c979b5130e8e50431e914834cbb3d26f6e5ba50bcf05d50f699faf10767aa2831c3557a53af14bfd9f23c00f76c2680c7dbf4a9b2a425e34c943228c3ebe55a0960acc757d7878f7943e2e8a1cbc8c0d2139a6a6459d3492a1a7757f71e90a58a78e0ff9b04d059c5d131f6e3c30742fde5506ae7860045a4c903de96dc43ac6a69273bf8edab7e7fafbaad9efa8fa609961502efaccde63a6d98d8d017075487c608ff701a7e3381d7a2acb134b198950ecc6970a75af5625faa4eaf968cce48ffb673f4f365802a984c609c33ba312140a60a6f0924e945d11baacfcd643c874d352a90367ea4c59b63665364832b1a9a9a01eda92c64f393c357158973fa7c6047b8b5e27eedb28e26359402b63032f8b230f5aa968272819ca486a8bafd3d66799ae951cabf04ea81e1e7e4632b915d4e8387c7d1f4fafe1c1fc8666fe0318403ea0027487e947d844a7fa28c0523a64ebd95d2a8abf6a71fefb5bc059b2cbeecd4375f3a3f109dead98539244ddcfee9e42db3abdaf943c445712ebf19508a1ffa6133c5078c1da69a32cbe729a8876c4c73cb232024a87d87fd5f9456d3d4a936cb4ce2e00ef415406d66d344000a4a95cc9651425a16021336c4beff310210324c754bbe13cd0066c507413671c80cf492b4655d898a18a2f4db5a393400c6ad821580b0712d6c919c62e87fe212260eaef6876c409fca1047a67b223e0766144f3f676f051fbe912c4ce4a9f7b85459da031ec47c621f6ef06cd1621421fa52b047b51c944dfa94807083b4ed40d533b19813477193d1e4e96c8d76a5af3100fa44a985a6513060b08a7f3848159b3cc551d43370b223037753b824a099a7c7df59305be09e2e79618c83818bd542f39380126a927190ea5536dfa63b664aa7601c6d82cddf4ce4006e1af2601ec453971828cd09c29d2f3ea6392b58d38bcf40bf6b6497f6b848cb853b187610cd23880cb09787c76087356c66565c0399be746a81753442e4aaa54e84f1d8c2ccb2d00a551e960203d61e71a72e131ed1967dd06e72c99264ef2ee5bd156fc869b5031ba23a6d354d7cec58f339f6bc2dd1c547f07aa733994860197dce5bce6024a74668ed89a2c9cafe1f78b31638c3225d96009c260fbd28c1f0423e75c9c01a0f9e62b7f265fa3817f441f56ae79ba54a0c107fd7946a2ddda60d0eae428715fe2b4ff93bef83cd10e5e17760fe028f1aac8084a43edcc12bfd3265d13fa94d9704809a50881d48f0080a976c5bf31b353b9043c0f0b69ae6f2b8badd056752f2fc9e90c4b35850c2d45b9f354b41ed7826b976528875547a0c389b83725e26c006cc8240e380e3eb554dbf2133a131743539b1d174cca6b135c59f81d499631bda4cf90ded836e8c24c074a0bcd83271309ffef320791c9030fc2b1f53fd2de870e54eba20ce9930c279b48b39cb481737f012f65933650374ba39e2222191b0e3c7db9632ce9cb077322cef97ed832ddd8aaee53c52c03d2aaf8eb5597d8d6467a406bf428e2f16462e0c0d486a1c1c7348cbbf92633ec4ffa75945025a3c92095317e32290d4cbaa6ca40f3f201975f3fc8b733d1467c094e075e8415352e3ae51a6c5169a4aa430bcd66ff39b184f5b7174042dfcc6840eef60ccdcac12d012ae4f24f7184a038d8d9964ab405366740600b98cfe2e4737c8d846fd4e9b22b5047110d85b37bdb9e7e3baf5298bbdc1050aa20f14e34dec283830f5fa9c570c22ca659c1276be8ffbc0ac3551db8488855ae7ec21e239e88a0f68227d17dd87ffa3b3d0535f9e57807755de56a65c0de9f4a79f8746b20908bf9416a86f62ee2c2545bca2d55cd4d45dcdf06dc879e1b6270a80778d0274aa658395d800eaef367df4f4d838eee0a66093e0f419b9edc5f003e31cf0eb7e1cee9accda7a2dfc920a4b5222389dbf12ad17392850c434a9b3c260159b0f52e78e7a66d28dd5b3c77662cfed2cb3dd5bc3cc26a34293ebf1fb3a9bc59bb0c104c5a9387f3893a65d145d424ce741a375f9c65e733a024e78fe274b29ff4b0eb6f21fafc31453eaf7e48fabec5711d3898b876f59952c73123281a8e85148cef5a166bf45df36053d57ae6f29d3e334bb2395fa236d4daa8a4fdf99d80a9bcdbed36154bf4fa3d463d51974032d7b88b2504317e14165b1c3fe3d8fe366fc8284321d80f9cf512f418c63f73b7c29c07870332387bbd1a870ac39485f64086006cfd68c8299347615a423736c01faef2da56cfb6fc966948649324e22d4551b9f50654ee505547f7d0b8481adf6aac3977f49d7e6ae5c4248df7b43bda7f082aacfcdcf1c1bc04f2d45f5e028498ecbca47ec4d1ddeb03a2ab27be9e4b80585145676f8ae7a5017bc5efa317a576ed6e423d5a0495b8dc619712a2c3e6162b04b9bbc7de4be6532f6c1c019e702c014c60189a2612594bcb18317804c630264d07b7396db562777bc305b885e00706ff6d0208737bd229bc7aeeff5fb770a4c057b347601f1f6c16f60d4a53a0b32631ad2d41fa307f6630228e1807d22475d5e331a50a680896dc606f3941ac08f8ba46de5a49f5ed6a94965334fdfd69c4a6c7973d9615b3fe576b15aacb9b98d9e498d2a3a89b4f8eee715ed5f29f13dde7629bb386f7cc800f16f3b5ba8bd0e14cd8d9bb0f0aa615be9d7557f6efd00f7bbef9989e7f463279408e6ad77e100ae4457d57424f2b1caef43052c5b25c896baa1c2fe67d1d6f669311f17d39460f0b176a7727f53257a36faacbf3dfe623d8f882f8ee41ba1ce387e1d1860f4babe26ed678395b9979d84dea5c7b38905d4c7fd867ed7722d066bff3a833d3282bb40d1cd310dc8dac9270a49b65b5181eb30f166caf0832a8dc56b9d135550b506d98d036be7876836aae669507990de6d03e78a38139cf64f65fb410f192e30b045c93fe259c10e0c5b56a2b5f0605da0851104c4beeb4e3b30135cae5a6c68403c63121b0993832834a3b5ebdd345c41b26dd219560b624024b8b945a10d385b3ce4e0bd54e10a64aca59d283302028a9592120d142cceb1cc30e1f96ad041f1e17bcdc3c68c2ea2e0d65d6ba3696166cb365cc461abc4d67d504e8290eb452ecb77f6d5faa5053d01317646242384c5c510bd43c5780bbd01ebc3af33d29d8a09ef39ac85e70398d2a64dffa72b3efd8d6d57aa2f9dac0cc6eeab27b69fdf2403a5fede0bfaf441619be03fde44c49ff0a34e9c37d2b9aeb726d56eb646a67bf349323f397db056d71de72a2597d780942554c8f8273e307dba6bd02e944e0559509e1f28b511bd709d03ea2451ef234df6f077e06aa01e2806d5bdf89df29f1b3d8c6d8014496ad83857f7465f1072e88709d0194733e1fc8c9f092df5b9802fd2ddda8b142217b9532d8604e2f32d06f6400025930da2be9b25529788e6bf4eb7f84c272df455ce2ada291cfdb5fe815129e4aed59625c879e99b3e3c1b6c5d7", + "signing_randomness": "dc1a7dcf4839e6c61d47317c03270ae81ce3f2bd63957688ff37326bb587f8ca", + "sha3_256_hash_of_signature": "c9b26ad620b3d3a6cb283cc6a36a7f0e2244d764dde8ebfd6c910840ee614275" + }, + { + "key_generation_seed": "8e4334b2589d0caecf0fd9ba584ea26a4123d4543a8a0fe126d4a7e07f6067af", + "sha3_256_hash_of_verification_key": "85f232ff813b8fb629cc74b11194d67951d712dcfaca0f2c79d2a067f760ef42", + "sha3_256_hash_of_signing_key": "35dd543ae0f9e18eb4349cff934d8f9ba7a19dcd35727c7c3e864b012c1b198c", + "message": "525e8b98c55864849ffc71ebc953f7a0eca6298f6aa15a83bf6923bd5921b1c86dbbfc544a39c364ef6d9281481e946c994f96829d6639727a5345560d8641e9a510f913f7fe5592c2a40cb278f5afd8d4504b5387c20945654f08168247a98f56a43a5020955f882d2d93781f4a83676b08f50341e953a5d1b67de7f6d1be3d78d5d060aa85b5ee4271763c437ccd595890dbc8fcfaf2754ae9349ba2fdf89847a15188716c0ec672887a4b9a15176ae0c5138819ca232d012be1dcffd29f677442083087c127cbd80b0d9cc0962bc8318e734910d1e2653bbf700c84bb0919e12df331ccdc7128b41f0666f6419afbadaf673be16c9177d3cf113c6488504de088149bfb83eacbbc400309b7ad753f7b2f5aa89f070c9d14c084c32df91c5f7cb6a7d869d64f4a05af80a98be7517ed784c17b0d7df96b9987b7ea7a398ce018ae6e13e1c0f7aa040ac3ffd273bb9687ad6fefdb211061a6228967e9dfef69bcc1c5d02ee56d49a93c8aad46d08322a2ca246ae8c3edc071d063ad605a97b8ae94d58e897a4a6310bcbf55b0cae1aa81769d30b46f883eaf29d4b5fea32f2dbde49360cb6235754bdc305abb5e5395360097378656e2bace675448889b0149d6086c51e9c3af07a76563164864f131cf9c0cd475cd4a58726ad237cfb76aca68032351fb24711da635871386b4bfc94b0db6d35f07d0196f75cedb92efbe7d653e0ff9326a596f9166ff6cab73125dad27f361d6122ca531d86910187e75f849edb52db26c96fdf05925dcca232480d3f979eab07cca68fc9069965d12bb666a180989ad1fbee3fe65e746c5a8f64dab2e370f0487d001121edd0d0d760531af46da65c75de11688ebf31dd2ac95c188bcfa07ea798609f3ea8e6364a43742a2825144fafc05abd17476480812eb2483734b13d075b3ee3ad510b67cf7057014351b2ce5357e3f12f43ba74ced614be3a9ac0e26763e9ac596f87ae98f72abe0de213a81a9a03e2b82f2312c1a186dfcfc3db346feb132931c793ecf837f57d8e326101f59705b77a3083e712ce347c2c29c23468b0c5857efa410197833987c61ecbc2a855ef78b3d7b1b697ab9844aad07c4b8ef666bd80daba5fcac900c5d358a11676ffc89dff4f36f29f14d9f9b854dced41ffc4b36381449d22801c19bf8e8ba1f07a1b38ffb527a34d009c4064a1e606ff2ab90ab2e05c156150ec14d7dc792578a16f46650d0abb61175d1817e2c38f109ebc01a3abb358673561691185da32eeef566c1ba1c72c1f08cd1b427b552425501b8783116f2eb0cff73c5d2def18d291c106980135821a77428fab20a935ac8b6dd8edd1a936225344eb103de0d5879cca09359b5b882291c0fb1fccf167c30dbecfc324ac315713cd10f35b72f0d4871a7cbaa2b4cc2bc2598f23da607c94a063c9e2013b0eda5f3bd5aadb2c429177a4bfd7b6181ed5f9a55c1f043da8155c9e7bebda7ea07dea49938fe07743df2295c220eb53348310842b1000b7a02ac025c3a94fa82d46ed7e2712de71b149742731ebe62e225d21a7f29d5f3a8a62b71fe16258570da412c07cecf82b2064ab5d98761c69fc5e899a8e174875b3179deaa0bf4a0261da9bf39148440dcbeb0c887e41fdf751505de79aa1f8593f45482b659f5b5f4cc3e7bfee59def49458db195a1a692b8af4aa44ccfb00b753ac761181b8aab39db82385ae776cfc585f7873613b62de55bb10a6b2f27e631ce41436c3fe390163e6f4ebd6b501519c96c06fadcac8f75920fe1435542fdf535ead6c0e3f41345996063b95a208defb6f110cc861580979bf4422ed395ca218cfc3b22c0ba8b31cb9eeeb51c3df35fece92795cafb8440f522b44e21b3a18d5cdbc296b887a4b927f36715e4ac2cab043d8b69a8704d6be24c725b0c2e814bca7b040c27fe8f4c14911051039af13f44e0485eb767f5404cfb6fd19da24d82fe24b53033c83dd8634e2e28aa330a81f14bac1c57dead7ffe39994d9d094383e14322e146a3df27a776e2f09a11ec9014c809f8e543594d6b4814918a129b36fd25015a044e04d3f081d4d201df86a0fcafbbfc695088170b8246776b6a28e59449c646d1e706cea96b12683cd3a7c60459d42989ca46694b0089cf88e9aec5e110f69fe0e3fe20d18309d1ba72a83a34813b771484505b08548fe5d376aaa0c414260ea4bce5eb81f6545cd5203026264938905be1e252574f4b4e71c6e12f99f6efd35effd64183cd0665fe89d6a357b1908e083511dce2cdf792a608044c31418c433f86719e156af3ff98d0f54ebeb9f9fbf24588a5557d310ef9d7cf5dd8a68512d8cb15114773c69d7b40c927858afc049f7c6a89841020e1c313c5c38b988ef505ebe6c15fc1d6ccd8b472f90ed64da895d06ac01bb99f455a195a670d22dbd5e3f03ac84a08831e9842a566e9785a0fd4c460c5cac154d705dce1e7fd1c45baeb23976af881cf5628f3cd92ab19bae8d45a03a859518e4a1e558fac2b48a432e46cf274e6496b63874ca4e4571132568aa43eec3d2a3948f40d327976a6d28cd816cfbeaf8fe126913384061d219f51179f679081503371ea0b6bd7e9524b0ece2573304ecb4a16eb471ca0817c0c6ede751f283aceec5a60c2796c6261ffc6226e4813241619f465dce67b38e1d5a647b079503144907307c7d6eb6e6ec1936b5c94fcc08a882b4555b19b33a9bf22384db38473a313966d157daf8aad41ef67d3a5fe723559096ab1768ff69773eb9d5c88d6f35f00dfa4473df71c7e9e35393638ded05d05c105cbf37711d38e3eee35e8cc0029b3761241fd1e56969e09e949690d4fe25735d774e777a2ca17fe058e14ae6806f611fb1e9fcd516e20499a704b67990716703a4287b50ab45d155d40edc0aaf97f5b87551c236cebe9cadd562b27957ead251f79caac6433f228b50167fb1a753306fff08b53a8a3cecc226857a321700ebe23ab4d6c35415ca79b682d6cfef6b1341e7ce00cb9870f432b63a2d9a9a43c87d28a95c514582812da37738bda6cc76142e08f69ebaa5acd0403100c2343e2fa088441e9a55c720bb509bc3600c27c1d39157e049650d1749751efe55a72349e2a5b714556ce2188ce972287be2152c7e58d3fcad43a214a4095de55cae9f627d8b9018daa01547842fa1ad14d67327cd47eb9b90cd94afdf5244de57e527f17894a410fb4210e06632e88a398400b0aa48cb3feb9a90acc668615d193d5a98158092fbb59ad2d6d4ffee433a2a6a971a228685ae5bbafb3ab28242c630af4656c5071c545618a0a765fce41b19970c2152d44c349d0cdfb29673d1a42ffec139d1c9958b0962f7b57f80cb8fe6331553b0df93da9bfc722b1c001f48ff9c0fef032610a1118ac9ebaf9202dffea605272a50a90768f031c72d570c0aa5b0d4fee4ad568895274388104c0bf88d03fadc3159d6cf28ac6a7e3e5cf6fe5c6658128cbf81456db8c29a76f9c75230f3837f1a94cb83c3aaabdf4b29c9045b45ab9552bbb6c0844bf2926267c0d74d3337249d5c9610e0f6ffd0278f12f39c48650c048d61a3fdb8e1a2e08ccca68803a55b39bd39160b0420cbeac7d8a55f571f490f694a7aa8b725ba84238ee1e711864aa1f74aff252c088e36b79b09c80278dd442eaea8c7d5833cd1baa18bdd866689e663eadd0eaa6e0c78a3e09dffe5f6f1f4003de24336586b25dc5ee45d56f31d8bb2de31b24e87172f3f1b26d400b08d50ff624e456183f269cbf06b3707260383174fda152e4d0c528a90c54114c4f278d0fb35b74dd3ecda14ee89d38e3227a7e18b068f134b22154348867a61719c926ea3320d1be0b9ed78466b2ded728ca04c15ac144185fb2f5084511a38cfd765659351ac1ac3e5f327d9f3de9b2b003758da78dfd08faef3625cedd87c8a55a3cd0257aa71b3788fd2449efd1f48948cb304468e3ca07ea7044fa185a2b91f9761c6532b9273db74c66b2de95ab19e5102cb90c719ec85671e2829b182bb6d09323248d6584f0ca67d422bcda65a0146d8df27ab4ae651706d5fa33b5bb88adc2a1a95105d55cca8439a5060d110760dee8b855d0839053be595278eae66542736d25c93d8544c6e55ed51ad6e7029c2e6d32cfa8844bc14972809e31754af84bb479c504ee77cb65ceddb6bda613feaa2ae6598d1f4975d0fcf9d9dc787eeb5c03f8b0bf438e83c38e2195ef1d35d40f5a14e194bc1bcc64d02ca722e7da28334e91fb6654d708c5b07946cdf58747086eb3ca59d095eb27f1b7e6806d3a35335b2265031a1120f28eed8b4c5d9af268502727c5d23152149c98e6970d4dcc4b9d0fecfa6a79fef82cb233e71fc8aa999df66ebf5a1db2ed1583c65803fa8958f49890d13bc05c6a991f26c31766bdef9bac601a47c8c3c5e395fd8f47e56f04439e9bc8e9b1901a529395f2d57495d70d0712881d298a60e3e013326cd56bf9f1319ea8d6a6511eeff373f081478a51e14f0aa4a33c6c5ea7816380c8984f7a5da45b0c4b6b550644e65a5b2df059ed050936fe6f073b4e8056accd3eb65a0b", + "signing_randomness": "6d3fd5876ed3c172ccb3c100d4b71d5a33bb4472e4cd328e7edebfb6dbb74d38", + "sha3_256_hash_of_signature": "b1ad5f75b37667c9a815cb2461aee5c49d302f1610f58e08deb6f4792c914b3b" + }, + { + "key_generation_seed": "37519a02e8021f2257259c0d2e499af3533c8ed8dd5bf7751cce920d79b518fa", + "sha3_256_hash_of_verification_key": "27a6cc2c42ccf258bcb80f163db40df45ad08bb4140c1e2a5c8f6d323e09744c", + "sha3_256_hash_of_signing_key": "0cc645bf984d52ceba11c058a72ac1f73087577d7d82c1dcd539489f06bdad92", + "message": "00769683fe7bfd74b3acd21af3898b74ca73dd126c8315538937cac4ef0ad4588765a26dcce1c90c559ce691e7eb3e0a497d357e1ab583c761439c0a66d1164518f01b6894067925753cc2866a91552fcd0ef029c2284c620caf364de6c56eb41ee0e4431d9be22b76451d132a3f9ad91a53449be820a7acf56f6adbc7107c7c729ec8a64fff6a24b4cf83ff4e945def336dbfea6067fccbd1cd6b5698adb1ad6df03fd0a553457b8e9feb4a1243feefc2df7f66ae3eca5bf169f7891adaea8d5c59012c7aa00a5a86b0a33d0006f8ad5a01c60abbda6d249d3fac7ebfb85103a3a747a45d0adb7def52ed3a5f1a620ee383a9c0cce1900e413fc74a7a97646111d54783928b15bca783d01efc67f49ce6f781e82d25d3f30561f507e3831cb4ea5b4a08d5489830017270b63d8298beebf48eb56bda5685d5e1e06404eb9a6c3790e9b29c99168b10badf8fdb03f3c568672773eec96428149ca272ea5a8083f8208bdce361e7d40bc4da75029d4a18b0b6ad615dbf849935d4755cffd270a52fa290811cd55bdca38ed89f0066adb9ba7f58366379ffe1caf3a9127e147c3af3dc27279391e0c09537e81e20e7b9fe4fe3da970fe50bfc96555233cc9e61d3c356aaa8eed5a8aea2327d7036ee03e7ee40aa35e9da4544b121514c261ec1cb0b2d75b1d5ce129e47f89825f69ba8254163179fc1331a917ae9c5a18556a10c5f983871b1258cb6fc8ad207f97a220c5598860b6c56f1eff09de6000241e901a89e107feec15833d34d6eb12db6b188faa0b858a5b9e32f84f783b43b6f8a3b2e4b044cff8902e1eb0c527bb4e29c92acc9dc7e0d9ac6b3a021415768b21dd9695983ee89c871c0eade0bce4fb72e682dfb5a2bb7498bf4d2c01240f67d1b62baa4e587069c16e3032114b14a1c4288febaebb4c75c3c05924a358c4bb7df95ecf81d67147fae3f605ede61b7ba164eba1ab36ece97db0ecb32a673e899b24557d8987af3adc57a9da609914c9b2d6d8ac58e5954e0db5aa9e75b444700b8f704e15a6a7bba81809fa8801c6ceb5747a44ceb8f99cfe6d8a2a03c03451e5f3d392725207f3dd28b2c00004425b7ae05fa3769183ab60857b27ab08bcc4321d293c93d1d850d4e7a81b14564d7b15ac0e3bc1bfe0561622c6aa06923eefe163629ede8ba1732dbfcad52d3baa6e11e569ea790b36a8472b2ca37bd5c0edd37d8f164b874952d00d592fb705c6b3110a12b03829c157191d33c579593e7828cda5c24a284ba2f5a42f0bfa601a8f6d3db1ca6d703ecbd261629c9f96ebc0458737b9951219e5b1f86192e2a85b47d80610a0acc8b1a70db2916f89cdb2c7f8943471ddbabd2a3536c5dc8a73cdeddeaaedc86fa148d2ee479f8465558852fcbea0dd8017f1b976281a5014319c2c3caccbf571d9550215b24134f6daef32716802e7945cb3f97afc1ab1da17d0c41b545a750ef345a6f88ad5ff52d512afa6558335b5eb8979d8e6dc1da562bb997e7d152d9fa3eaa09119c3474e11218230d8a56c19ad87fde483fbd6ddde9acba813bebc8505a323c601e5b5251650dae9334562e3dcc38a28bd7ded6942d0cc2014235c1b66cf4a57ba3010b83cc7050309f57a27207512d195d070db3d10ffcbacdb47e4231142bae588f92c5b0a71abd67ca9390c2e05fd2cf7a1fabb14c5a7ae3773c66db1f055214479e388b5e6abf0df8fd1b0e4f90828acc397643cbc274143fb4331262a20634877be4c7489c1ae9eaf90bb2a177a6b5ac15cbda27da0616e5f87461554f5686a7bd6d047ad0b98c8cdea3db78dd2970c78fb861f2a92ddc277876791c4a30f525659557831f4377065d19acb384cc68340152a6de6d84cdb58f433923d1fb8cc6b10bacd95b9ab1b45563998620d192032269fa8301c09a29c4b5b20ca0a3d63a4f5984b7db0f5b17417dc7b939b9b177bf423e2f3d57dff296e6e4ff0fb1744b13731206ead54ef0aa1da09bea8b0ac0ef71b73d009d30531de9fde90d86bf5f20d8e5a9e324e657a98f8c0031adac4385157ba4e28b48aed957a5b36c3b49057f8eca7f56808f794014dad170601070607010e004f42d01cc63b2a1761126ba045f1165e25fdd05901fac6b76e777faaaee6f5ed94302e2da28046b4bc60228e1b9e194f364e377f84681b3011583554b76fbf8d7456dbdea665adad6aa0556c8cc714f217a518a98615c4c1cfc8adbbd4d12c5bc23ad7a0f849e32fe2005334b55d7bcb43d1c95d4793e7c3882740cde8dd24b367294496a3e2f3251a66cdaece9e0a73d853f8d4e3a4637836ded68cb28ba4fcab02d61fb5cfa581792e636217f3238d78912ea0863816ffb2f388823174b19433c2b14bab69e12c3b791fe683744d4519455a52555af0d7e12749f6094afdba00fc6a609c7578c531fc4c3c3065ebf78414f112014726ec2230f9bcd9c15e36283144ccbe0d1785b65cf49ba8fefe92eb6907c0330bc98ac172ea9e8dd4df8974dd6b6772bbc6ca8e8562c5ec0b6592de7440ac915c35e0ac8087f22eba110ca3037b469b1d5bc92636d81881e38d8bbed01a29b3ebcf0c19eb95bf999eb848022592aeaab649ce19824ed9d3a32d75fba556ee07606a306d1fcec2e24b38274c361b7bc96ce37b7f4fe434eba17ac2a097051a92e4ec32e4c678f7762e8b96ebfd2600c0f224b04b2cd7e9f4ad327d53603828015e9cf45969800f02fa5e0ba26b8c844ba1fdffde44303ad0389c1b31d582877ca6bfad4973ba35fbb90ecdd95f430078bc39aa89434130a5fb8321e51f9624090d0277a9f112ee8ff65d3dba999c7c08727d0f08dcf00ce22f62c955d6a822f247c8065ab94ac442e1cb5f31254816794cc2556891a523b8aef09d3b9e07aa8b67b3b87567adebdbdfb93ba9a082f72052572c97e73af16cfc42d2a51a3683f84748a338aab56264753ba4083d356a27c71f47221ed8340c50afd46cd207c4f9634ab5a44888a4234770c46232c35eff83fa950b0a6879137dce209d5a1f26809b411f046f51ff084f15bfe03292ee845d3044235adbc299925235462e67f803daa1426f0e116b93f4532dd2784f7f87ae360281ce21f70d230c242e1a98de8fe1d6147ad71edec89e24a5980c45fd91e23516758af71df8e0dd96929d4da61a3baeabb96c9378986deb4c9101175e3af1e102b52a8da27d916ee4a28263ca485cfe87ee5436249c1a2f933669f6e3274e9bd93092f4a798ae85d6592ebb54dc65c28ba08582e275972b0a12c22a7792ccfd4a398e504c6fb2cf5ef1f9c268540b4fd7d07d59c49a559d86a56a009c4c18a3fceca109fc7a45c6e842abc22053e84878c4805d96ac96ba00fa40fc3b50407141105845055447ca94bd27f234183c2b8bf37f5cd249ed0705afaeae59c8be8f6b38069d67fb23f74284e8185c176b58b482900a3e09774383c7ecacf4fe5e580df99db102ad4018db73c73a635d3fcdc833b000c948d846aacc92ed54ffb3acae1bfe205d6b2312658f15decfa085d13bc3757c754c5704d8089563e0ccf52b04a49df293cafbbc2fed5d9551b5a3897ec7beaa56a4034bedceb4840a9bdfbb8bf47d66dd3a4e3eb1666372c6b2c39a48d52761bd36403cb130a087685e2eabb8711c11005ea09f90ac49665415c56cab6fd2719c45b6800df914f8ff327eed29d9b9a5bbd6b80b8bb31ad1522803b2c8d89166d5c6b2ed47bc5bbbc4abe6709d46b856ab81ddf15f098a9ab76a8257e7e5c2e7dae53fbd691736f0d6bafe0bb939172614e99c7d7e37754af6c3c637d076a43dbd70e5eae910c8170cecff1621e382d2977635b67f4fac555419f8a0bb76ccaeaef4c7385d293c9595ae10e5201c4a31b4c3ecb9f3b304efb1886f9c58a4ef04e73341b95d9bdb85d706b2a8d3fdd153743a8bb7b3289d0fe79f6a3b9e0fe160dd6700fd64fc87d9ac96858a6d395fef6f3d2193ebae7c3a92e18746a7f12b244fbc5b1df0086cc7045036519d9d7bf8e92b850ea0d3d1e775dea362362462dea2d3501d39203e2879070d1f7ac92fa1576f6d12886d5b979e3c788c09a769ef4ee45e14cd8e7553ebeefcd31ff3d43d4988db08f6630ba8ae8c7250ac42a3d78edb967d59310a4a224567d8797c42370cbd2302a3f49abeaf85fad9455f98b61ef2b5e34a5c552583872145e191bbffcaa526f5e38e497a1a1e1220a0f283a935ecd366a9069d5a2a80baba3a22fa85a2557db72d7e29eb4e33e8ed8bb4ec2ec7c2e9cedef46ea955834acf8c9ab23b78052446fd73c9d61683d7fa0088db97d07cc350af0b6b2ad7e66a493af814c11f8c0f2fdf0df40aafd0d218c00319c367e98d7f10c74ea06d31276f3f216e1cb2f12033915008cc83b00ac60fc9c2fb7f97d6e8cd79650d0f9d82bfd9cafef668021d3d165f3fe84221998bc8c29aea0b5b7e0f1f25a0d7447e806cc3fc39e6038be3df9ac01f46222d3a609f8a026744ab4f58a734e3782bec301ea91f2d8e2242d04a11e82474002143223f29656b1a7675aa5ad181004c4f1381df6a0f95a0186e82c04b4de881209e9ccca3ee5b1def0b02353738d92a07314403a1a2721c256121fba8b8ce9b460", + "signing_randomness": "5416d79e273c74904760e9c74983293e4075dcb9800e2fbcede78813c5c72c1a", + "sha3_256_hash_of_signature": "bee640368e4f17c28e803c16264030ed8ddbd8a5f53f63d40790c7552336d520" + }, + { + "key_generation_seed": "690482bff6c1d0ba6c071dd395adf69e55e1bfc4e0992a8650ffb5e60a02b172", + "sha3_256_hash_of_verification_key": "3ffaacc6d11cd73fcb77e43bef5de5102218f713d48c287b0538504b44e1867a", + "sha3_256_hash_of_signing_key": "a358b2257093960e5145f10b96327dd05c5ef3de8e97db6233fd51a3eebf54d6", + "message": "d21a6bb3a2356805e678673c45fb055fc5266e3f692af9935aea307f14a5c41b979966a5dfe42ebfed1487e4822b74ab5af28995e085ec8007eca4977c63ee5299fec63dccbc42eeacab488e574249e9d856146750ad97c8a443485ec1c5820beb0964640010f6407140791e74684dbb91052e2d8bef7bdcd78b2ec03c97a53295d683bdbe32a70dc19a2f75b8613aea9616ae0e280179492820f73fb7fa4121e673fb5c328f41b67ff8ffa7aee6564adaba046d6e1d6aa13fb24965390f829246dfa8763851405075f76cf94c66ffc3308214df0960c649aaedc22926ce9357d3875f8b71d68d75999aa3663c30a9edf07228bf7dff49ec1e6c7a33d2053597003b82392e826ebd701b4c981aaac9951c79e08f592c2c0637c8e5a7f9dcda599e859c317d4888b4098992e0e2d979e41c703686d577e5ba6001ec4f587140711293d664963632f87ea0461e0e0c5e9d8d292fb409f9f9ab172ee17fc8afabad06e42b437ce22924eb5dbd3a80a06962f3b37946259f9c75a233cb2b4abdc5cd1b648faeb1be8630db40d151b8fba693df2c5bdcaa14dc4783f450b6bc407515ceebc5c9a47bd1a141384f0b596cab1135c075651cba989c190f3171dc1d72330edaa01656813c4b7811715060b023fc426745c301b2a91e0d08ed3bded438c4ce6799c35f3981c882a0bde4a2feeb1a52cafa47b0c48558fc43f98fe08f03a71128362bb6fb9da6a22249f4d4352ae7d3dae85de497e2411eadcfe5bf1a3c075c45811e0097ecea255fe15bd8321fe8b546a8cacfb899eecf5419db363c7567c2fe7360b36de14674f500a31d3eec71451a7c0d5576a8939c0f6d4d9f2f03f3c516ce25ce73abb35c73aa94f6aefae6ad87052d6b195fa43586817f5bb974aae7f1b8608922411aa5b0d7d574016cbd3ded13395623470a108fa0e1d3f9faa7e1e5031843f2a23dbce8b196315290dea5795e4115d53dc570a444064cfa3c9457dbf3ee323b1966ecd2270c32910f8f430522471258a1f1955a6e1dd8c84ed9a566499bf85628615351abe84b401421da2cfaf575e2644c9304c075ecfc374066cec713fa4c0d89043689fbc59ff54b8f97ee0a3b0989bc5e4ef83cc9833e75bc8b67bb5ee3c06ea156611cda95a6702416807530ea206ed89835d20805ea988b1958569cdf7f809996214dadab4e20bd44917e3410ec6beac98fea07f764e85b66aed5e17cf675d2ed8e63db728fe75158cb31779e31379648b43d68ccff3780854cf03535c57122019456e73cf06769bf1fbf558542241ce665bd10f921828553585e0cf664cdc6160f9c47fa5330591b74194f4716056ca83993efec4a52db9a1fbd3b2f504ac19667325167407375b6d7de739f07947b511c8d475744e5c29d6e286a37f1ff8317bd0178f0e306a38fa6e75f4a80427feb2c91235d3e7f20d8101cfc03bb73f44ef59af3526e9afc580027a1dade37654238b8ec7af0105248fe30784a88b72e11fc1bd807e47a349bd29075befbb29730ef8e85e3abd5105559bacee74aa27d90d360a8d629dbec95eb34c7f7ca20096ff7b521e40d3944a975436896f372eeab6b8615eb91697965bbf955779dd3047f7e3bf029e3509a5780247445d6223d085afb4291d976efadc41e42dc2c0728d18f6155654a332fec72eb6aef8b92c1d177e3dc28c31971bcaff76ddebfd9588bc244b116d409e58dc5ada1648663d603c47faeb814aaa7eb9b6264356f926c18b9357bf426b89ddc8eb9177eceb5c6cdc64dd8feb7b326bc1ba89bd9035235da0e644ef959c58dd97b88d5c749b36931ac2694c67151db0894652e99254222d37cefe9e27b3dd663a152dbe29a3639afe42f4578937076180563aad6ad739255ea012a17d2a56627d84c44fbab261d392a966cfe19278799cf1634d42384323c496190d4b9fb662694e3887ea66ab9e8b195488c8dca47c8bc0424247759137cfbf86dedc3641904cb6facbb30a9fa84acf69a67b4afdf4c2aa420fc0d90cefa0dfbbcd3072d9f772fd6058e2bf0e251be93b00dc43765b53db51b22f12d3ed0cc5655e4aebd9d923f99a43e4461dcf5992030e66a1cdc3a65558d9bb3a39788d92328387d144850dd3706fd7a079e3d2398f542f91a8aaabf0c5068dbaf1fcc5160398abecf74884beb04f3a3ea38bbb80d798f5981b3f2db6c7b33f867b7dc06a4417e30f94cdb4f523aeea0be12bd75aaed57520db0d4b4f013be3a1dc7ae5c58fd1de9637f7d82f697b7e92da427a78feec6a5c0255eb57a43dea6cebc8805bc04e04fe789e222b1e2642d26edc14fb36ecc6092b3060e45eed6c5b35de8741f72933930ecbd7338cf39474122357365700cb50c5eb176fb92814fa7f4032570ccee6b859236ad5da5f1730129edc7be218ba9874620f6f0ebc45e0bd622f8fd1ae6974994af95c6519ec1c46650c073d194fa6ebc62f405f63a3416782a47872c7d77d648d0a1c802ffdfde5fdc112c94cfc68f401889efc522fe488fdb5384c0d93147ab6587659d936f98ecfbcdcfbf8b352d605f18c855e2559743ed97991c5d50df44a7b929303835654a3955abc5bee6327400a7ccce460b318d8b5ece5b12f606adb3d7b5ed59563b8e675e78029aabc234442c2463256fe02b04f556da35c4615d14a9f4eff17db0db81de4bdd894f6628a120be2d4cf3e1f46d53817899657035a76137e23c0b0e8ddd29465d7f15628fd435e6caaca4194fdbf85fdcc31d5dafcb52568b7c0cfbe713bc85fa424ba3abe149e4035fc86807a8b876d2163b447cad5ec0e6ef38a1d591afb46267f9dbf142cab1cac1f73beba212992fc6d4647ec17848d1adbb1901277a5078dd72d9c9184e893c0806e9b4aff0a824670d438620f2a7e8d2965b619d291e5824c014fc888a36fbbe17356431f0039038f9b497902aed969f9c488390b7087763638e976801127baf1f53803c4dc9649f0ee85d67b239e2bdafb2bd75f1d1da22a56fb3af10a9dde7ad306c4af8681029316c0e1949228e6bf5adf942f1c0ef92b2bcbc0c70d49e5808851444240a78b14d21b54f66271482f49b85f5180b268050327368496cfa8b54ecb97ee6d28eb74a3742f68583da046809002c22f7b31fbc0566969f9a15cdca892c4beb101a2ac3526c76e9d30982c9b4893450fdec4001d2431828d24d8b1a67df80e2e10ed2ea8d723227055c48006665f7da8e032efdc70bc7eeb2b369b551fac542ad6df1a23107e2b3c0e3ccacc25f26404c085cbf56e52d35d7948db9fda6dfc24709994719d8ced41a2cc9b3c4b2bef0967cb71861cf0e6aea9bec9395726aa0e2f1a7247ed0f6038e3df4bf566786073590dcf97f8f0a99658d8f630a2d130c46cf4d26c669360d0f70b75f904c9f923ab285d5db129f6c25ad21f9e26ac844d07a8eed86c4e224ebfc5b3f720d6f94b0a01b1433c46b40cf84e80f7a6afa7bb8f9acf818ad3cab2ddd6904c067bea4f1fe79b83cb0aa8fc75b6b096bad6fe94abfd48f8efc0f2b9a02ebda8fdbdbe1c77f1854edba18aae7f31ced9cd34c1b355108df18a8953932f7554af05b203a96a9bb93e0eff51d7f93b56e351562cf85a2d35eae2c2427b89a8662a1c723d4f14e6eafdbd636c2bb7ade29c1a6bc8a463734c808bec68b1e9a31af6e29b412f1cb8c90a9911ac5c3ea71e46113d2d7b1ae2d8802b06a770fd0e9e4652895e42181ad09bb541e9493f258711bb7bedd3e7ca8b8ce875669cf80a6880eca3f13800de7011ea67f443e505c4fb455608ae586f922b3c83fd33b306bdedb86223c33e3aa65edc93cbcf3a03adaf9f328997951d59a9200c0ba2618e3596af176b43122cedc52b1e006ea6d12dc236a6fcd7cc46825f2ef7ed71683a731d746fff2fe54e0b392a8cbfa38873196bb2b835dca7cb7c3ed9a004c7a329b9734a111744bdacdb669e69e9df1e52f07c513e3752a0ccd81d7ddc4a64868b7bb2bbbd2095373480522be10615248a179dcb61dac90f7fa5fa9b84f190a9c62b5ff9cd473a940f03e7107157d7eb60af1e3e384ffe8a67dcb2389b3b0fab7c789cf100ca95cd6a85442cb9a2c243fb9d454b20bae5762d72b8fe79b4df81163d61de4578cf976992d8b9989fc68089f811f53db1e1092b60220552876b818bea981571898cd6ab7b5f13c46b0a076526e3241d65014f855efd7bde08ad91f259dcb64e94ec3dad97811eb024ee1d341521dc92ae5e93c73422088976f2d27d64e1d193b955e6736ad2bccf3c1a53d590576434acbc0b687f27f255fef354e68aca47160efa7126f908e08e4548c11546d9c412d685fa84d2eb4dcb2bdfc48e2fa8023548198ebb072a48044f4391143e3bef4ff9066a4b0d03adc826819d67588ba84f99da27424103652acc039ddd3b567851cd78e4117a8b93afe01fc8eebdaa1acb8ba9d095789e76b9d5ab9ee177a15d666ef171fe1d4bdccfe2e58ce669b561f63028c6ce26db5c8182fe048680b175c7ab407215ff3a7801c950d509867ab1b0bef89b3e38a387915225ede76f91aad15a85d8c46efd588bb3baacbc52c036211512473420f3f061f5f53e9353de0780425745a76439b3811511c86ca503251f24113384e1a24a9367536e796ce08b896f572489a2339e82a856c", + "signing_randomness": "544516c0b4d99ab3a7305c9c23bfe846782508ffb748e223fd93d7ca84e88507", + "sha3_256_hash_of_signature": "dd51809a30f0dbaaf8d1bdbcd430cb617c23b33ca7dd587d3ca9842572d35e31" + } +]
\ No newline at end of file diff --git a/regress/unittests/crypto/tests.c b/regress/unittests/crypto/tests.c new file mode 100644 index 000000000000..9804dd326b25 --- /dev/null +++ b/regress/unittests/crypto/tests.c @@ -0,0 +1,123 @@ +/* $OpenBSD: tests.c,v 1.2 2026/06/16 08:15:35 dtucker Exp $ */ +/* + * Regress test for crypto ergonomic API + * + * Placed in the public domain + */ + +#include "includes.h" + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> + +#include "../test_helper/test_helper.h" +#include "sshbuf.h" + +void mldsa_tests(void); +void mlkem_tests(void); +void ed25519_tests(void); +void mldsa_eddsa_tests(void); + +struct sshbuf *load_text_file(const char *name); +char *get_json_string(struct sshbuf *content, const char *key, int consume); + +static struct sshbuf * +load_file(const char *name) +{ + struct sshbuf *ret = NULL; + + ASSERT_INT_EQ(sshbuf_load_file(test_data_file(name), &ret), 0); + ASSERT_PTR_NE(ret, NULL); + return ret; +} + +struct sshbuf * +load_text_file(const char *name) +{ + struct sshbuf *ret = load_file(name); + const u_char *p; + size_t len; + + /* Trim whitespace at EOL */ + for (p = sshbuf_ptr(ret); (len = sshbuf_len(ret)) > 0;) { + len--; + if (p[len] == '\r' || p[len] == '\t' || + p[len] == ' ' || p[len] == '\n') + ASSERT_INT_EQ(sshbuf_consume_end(ret, 1), 0); + else + break; + } + /* \0 terminate */ + ASSERT_INT_EQ(sshbuf_put_u8(ret, 0), 0); + return ret; +} + + +/* + * Simple JSON-ish parser for test vectors. + * Extracts the value for a given key. + * Errors cause ASSERT_* failures. + */ +char * +get_json_string(struct sshbuf *content, const char *key, int consume) +{ + struct sshbuf *tmp; + char *k, *ret; + size_t off, end_off; + u_char c; + + tmp = sshbuf_fromb(content); + ASSERT_PTR_NE(tmp, NULL); + ASSERT_INT_GT(asprintf(&k, "\"%s\"", key), 0); + if (sshbuf_find(tmp, 0, k, strlen(k), &off) != 0) { + fprintf(stderr, "Key %s not found in JSON\n", k); + ASSERT_INT_EQ(1, 0); + } + ASSERT_INT_EQ(sshbuf_consume(tmp, off + strlen(k)), 0); + free(k); + + /* Skip colon, spaces, commas */ + while (sshbuf_len(tmp) > 0) { + c = *sshbuf_ptr(tmp); + if (isspace(c) || c == ':' || c == ',') + ASSERT_INT_EQ(sshbuf_consume(tmp, 1), 0); + else + break; + } + /* Expect opening quote */ + ASSERT_INT_EQ(sshbuf_get_u8(tmp, &c), 0); + ASSERT_CHAR_EQ(c, '"'); + /* Find closing quote */ + ASSERT_INT_EQ(sshbuf_find(tmp, 0, "\"", 1, &end_off), 0); + ASSERT_PTR_NE(ret = malloc(end_off + 1), NULL); + memcpy(ret, sshbuf_ptr(tmp), end_off); + ret[end_off] = '\0'; + if (consume) { + ASSERT_INT_EQ(sshbuf_consume(tmp, end_off), 0); + ASSERT_INT_EQ(sshbuf_consume_upto_child(content, tmp), 0); + } + sshbuf_free(tmp); + return ret; +} + +void +tests(void) +{ +#ifdef USE_MLDSA + mldsa_tests(); +#endif +#ifdef USE_MLKEM768X25519 + mlkem_tests(); +#endif + ed25519_tests(); +#ifdef USE_MLDSA + mldsa_eddsa_tests(); +#endif +} + +void +benchmarks(void) +{ + /* none */ +} diff --git a/regress/unittests/hostkeys/Makefile b/regress/unittests/hostkeys/Makefile index 2e154e12f755..4a88de405d1c 100644 --- a/regress/unittests/hostkeys/Makefile +++ b/regress/unittests/hostkeys/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.15 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.16 2026/06/14 04:08:06 djm Exp $ PROG=test_hostkeys SRCS=tests.c test_iterate.c @@ -11,7 +11,7 @@ SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c SRCS+=addr.c addrmatch.c bitmap.c hostfile.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c - +SRCS+=ssh-mldsa-eddsa.c libcrux-mlkem-mldsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c SRCS+=utf8.c diff --git a/regress/unittests/kex/Makefile b/regress/unittests/kex/Makefile index 7a53978f1749..bf17468034eb 100644 --- a/regress/unittests/kex/Makefile +++ b/regress/unittests/kex/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.21 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.22 2026/06/14 04:08:06 djm Exp $ PROG=test_kex SRCS=tests.c test_kex.c test_proposal.c @@ -12,6 +12,7 @@ SRCS+=addr.c addrmatch.c bitmap.c packet.c dispatch.c canohost.c ssh_api.c SRCS+=compat.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c +SRCS+=libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c SRCS+= kex.c SRCS+= kex-names.c diff --git a/regress/unittests/match/tests.c b/regress/unittests/match/tests.c index 163a3a25569d..58d4ee7c8704 100644 --- a/regress/unittests/match/tests.c +++ b/regress/unittests/match/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.9 2025/04/15 04:00:42 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.10 2026/05/31 04:20:58 djm Exp $ */ /* * Regress test for matching functions * @@ -17,6 +17,142 @@ #include "match.h" +/* Original match_pattern() implementation; has bad worst-case behaviour */ +static int +match_pattern_original(const char *s, const char *pattern) +{ + for (;;) { + /* If at end of pattern, accept if also at end of string. */ + if (!*pattern) + return !*s; + + if (*pattern == '*') { + /* Skip this and any consecutive asterisks. */ + while (*pattern == '*') + pattern++; + + /* If at end of pattern, accept immediately. */ + if (!*pattern) + return 1; + + /* If next character in pattern is known, optimize. */ + if (*pattern != '?' && *pattern != '*') { + /* + * Look instances of the next character in + * pattern, and try to match starting from + * those. + */ + for (; *s; s++) + if (*s == *pattern && + match_pattern_original(s + 1, + pattern + 1)) + return 1; + /* Failed. */ + return 0; + } + /* + * Move ahead one character at a time and try to + * match at each position. + */ + for (; *s; s++) + if (match_pattern_original(s, pattern)) + return 1; + /* Failed. */ + return 0; + } + /* + * There must be at least one more character in the string. + * If we are at the end, fail. + */ + if (!*s) + return 0; + + /* Check if the next character of the string is acceptable. */ + if (*pattern != '?' && *pattern != *s) + return 0; + + /* Move to the next character, both in string and in pattern. */ + s++; + pattern++; + } + /* NOTREACHED */ +} + +/* n^x for size_t */ +static size_t +pow_size(size_t base, size_t exp) +{ + size_t r = 1; + + ASSERT_SIZE_T_NE(base, 0); + while (exp-- != 0) { + ASSERT_SIZE_T_LE(r, SIZE_MAX / base); + r *= base; + } + return r; +} + +static void +make_word(size_t v, const char *alphabet, size_t alphabet_len, + char *word, size_t wordlen) +{ + size_t i; + + for (i = 0; i < wordlen; i++) { + word[i] = alphabet[v % alphabet_len]; + v /= alphabet_len; + } + word[wordlen] = '\0'; +} + +#define PATTERN_LEN 8 +#define INPUT_LEN 7 + +static void +match_pattern_check_one_input(const char *input, const char *pattern_alphabet) +{ + char pattern[PATTERN_LEN]; + size_t len, i, npatterns; + int actual, expected; + + for (len = 0; len < sizeof(pattern); len++) { + /* Check with all patterns of this size using alphabet */ + npatterns = pow_size(strlen(pattern_alphabet), len); + for (i = 0; i < npatterns; i++) { + make_word(i, pattern_alphabet, + strlen(pattern_alphabet), pattern, len); + actual = match_pattern(input, pattern); + expected = match_pattern_original(input, pattern); + test_subtest_info("input=\"%s\" pattern=\"%s\"", + input, pattern); + ASSERT_INT_EQ(actual, expected); + } + } +} + +/* + * Check current match_pattern against original one with an exhaustive + * combination of patterns and inputs. + */ +static void +match_pattern_exhaustive_original(void) +{ + const char *pattern_alphabet = "abx?*"; + const char *input_alphabet = "abc"; + char input[INPUT_LEN]; + size_t len, i, ninputs; + + for (len = 0; len < sizeof(input); len++) { + /* Check every possible input from alphabet of this size */ + ninputs = pow_size(strlen(input_alphabet), len); + for (i = 0; i < ninputs; i++) { + make_word(i, input_alphabet, + strlen(input_alphabet), input, len); + match_pattern_check_one_input(input, pattern_alphabet); + } + } +} + void tests(void) { @@ -26,22 +162,84 @@ tests(void) ASSERT_INT_EQ(match_pattern("aaa", ""), 0); ASSERT_INT_EQ(match_pattern("aaa", "aaaa"), 0); ASSERT_INT_EQ(match_pattern("aaaa", "aaa"), 0); + ASSERT_INT_EQ(match_pattern("abc", "abc"), 1); + ASSERT_INT_EQ(match_pattern("abc", "abd"), 0); + ASSERT_INT_EQ(match_pattern("abc", "abcd"), 0); + ASSERT_INT_EQ(match_pattern("abcd", "abc"), 0); TEST_DONE(); TEST_START("match_pattern wildcard"); ASSERT_INT_EQ(match_pattern("", "*"), 1); + ASSERT_INT_EQ(match_pattern("", "**"), 1); + ASSERT_INT_EQ(match_pattern("", "***"), 1); + ASSERT_INT_EQ(match_pattern("", "?"), 0); + ASSERT_INT_EQ(match_pattern("", "*?"), 0); + ASSERT_INT_EQ(match_pattern("", "?*"), 0); + ASSERT_INT_EQ(match_pattern("", "**a*"), 0); ASSERT_INT_EQ(match_pattern("a", "?"), 1); ASSERT_INT_EQ(match_pattern("aa", "a?"), 1); ASSERT_INT_EQ(match_pattern("a", "*"), 1); ASSERT_INT_EQ(match_pattern("aa", "a*"), 1); ASSERT_INT_EQ(match_pattern("aa", "?*"), 1); - ASSERT_INT_EQ(match_pattern("aa", "**"), 1); ASSERT_INT_EQ(match_pattern("aa", "?a"), 1); ASSERT_INT_EQ(match_pattern("aa", "*a"), 1); ASSERT_INT_EQ(match_pattern("ba", "a?"), 0); ASSERT_INT_EQ(match_pattern("ba", "a*"), 0); ASSERT_INT_EQ(match_pattern("ab", "?a"), 0); ASSERT_INT_EQ(match_pattern("ab", "*a"), 0); + ASSERT_INT_EQ(match_pattern("aa", "**"), 1); + ASSERT_INT_EQ(match_pattern("ab", "a***b"), 1); + ASSERT_INT_EQ(match_pattern("axb", "a***b"), 1); + ASSERT_INT_EQ(match_pattern("axxb", "a***b"), 1); + ASSERT_INT_EQ(match_pattern("ax", "a***b"), 0); + ASSERT_INT_EQ(match_pattern("abbb", "a*b*b"), 1); + ASSERT_INT_EQ(match_pattern("abbb", "a*b*c"), 0); + ASSERT_INT_EQ(match_pattern("aaaaaaaaac", "a*a*a*a*b"), 0); + ASSERT_INT_EQ(match_pattern("aaaaaaaaab", "a*a*a*a*b"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*b"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*a*"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*a*b"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*a*c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a?c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "??c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "???"), 1); + ASSERT_INT_EQ(match_pattern("abc", "a?d"), 0); + ASSERT_INT_EQ(match_pattern("ab", "???"), 0); + ASSERT_INT_EQ(match_pattern("abc", "ab*"), 1); + ASSERT_INT_EQ(match_pattern("ab", "ab*"), 1); + ASSERT_INT_EQ(match_pattern("a", "ab*"), 0); + ASSERT_INT_EQ(match_pattern("abc", "ab?"), 1); + ASSERT_INT_EQ(match_pattern("ab", "ab?"), 0); + ASSERT_INT_EQ(match_pattern("abcd", "ab?"), 0); + ASSERT_INT_EQ(match_pattern("abc", "?bc"), 1); + ASSERT_INT_EQ(match_pattern("abc", "?b*"), 1); + ASSERT_INT_EQ(match_pattern("abc", "?c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a*?c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "a*?c"), 0); + ASSERT_INT_EQ(match_pattern("abbc", "a*?c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "a?*c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "a?*c"), 0); + ASSERT_INT_EQ(match_pattern("abbc", "a?*c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "a*?*c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "a*?*c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "?*c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "?*c"), 1); + ASSERT_INT_EQ(match_pattern("c", "?*c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "*?c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "*?c"), 1); + ASSERT_INT_EQ(match_pattern("c", "*?c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a?*"), 1); + ASSERT_INT_EQ(match_pattern("ab", "a?*"), 1); + ASSERT_INT_EQ(match_pattern("a", "a?*"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a*?"), 1); + ASSERT_INT_EQ(match_pattern("ab", "a*?"), 1); + ASSERT_INT_EQ(match_pattern("a", "a*?"), 0); + ASSERT_INT_EQ(match_pattern("abb", "a*b"), 1); + ASSERT_INT_EQ(match_pattern("abbc", "a*b"), 0); + TEST_DONE(); + + TEST_START("match_pattern exhaustive original"); + match_pattern_exhaustive_original(); TEST_DONE(); TEST_START("match_pattern_list"); diff --git a/regress/unittests/servconf/Makefile b/regress/unittests/servconf/Makefile new file mode 100644 index 000000000000..3a095aff5b04 --- /dev/null +++ b/regress/unittests/servconf/Makefile @@ -0,0 +1,26 @@ +# $OpenBSD: Makefile,v 1.2 2026/06/14 04:08:06 djm Exp $ + +PROG=test_servconf +SRCS=tests.c + +SRCS+=servconf.c groupaccess.c + +# From usr.bin/ssh +SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c +SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c +SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c +SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c +SRCS+=addr.c addrmatch.c bitmap.c +SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c +SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c +SRCS+=utf8.c ssherr-libcrypto.c +SRCS+=kex.c kex-names.c packet.c dispatch.c compat.c canohost.c +SRCS+=digest-openssl.c ed25519-openssl.c +SRCS+=libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c + +REGRESS_TARGETS=run-regress-${PROG} + +run-regress-${PROG}: ${PROG} + env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS} + +.include <bsd.regress.mk> diff --git a/regress/unittests/servconf/tests.c b/regress/unittests/servconf/tests.c new file mode 100644 index 000000000000..52e1e9fdc77a --- /dev/null +++ b/regress/unittests/servconf/tests.c @@ -0,0 +1,364 @@ +/* $OpenBSD: tests.c,v 1.1 2026/05/31 11:39:44 djm Exp $ */ +/* + * Regress tests for servconf.h server configuration API + * + * Placed in the public domain + */ + +#include "includes.h" + +#include <sys/types.h> +#include <limits.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "../test_helper/test_helper.h" + +#include "log.h" +#include "misc.h" +#include "servconf.h" +#include "sshbuf.h" +#include "ssherr.h" +#include "xmalloc.h" + +struct sshbuf *cfg; + +/* stub */ +int auth2_methods_valid(const char *methods, int need_enable); +int +auth2_methods_valid(const char *methods, int need_enable) +{ + return 1; +} + +static void +onerror(void *fuzz) +{ + fprintf(stderr, "Failed during fuzz:\n"); + fuzz_dump((struct fuzz *)fuzz); +} + +static void +set_string(char **dst, const char *s) +{ + *dst = s == NULL ? NULL : xstrdup(s); +} + +static char ** +new_string_array(u_int n) +{ + return xcalloc(n, sizeof(char *)); +} + +static void +set_test_options(ServerOptions *o) +{ + initialize_server_options(o); + + o->num_ports = 2; + o->ports[0] = 22; + o->ports[1] = 2022; + o->ip_qos_interactive = 0x10; + o->ip_qos_bulk = 0x08; + o->log_facility = SYSLOG_FACILITY_AUTH; + o->log_level = SYSLOG_LEVEL_DEBUG3; + o->fwd_opts.gateway_ports = 1; + o->fwd_opts.streamlocal_bind_mask = 0177; + o->fwd_opts.streamlocal_bind_unlink = 1; + o->permit_user_env = 1; + set_string(&o->permit_user_env_allowlist, ""); + o->rekey_limit = 123456789; + o->rekey_interval = 600; + o->timing_secret = 0x0102030405060708ULL; + + set_string(&o->routing_domain, ""); + set_string(&o->banner, NULL); + set_string(&o->adm_forced_command, "internal-sftp"); + set_string(&o->chroot_directory, ""); + set_string(&o->host_key_agent, NULL); + set_string(&o->authorized_keys_command, "/bin/echo"); + set_string(&o->authorized_keys_command_user, ""); + set_string(&o->authorized_principals_file, NULL); + + o->num_authkeys_files = 3; + o->authorized_keys_files = new_string_array(o->num_authkeys_files); + set_string(&o->authorized_keys_files[0], NULL); + set_string(&o->authorized_keys_files[1], ""); + set_string(&o->authorized_keys_files[2], ".ssh/authorized_keys"); + + o->num_log_verbose = 2; + o->log_verbose = new_string_array(o->num_log_verbose); + set_string(&o->log_verbose[0], NULL); + set_string(&o->log_verbose[1], "kex.c:*"); + + o->num_host_key_files = 3; + o->host_key_file_userprovided = + xcalloc(o->num_host_key_files, + sizeof(*o->host_key_file_userprovided)); + o->host_key_files = new_string_array(o->num_host_key_files); + o->host_key_file_userprovided[0] = 0; + o->host_key_file_userprovided[1] = 1; + o->host_key_file_userprovided[2] = -1; + set_string(&o->host_key_files[0], NULL); + set_string(&o->host_key_files[1], ""); + set_string(&o->host_key_files[2], "/tmp/ssh_host_ed25519_key"); + + o->num_queued_listens = 2; + o->queued_listen_addrs = xcalloc(o->num_queued_listens, + sizeof(*o->queued_listen_addrs)); + set_string(&o->queued_listen_addrs[0].addr, "127.0.0.1"); + o->queued_listen_addrs[0].port = 2222; + set_string(&o->queued_listen_addrs[0].rdomain, NULL); + set_string(&o->queued_listen_addrs[1].addr, "::1"); + o->queued_listen_addrs[1].port = -1; + set_string(&o->queued_listen_addrs[1].rdomain, ""); + + o->num_subsystems = 2; + o->subsystem_name = new_string_array(o->num_subsystems); + o->subsystem_command = new_string_array(o->num_subsystems); + o->subsystem_args = new_string_array(o->num_subsystems); + set_string(&o->subsystem_name[0], "sftp"); + set_string(&o->subsystem_command[0], "internal-sftp"); + set_string(&o->subsystem_args[0], "internal-sftp -f AUTH"); + set_string(&o->subsystem_name[1], "echo"); + set_string(&o->subsystem_command[1], "/bin/echo"); + set_string(&o->subsystem_args[1], "/bin/echo hello"); +} + +static void +check_roundtrip(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_INT_EQ(deserialise_server_options(buf, &out), 0); + ASSERT_SIZE_T_EQ(sshbuf_len(buf), 0); + + ASSERT_U_INT_EQ(out.num_ports, 2); + ASSERT_INT_EQ(out.ports[0], 22); + ASSERT_INT_EQ(out.ports[1], 2022); + ASSERT_INT_EQ(out.ip_qos_interactive, 0x10); + ASSERT_INT_EQ(out.ip_qos_bulk, 0x08); + ASSERT_INT_EQ(out.log_facility, SYSLOG_FACILITY_AUTH); + ASSERT_INT_EQ(out.log_level, SYSLOG_LEVEL_DEBUG3); + ASSERT_INT_EQ(out.fwd_opts.gateway_ports, 1); + ASSERT_INT_EQ(out.fwd_opts.streamlocal_bind_mask, 0177); + ASSERT_INT_EQ(out.fwd_opts.streamlocal_bind_unlink, 1); + ASSERT_INT_EQ(out.permit_user_env, 1); + ASSERT_STRING_EQ(out.permit_user_env_allowlist, ""); + ASSERT_LONG_LONG_EQ(out.rekey_limit, 123456789); + ASSERT_INT_EQ(out.rekey_interval, 600); + ASSERT_U64_EQ(out.timing_secret, 0x0102030405060708ULL); + + ASSERT_STRING_EQ(out.routing_domain, ""); + ASSERT_PTR_EQ(out.banner, NULL); + ASSERT_STRING_EQ(out.adm_forced_command, "internal-sftp"); + ASSERT_STRING_EQ(out.chroot_directory, ""); + ASSERT_PTR_EQ(out.host_key_agent, NULL); + ASSERT_STRING_EQ(out.authorized_keys_command, "/bin/echo"); + ASSERT_STRING_EQ(out.authorized_keys_command_user, ""); + ASSERT_PTR_EQ(out.authorized_principals_file, NULL); + + ASSERT_U_INT_EQ(out.num_authkeys_files, 3); + ASSERT_PTR_EQ(out.authorized_keys_files[0], NULL); + ASSERT_STRING_EQ(out.authorized_keys_files[1], ""); + ASSERT_STRING_EQ(out.authorized_keys_files[2], ".ssh/authorized_keys"); + + ASSERT_U_INT_EQ(out.num_log_verbose, 2); + ASSERT_PTR_EQ(out.log_verbose[0], NULL); + ASSERT_STRING_EQ(out.log_verbose[1], "kex.c:*"); + + ASSERT_U_INT_EQ(out.num_host_key_files, 3); + ASSERT_INT_EQ(out.host_key_file_userprovided[0], 0); + ASSERT_INT_EQ(out.host_key_file_userprovided[1], 1); + ASSERT_INT_EQ(out.host_key_file_userprovided[2], -1); + ASSERT_PTR_EQ(out.host_key_files[0], NULL); + ASSERT_STRING_EQ(out.host_key_files[1], ""); + ASSERT_STRING_EQ(out.host_key_files[2], "/tmp/ssh_host_ed25519_key"); + + ASSERT_U_INT_EQ(out.num_queued_listens, 2); + ASSERT_STRING_EQ(out.queued_listen_addrs[0].addr, "127.0.0.1"); + ASSERT_INT_EQ(out.queued_listen_addrs[0].port, 2222); + ASSERT_PTR_EQ(out.queued_listen_addrs[0].rdomain, NULL); + ASSERT_STRING_EQ(out.queued_listen_addrs[1].addr, "::1"); + ASSERT_INT_EQ(out.queued_listen_addrs[1].port, -1); + ASSERT_STRING_EQ(out.queued_listen_addrs[1].rdomain, ""); + + ASSERT_U_INT_EQ(out.num_subsystems, 2); + ASSERT_STRING_EQ(out.subsystem_name[0], "sftp"); + ASSERT_STRING_EQ(out.subsystem_command[0], "internal-sftp"); + ASSERT_STRING_EQ(out.subsystem_args[0], "internal-sftp -f AUTH"); + ASSERT_STRING_EQ(out.subsystem_name[1], "echo"); + ASSERT_STRING_EQ(out.subsystem_command[1], "/bin/echo"); + ASSERT_STRING_EQ(out.subsystem_args[1], "/bin/echo hello"); + + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_rejects_trailing_data(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + int r; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_INT_EQ(sshbuf_put_u8(buf, 0), 0); + r = deserialise_server_options(buf, &out); + ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_rejects_bad_version(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + int r; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_PTR_NE(sshbuf_mutable_ptr(buf), NULL); + POKE_U32(sshbuf_mutable_ptr(buf), 2); + r = deserialise_server_options(buf, &out); + ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_rejects_bad_port_count(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + int r; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_SIZE_T_GT(sshbuf_len(buf), 8); + ASSERT_PTR_NE(sshbuf_mutable_ptr(buf), NULL); + POKE_U32(sshbuf_mutable_ptr(buf) + 4, MAX_PORTS + 1); + r = deserialise_server_options(buf, &out); + ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_roundtrip_signed_limits(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out, in; + + initialize_server_options(&out); + in = *o; + in.fwd_opts.streamlocal_bind_mask = (mode_t)-1; + in.ip_qos_bulk = INT_MIN; + in.rekey_limit = INT64_MIN; + ASSERT_INT_EQ(serialise_server_options(&in, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_INT_EQ(deserialise_server_options(buf, &out), 0); + ASSERT_INT_EQ(out.fwd_opts.streamlocal_bind_mask == (mode_t)-1, 1); + ASSERT_INT_EQ(out.ip_qos_bulk, INT_MIN); + ASSERT_LONG_LONG_EQ(out.rekey_limit, INT64_MIN); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +attempt_deserialise_blob(const u_char *p, size_t len) +{ + struct sshbuf *buf; + ServerOptions out; + + initialize_server_options(&out); + ASSERT_PTR_NE(buf = sshbuf_from(p, len), NULL); + (void)deserialise_server_options(buf, &out); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_fuzz_deserialise(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + struct fuzz *fuzz; + u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP | + FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END; + + if (test_is_fast()) + fuzzers &= ~FUZZ_1_BIT_FLIP; + if (test_is_slow()) + fuzzers |= FUZZ_2_BYTE_FLIP; + + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + fuzz = fuzz_begin(fuzzers, sshbuf_ptr(buf), sshbuf_len(buf)); + TEST_ONERROR(onerror, fuzz); + for (; !fuzz_done(fuzz); fuzz_next(fuzz)) + attempt_deserialise_blob(fuzz_ptr(fuzz), fuzz_len(fuzz)); + TEST_ONERROR(NULL, NULL); + fuzz_cleanup(fuzz); + sshbuf_free(buf); +} + +void +tests(void) +{ + ServerOptions o; + + log_init("test_servconf", SYSLOG_LEVEL_QUIET, SYSLOG_FACILITY_AUTH, 1); + + TEST_START("server options round trip preserves nullable state"); + set_test_options(&o); + check_roundtrip(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options reject trailing data"); + set_test_options(&o); + check_rejects_trailing_data(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options reject unsupported version"); + set_test_options(&o); + check_rejects_bad_version(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options reject bad port count"); + set_test_options(&o); + check_rejects_bad_port_count(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options round trip signed limits"); + set_test_options(&o); + check_roundtrip_signed_limits(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options deserialise fuzz"); + set_test_options(&o); + check_fuzz_deserialise(&o); + free_server_options(&o); + TEST_DONE(); +} + +void +benchmarks(void) +{ + printf("no benchmarks\n"); +} diff --git a/regress/unittests/sshkey/Makefile b/regress/unittests/sshkey/Makefile index 083175cbf264..c862b9d3ab06 100644 --- a/regress/unittests/sshkey/Makefile +++ b/regress/unittests/sshkey/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.16 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.17 2026/06/14 04:08:06 djm Exp $ PROG=test_sshkey SRCS=tests.c test_sshkey.c test_file.c test_fuzz.c common.c @@ -11,7 +11,7 @@ SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c SRCS+=addr.c addrmatch.c bitmap.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c -SRCS+=utf8.c ssherr-libcrypto.c +SRCS+=utf8.c ssherr-libcrypto.c libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c diff --git a/regress/unittests/sshkey/mktestdata.sh b/regress/unittests/sshkey/mktestdata.sh index 97e5d79fd734..e9e8c91c8baf 100755 --- a/regress/unittests/sshkey/mktestdata.sh +++ b/regress/unittests/sshkey/mktestdata.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: mktestdata.sh,v 1.12 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: mktestdata.sh,v 1.13 2026/06/14 04:08:06 djm Exp $ PW=mekmitasdigoat @@ -58,16 +58,17 @@ else exit 1 fi -rm -f rsa_1 ecdsa_1 ed25519_1 -rm -f rsa_2 ecdsa_2 ed25519_2 +rm -f rsa_1 ecdsa_1 ed25519_1 mldsa44_ed25519_1 +rm -f rsa_2 ecdsa_2 ed25519_2 mldsa44_ed25519_2 rm -f rsa_n ecdsa_n # new-format keys -rm -f rsa_1_pw ecdsa_1_pw ed25519_1_pw +rm -f rsa_1_pw ecdsa_1_pw ed25519_1_pw mldsa44_ed25519_1_pw rm -f rsa_n_pw ecdsa_n_pw rm -f pw *.pub *.bn.* *.param.* *.fp *.fp.bb ssh-keygen -t rsa -b 1024 -C "RSA test key #1" -N "" -f rsa_1 -m PEM ssh-keygen -t ecdsa -b 256 -C "ECDSA test key #1" -N "" -f ecdsa_1 -m PEM ssh-keygen -t ed25519 -C "ED25519 test key #1" -N "" -f ed25519_1 +ssh-keygen -t ssh-mldsa44-ed25519@openssh.com -C "MLDSA44-ED25519 test key #1" -N "" -f mldsa44_ed25519_1 ssh-keygen -w "$SK_DUMMY" -t ecdsa-sk -C "ECDSA-SK test key #1" \ -N "" -f ecdsa_sk1 ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key #1" \ @@ -77,6 +78,7 @@ ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key #1" \ ssh-keygen -t rsa -b 2048 -C "RSA test key #2" -N "" -f rsa_2 -m PEM ssh-keygen -t ecdsa -b 521 -C "ECDSA test key #2" -N "" -f ecdsa_2 -m PEM ssh-keygen -t ed25519 -C "ED25519 test key #2" -N "" -f ed25519_2 +ssh-keygen -t ssh-mldsa44-ed25519@openssh.com -C "MLDSA44-ED25519 test key #2" -N "" -f mldsa44_ed25519_2 ssh-keygen -w "$SK_DUMMY" -t ecdsa-sk -C "ECDSA-SK test key #2" \ -N "" -f ecdsa_sk2 ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key #2" \ @@ -91,6 +93,7 @@ ssh-keygen -pf ecdsa_n -N "" cp rsa_1 rsa_1_pw cp ecdsa_1 ecdsa_1_pw cp ed25519_1 ed25519_1_pw +cp mldsa44_ed25519_1 mldsa44_ed25519_1_pw cp ecdsa_sk1 ecdsa_sk1_pw cp ed25519_sk1 ed25519_sk1_pw cp rsa_1 rsa_n_pw @@ -99,6 +102,7 @@ cp ecdsa_1 ecdsa_n_pw ssh-keygen -pf rsa_1_pw -m PEM -N "$PW" ssh-keygen -pf ecdsa_1_pw -m PEM -N "$PW" ssh-keygen -pf ed25519_1_pw -N "$PW" +ssh-keygen -pf mldsa44_ed25519_1_pw -N "$PW" ssh-keygen -pf ecdsa_sk1_pw -m PEM -N "$PW" ssh-keygen -pf ed25519_sk1_pw -N "$PW" ssh-keygen -pf rsa_n_pw -N "$PW" @@ -121,6 +125,9 @@ ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ -V 19990101:20110101 -z 4 ed25519_1.pub ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ -Oforce-command=/bin/ls -Ono-port-forwarding -Osource-address=10.0.0.0/8 \ + -V 19990101:20110101 -z 4 mldsa44_ed25519_1.pub +ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ + -Oforce-command=/bin/ls -Ono-port-forwarding -Osource-address=10.0.0.0/8 \ -V 19990101:20110101 -z 4 ecdsa_sk1.pub ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ -Oforce-command=/bin/ls -Ono-port-forwarding -Osource-address=10.0.0.0/8 \ @@ -145,6 +152,8 @@ ssh-keygen -s ecdsa_1 -I julius -n host1,host2 -h \ -V 19990101:20110101 -z 7 ecdsa_1.pub ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ -V 19990101:20110101 -z 8 ed25519_1.pub +ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ + -V 19990101:20110101 -z 8 mldsa44_ed25519_1.pub ssh-keygen -s ecdsa_1 -I julius -n host1,host2 -h \ -V 19990101:20110101 -z 7 ecdsa_sk1.pub ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ @@ -153,28 +162,33 @@ ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ ssh-keygen -lf rsa_1 | awk '{print $2}' > rsa_1.fp ssh-keygen -lf ecdsa_1 | awk '{print $2}' > ecdsa_1.fp ssh-keygen -lf ed25519_1 | awk '{print $2}' > ed25519_1.fp +ssh-keygen -lf mldsa44_ed25519_1 | awk '{print $2}' > mldsa44_ed25519_1.fp ssh-keygen -lf ecdsa_sk1 | awk '{print $2}' > ecdsa_sk1.fp ssh-keygen -lf ed25519_sk1 | awk '{print $2}' > ed25519_sk1.fp ssh-keygen -lf rsa_2 | awk '{print $2}' > rsa_2.fp ssh-keygen -lf ecdsa_2 | awk '{print $2}' > ecdsa_2.fp ssh-keygen -lf ed25519_2 | awk '{print $2}' > ed25519_2.fp +ssh-keygen -lf mldsa44_ed25519_2 | awk '{print $2}' > mldsa44_ed25519_2.fp ssh-keygen -lf ecdsa_sk2 | awk '{print $2}' > ecdsa_sk2.fp ssh-keygen -lf ed25519_sk2 | awk '{print $2}' > ed25519_sk2.fp ssh-keygen -lf rsa_1-cert.pub | awk '{print $2}' > rsa_1-cert.fp ssh-keygen -lf ecdsa_1-cert.pub | awk '{print $2}' > ecdsa_1-cert.fp ssh-keygen -lf ed25519_1-cert.pub | awk '{print $2}' > ed25519_1-cert.fp +ssh-keygen -lf mldsa44_ed25519_1-cert.pub | awk '{print $2}' > mldsa44_ed25519_1-cert.fp ssh-keygen -lf ecdsa_sk1-cert.pub | awk '{print $2}' > ecdsa_sk1-cert.fp ssh-keygen -lf ed25519_sk1-cert.pub | awk '{print $2}' > ed25519_sk1-cert.fp ssh-keygen -Bf rsa_1 | awk '{print $2}' > rsa_1.fp.bb ssh-keygen -Bf ecdsa_1 | awk '{print $2}' > ecdsa_1.fp.bb ssh-keygen -Bf ed25519_1 | awk '{print $2}' > ed25519_1.fp.bb +ssh-keygen -Bf mldsa44_ed25519_1 | awk '{print $2}' > mldsa44_ed25519_1.fp.bb ssh-keygen -Bf ecdsa_sk1 | awk '{print $2}' > ecdsa_sk1.fp.bb ssh-keygen -Bf ed25519_sk1 | awk '{print $2}' > ed25519_sk1.fp.bb ssh-keygen -Bf rsa_2 | awk '{print $2}' > rsa_2.fp.bb ssh-keygen -Bf ecdsa_2 | awk '{print $2}' > ecdsa_2.fp.bb ssh-keygen -Bf ed25519_2 | awk '{print $2}' > ed25519_2.fp.bb +ssh-keygen -Bf mldsa44_ed25519_2 | awk '{print $2}' > mldsa44_ed25519_2.fp.bb ssh-keygen -Bf ecdsa_sk2 | awk '{print $2}' > ecdsa_sk2.fp.bb ssh-keygen -Bf ed25519_sk2 | awk '{print $2}' > ed25519_sk2.fp.bb diff --git a/regress/unittests/sshkey/test_file.c b/regress/unittests/sshkey/test_file.c index e412b75d8321..296e90e78722 100644 --- a/regress/unittests/sshkey/test_file.c +++ b/regress/unittests/sshkey/test_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_file.c,v 1.13 2025/05/06 06:05:48 djm Exp $ */ +/* $OpenBSD: test_file.c,v 1.14 2026/06/14 04:08:06 djm Exp $ */ /* * Regress test for sshkey.h key management API * @@ -330,6 +330,71 @@ sshkey_file_tests(void) sshkey_free(k1); + TEST_START("parse MLDSA44-ED25519 from private"); + buf = load_file("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshbuf_free(buf); + ASSERT_PTR_NE(k1, NULL); + ASSERT_INT_EQ(k1->type, KEY_MLDSA44_ED25519); + TEST_DONE(); + + TEST_START("parse MLDSA44-ED25519 from private w/ passphrase"); + buf = load_file("mldsa44_ed25519_1_pw"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, + (const char *)sshbuf_ptr(pw), &k2, NULL), 0); + sshbuf_free(buf); + ASSERT_PTR_NE(k2, NULL); + ASSERT_INT_EQ(sshkey_equal(k1, k2), 1); + sshkey_free(k2); + TEST_DONE(); + + TEST_START("load MLDSA44-ED25519 from public"); + ASSERT_INT_EQ(sshkey_load_public( + test_data_file("mldsa44_ed25519_1.pub"), &k2, NULL), 0); + ASSERT_PTR_NE(k2, NULL); + ASSERT_INT_EQ(sshkey_equal(k1, k2), 1); + sshkey_free(k2); + TEST_DONE(); + + TEST_START("load MLDSA44-ED25519 cert"); + ASSERT_INT_EQ(sshkey_load_cert( + test_data_file("mldsa44_ed25519_1"), &k2), 0); + ASSERT_PTR_NE(k2, NULL); + ASSERT_INT_EQ(k2->type, KEY_MLDSA44_ED25519_CERT); + ASSERT_INT_EQ(sshkey_equal(k1, k2), 0); + ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1); + TEST_DONE(); + + TEST_START("MLDSA44-ED25519 key hex fingerprint"); + buf = load_text_file("mldsa44_ed25519_1.fp"); + cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64); + ASSERT_PTR_NE(cp, NULL); + ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf)); + sshbuf_free(buf); + free(cp); + TEST_DONE(); + + TEST_START("MLDSA44-ED25519 cert hex fingerprint"); + buf = load_text_file("mldsa44_ed25519_1-cert.fp"); + cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64); + ASSERT_PTR_NE(cp, NULL); + ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf)); + sshbuf_free(buf); + free(cp); + sshkey_free(k2); + TEST_DONE(); + + TEST_START("MLDSA44-ED25519 key bubblebabble fingerprint"); + buf = load_text_file("mldsa44_ed25519_1.fp.bb"); + cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE); + ASSERT_PTR_NE(cp, NULL); + ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf)); + sshbuf_free(buf); + free(cp); + TEST_DONE(); + + sshkey_free(k1); + #ifdef ENABLE_SK #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) TEST_START("parse ECDSA-SK from private"); diff --git a/regress/unittests/sshkey/test_fuzz.c b/regress/unittests/sshkey/test_fuzz.c index d0f47d7cfd1d..fb178c1e4d15 100644 --- a/regress/unittests/sshkey/test_fuzz.c +++ b/regress/unittests/sshkey/test_fuzz.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_fuzz.c,v 1.15 2025/05/06 06:05:48 djm Exp $ */ +/* $OpenBSD: test_fuzz.c,v 1.16 2026/06/14 04:08:06 djm Exp $ */ /* * Fuzz tests for key parsing * @@ -52,10 +52,12 @@ public_fuzz(struct sshkey *k) u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP | FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END; - if (test_is_fast()) + /* MLDSA44_ED25519 keys are large and slow to fuzz */ + if (test_is_fast() || sshkey_type_plain(k->type) == KEY_MLDSA44_ED25519) fuzzers &= ~FUZZ_1_BIT_FLIP; if (test_is_slow()) fuzzers |= FUZZ_2_BIT_FLIP | FUZZ_2_BYTE_FLIP; + ASSERT_PTR_NE(buf = sshbuf_new(), NULL); ASSERT_INT_EQ(sshkey_putb(k, buf), 0); fuzz = fuzz_begin(fuzzers, sshbuf_mutable_ptr(buf), sshbuf_len(buf)); @@ -80,7 +82,8 @@ sig_fuzz(struct sshkey *k, const char *sig_alg) u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP | FUZZ_2_BYTE_FLIP | FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END; - if (test_is_fast()) + /* MLDSA44_ED25519 keys are large and slow to fuzz */ + if (test_is_fast() || sshkey_type_plain(k->type) == KEY_MLDSA44_ED25519) fuzzers &= ~FUZZ_2_BYTE_FLIP; if (test_is_slow()) fuzzers |= FUZZ_2_BIT_FLIP; @@ -226,6 +229,32 @@ sshkey_fuzz_tests(void) fuzz_cleanup(fuzz); TEST_DONE(); + /* MLDSA44-ED25519 are large and slow to fuzz */ + TEST_START("fuzz MLDSA44-ED25519 private"); + buf = load_file("mldsa44_ed25519_1"); + fuzz = fuzz_begin(FUZZ_BASE64, sshbuf_mutable_ptr(buf), + sshbuf_len(buf)); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshkey_free(k1); + sshbuf_free(buf); + ASSERT_PTR_NE(fuzzed = sshbuf_new(), NULL); + TEST_ONERROR(onerror, fuzz); + for(i = 0; !fuzz_done(fuzz); i++, fuzz_next(fuzz)) { + r = sshbuf_put(fuzzed, fuzz_ptr(fuzz), fuzz_len(fuzz)); + ASSERT_INT_EQ(r, 0); + if (sshkey_parse_private_fileblob(fuzzed, "", &k1, NULL) == 0) + sshkey_free(k1); + sshbuf_reset(fuzzed); + if (test_is_fast() && i >= NUM_FAST_BASE64_TESTS) + break; + /* MLDSA44_ED25519 keys are large and slow to fuzz */ + if (!test_is_slow() || i >= NUM_FAST_BASE64_TESTS) + break; + } + sshbuf_free(fuzzed); + fuzz_cleanup(fuzz); + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("fuzz RSA public"); buf = load_file("rsa_1"); @@ -272,6 +301,21 @@ sshkey_fuzz_tests(void) sshkey_free(k1); TEST_DONE(); + TEST_START("fuzz MLDSA44-ED25519 public"); + buf = load_file("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshbuf_free(buf); + public_fuzz(k1); + sshkey_free(k1); + TEST_DONE(); + + TEST_START("fuzz MLDSA44-ED25519 cert"); + ASSERT_INT_EQ(sshkey_load_cert( + test_data_file("mldsa44_ed25519_1"), &k1), 0); + public_fuzz(k1); + sshkey_free(k1); + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("fuzz RSA sig"); buf = load_file("rsa_1"); @@ -316,6 +360,14 @@ sshkey_fuzz_tests(void) sshkey_free(k1); TEST_DONE(); + TEST_START("fuzz MLDSA44-ED25519 sig"); + buf = load_file("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshbuf_free(buf); + sig_fuzz(k1, NULL); + sshkey_free(k1); + TEST_DONE(); + /* XXX fuzz decoded new-format blobs too */ /* XXX fuzz XMSS too */ diff --git a/regress/unittests/sshkey/test_sshkey.c b/regress/unittests/sshkey/test_sshkey.c index 1701c87c54a8..ec0ce452c751 100644 --- a/regress/unittests/sshkey/test_sshkey.c +++ b/regress/unittests/sshkey/test_sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_sshkey.c,v 1.33 2026/03/06 06:57:33 dtucker Exp $ */ +/* $OpenBSD: test_sshkey.c,v 1.34 2026/06/14 04:08:06 djm Exp $ */ /* * Regress test for sshkey.h key management API * @@ -291,6 +291,15 @@ sshkey_tests(void) k1 = NULL; TEST_DONE(); + TEST_START("new/free KEY_MLDSA44_ED25519"); + k1 = sshkey_new(KEY_MLDSA44_ED25519); + ASSERT_PTR_NE(k1, NULL); + ASSERT_PTR_EQ(k1->mldsa_ed25519_sk, NULL); + ASSERT_PTR_EQ(k1->mldsa_ed25519_pk, NULL); + sshkey_free(k1); + k1 = NULL; + TEST_DONE(); + TEST_START("generate KEY_RSA too small modulus"); ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 128, &k1), SSH_ERR_KEY_LENGTH); @@ -348,6 +357,16 @@ sshkey_tests(void) ASSERT_PTR_NE(kf->ed25519_sk, NULL); TEST_DONE(); + TEST_START("generate KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k1), 0); + ASSERT_PTR_NE(k1, NULL); + ASSERT_INT_EQ(k1->type, KEY_MLDSA44_ED25519); + ASSERT_PTR_NE(k1->mldsa_ed25519_pk, NULL); + ASSERT_PTR_NE(k1->mldsa_ed25519_sk, NULL); + sshkey_free(k1); + k1 = NULL; + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("demote KEY_RSA"); ASSERT_INT_EQ(sshkey_from_private(kr, &k1), 0); @@ -404,6 +423,23 @@ sshkey_tests(void) k1 = NULL; TEST_DONE(); + TEST_START("demote KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k2), 0); + ASSERT_INT_EQ(sshkey_from_private(k2, &k1), 0); + ASSERT_PTR_NE(k1, NULL); + ASSERT_PTR_NE(k2, k1); + ASSERT_INT_EQ(k1->type, KEY_MLDSA44_ED25519); + ASSERT_PTR_NE(k1->mldsa_ed25519_pk, NULL); + ASSERT_PTR_EQ(k1->mldsa_ed25519_sk, NULL); + TEST_DONE(); + + TEST_START("equal KEY_MLDSA44_ED25519/demoted KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_equal(k2, k1), 1); + sshkey_free(k1); + sshkey_free(k2); + k1 = k2 = NULL; + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("equal mismatched key types"); ASSERT_INT_EQ(sshkey_equal(kd, kr), 0); @@ -433,6 +469,12 @@ sshkey_tests(void) ASSERT_INT_EQ(sshkey_equal(kf, k1), 0); sshkey_free(k1); k1 = NULL; + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k1), 0); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k2), 0); + ASSERT_INT_EQ(sshkey_equal(k2, k1), 0); + sshkey_free(k1); + sshkey_free(k2); + k1 = k2 = NULL; TEST_DONE(); #ifdef WITH_OPENSSL @@ -491,6 +533,52 @@ sshkey_tests(void) sshbuf_reset(b); TEST_DONE(); + TEST_START("certify key MLDSA44-ED25519"); + ASSERT_INT_EQ(sshkey_load_public( + test_data_file("mldsa44_ed25519_1.pub"), &k1, NULL), 0); + k2 = get_private("mldsa44_ed25519_2"); + ASSERT_INT_EQ(sshkey_to_certified(k1), 0); + ASSERT_PTR_NE(k1->cert, NULL); + k1->cert->type = SSH2_CERT_TYPE_USER; + k1->cert->serial = 1234; + k1->cert->key_id = strdup("estragon"); + ASSERT_PTR_NE(k1->cert->key_id, NULL); + k1->cert->principals = calloc(4, sizeof(*k1->cert->principals)); + ASSERT_PTR_NE(k1->cert->principals, NULL); + k1->cert->principals[0] = strdup("estragon"); + k1->cert->principals[1] = strdup("vladimir"); + k1->cert->principals[2] = strdup("pozzo"); + k1->cert->principals[3] = strdup("lucky"); + ASSERT_PTR_NE(k1->cert->principals[0], NULL); + ASSERT_PTR_NE(k1->cert->principals[1], NULL); + ASSERT_PTR_NE(k1->cert->principals[2], NULL); + ASSERT_PTR_NE(k1->cert->principals[3], NULL); + k1->cert->nprincipals = 4; + k1->cert->valid_after = 0; + k1->cert->valid_before = (uint64_t)-1; + sshbuf_free(k1->cert->critical); + k1->cert->critical = sshbuf_new(); + ASSERT_PTR_NE(k1->cert->critical, NULL); + sshbuf_free(k1->cert->extensions); + k1->cert->extensions = sshbuf_new(); + ASSERT_PTR_NE(k1->cert->extensions, NULL); + put_opt(k1->cert->critical, "force-command", "/usr/bin/true"); + put_opt(k1->cert->critical, "source-address", "127.0.0.1"); + put_opt(k1->cert->extensions, "permit-X11-forwarding", NULL); + put_opt(k1->cert->extensions, "permit-agent-forwarding", NULL); + ASSERT_INT_EQ(sshkey_from_private(k2, &k1->cert->signature_key), 0); + ASSERT_INT_EQ(sshkey_certify(k1, k2, NULL, NULL, NULL), 0); + b = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_INT_EQ(sshkey_putb(k1, b), 0); + ASSERT_INT_EQ(sshkey_from_blob(sshbuf_ptr(b), sshbuf_len(b), &k3), 0); + sshkey_free(k1); + sshkey_free(k2); + sshkey_free(k3); + k1 = k2 = k3 = NULL; + sshbuf_reset(b); + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("sign and verify RSA"); k1 = get_private("rsa_1"); @@ -546,6 +634,16 @@ sshkey_tests(void) k1 = k2 = NULL; TEST_DONE(); + TEST_START("sign and verify MLDSA44-ED25519"); + k1 = get_private("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_load_public( + test_data_file("mldsa44_ed25519_2.pub"), &k2, NULL), 0); + signature_tests(k1, k2, NULL); + sshkey_free(k1); + sshkey_free(k2); + k1 = k2 = NULL; + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("nested certificate"); ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1"), &k1), 0); @@ -626,6 +724,15 @@ sshkey_benchmarks(void) TEST_DONE(); BENCH_FINISH("keys"); + BENCH_START("generate MLDSA44-ED25519"); + TEST_START("generate KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k), 0); + ASSERT_PTR_NE(k, NULL); + sshkey_free(k); + k = NULL; + TEST_DONE(); + BENCH_FINISH("keys"); + #ifdef WITH_OPENSSL /* sign */ signature_benchmark("RSA-1024/SHA1", KEY_RSA, 1024, "ssh-rsa", 0); @@ -638,6 +745,7 @@ sshkey_benchmarks(void) signature_benchmark("ECDSA-384", KEY_ECDSA, 384, NULL, 0); signature_benchmark("ECDSA-521", KEY_ECDSA, 521, NULL, 0); signature_benchmark("ED25519", KEY_ED25519, 0, NULL, 0); + signature_benchmark("MLDSA44-ED25519", KEY_MLDSA44_ED25519, 0, NULL, 0); /* verify */ signature_benchmark("RSA-1024/SHA1", KEY_RSA, 1024, "ssh-rsa", 1); @@ -651,4 +759,5 @@ sshkey_benchmarks(void) signature_benchmark("ECDSA-521", KEY_ECDSA, 521, NULL, 1); #endif /* WITH_OPENSSL */ signature_benchmark("ED25519", KEY_ED25519, 0, NULL, 1); + signature_benchmark("MLDSA44-ED25519", KEY_MLDSA44_ED25519, 0, NULL, 1); } diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1 b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1 new file mode 100644 index 000000000000..e06c5fbf43ce --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1 @@ -0,0 +1,58 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAFZwAAAB9zc2gtbW +xkc2E0NC1lZDI1NTE5QG9wZW5zc2guY29tAAAFQPEEG3OCkPJKhPXRLVROsGaP7+F0Zkbn +zSRo/RpT7SUfuReVG73s9rU31tqeMdARV8YE9Q/gT1NjRapXxHDoFemBMz5pVO8xwBdD+L +zN1PUgYx8l7uyyk7B3Hd/JuYivudlEXYLzNYCpM4K3KgP23F2zbWVNxymD3YdCAGLMt+7+ +sE1SdxPci48RCu2gaC5VJ1x0iDjntw7WEl6rJq0H5UmfFkFA2NZphCzzmgdmzifSzMSRyO +QE49CxZHtKYVksyMtWwu9tfJs/Y/M2oKwD78mxpfzYqET+VcetR1zQ/wlFq94ux/drFhYC +oLGj6rPHOqloIKAc7uB7iG+hrRnzI6FVpn5BVjBo2+IxzmlT5q2/Q1aaT9mVi/fWpdgMfU +XbO9oQCVHEgRlpPYaUF9j+GgagaJ4eif8VI2h7BqxWoeeFFmNjOcTkgeXC6G7bs4Xos1Kx +tVHlkxVh0z12a8+hYyN4JoZl2bjCWS64fcWHFWKm1h/MCVqObZ65Ed5OyylZCV3nmfhrtA +zcjoTJp25bdTHJ/T/ruTSgGbrTXm7szhfdXecu5vrE6DPh/RDPq7Byjqzab3b3BGeW2je2 +P46s5/eC68jh03UN8m5frde0DstkIgLSsZ7Kxi0r/jIDFv6u/v7ub1LfNvzo7Y0F3RBmZm +QboC+ASvmeW0qe6kavxfZhQJi7BJDQdKYLXMYxIwkaqNZX06oWX1yf3BxngIkZhinGhRav +rhcOmsow+TVwCeFYWlcyr2wotfZov0A1aLXFjesV9LfPNwz+46dcnPrMtTLcnNzfdvgPpv +wgWvcu51794gHCz3qB+Wi83qcA/9LpPJValjRjzEptd+hFUlwXeO0mu27I6mMRDdXr5qP2 +YKYQ44u1NsuYy7gYOSUzXw420SXRel8Nx0+Ifpi62ZPooh85EiofVyOlCNwFc6KhWfUvPB +aWJ6gnYYf6mgK7hImEio1A69dKyfUI+ewUaOQRcRzbDa/vV3t1KGA3YeboTdzowmCjQucF +UNQz2nr5wonrfZO0y5AJO3h5eK+ZEuqwlCQcgV5g6eo9U7Ea5Ywl80lLTkBV0Bdxn1VPDr +cVnIZqDJo9uzA9gIZkREFqnqQGnoVJOU6tu7LU7VyQ0jmW0x4kzBQQkfziSkwpMB1lfSDO +PKGenaMVvZ1mTmi+e6e7JjT99Twiu0ajohdMVfv4a8xt2XYP+xdEu7O7Jg1K1/cXVK7Pxd +4HdxL1oPkipmuzcX1MS42Bd0yKsGt1CcNpolEelZWxMPEruzUFDw7A9bkRi/UPCfi+Inu4 +UidwaMmOgIKZyufE/KPg0ssG5my7HGO/lChgWvkg98U/TpYrTUNCvRhefcDv7Lzpc3Hw5g +8SpOvy1knOeS41pXA+94WIxoC4EFgNDAw0C68aXlAKwhJm4WL0C9spPdEsIEHl/w4nhudU +eeBB4ll0wC1mPRyRGd/m9YM77D/2KgPl2sA046Bli/tK6fj+pTBW57uMCuJuWC2b//gfIw +9JdNGpd60C3VZ8ImZjVWRbW4CB1F/vpRgGv9EuD0uVoJ+6pYl41x/Tm2fE7BUerrHl2Q1J +5SlbhJN8vsLzxnezOrP46Xa+/gYIyrGCLaLMyzoTBlLWKjjhT9oXYvl7SpSuk2EHyU9TXK +XU/gp8szcdb66nRHeBTvQ66i902QDr3RCZtZ6klAoZUwOHGmeF9T9qZgSXjgtO/9KIkfoR +zX5rSnEiPr4wV1jWGvdl0PB4ZGrsi4lX0eB8w0PyVQFErhQ+E/+4v5IE0xE1+k4SIEG8Zb +ZvFxPDqEynFgAABdgs9rd9LPa3fQAAAB9zc2gtbWxkc2E0NC1lZDI1NTE5QG9wZW5zc2gu +Y29tAAAFQPEEG3OCkPJKhPXRLVROsGaP7+F0ZkbnzSRo/RpT7SUfuReVG73s9rU31tqeMd +ARV8YE9Q/gT1NjRapXxHDoFemBMz5pVO8xwBdD+LzN1PUgYx8l7uyyk7B3Hd/JuYivudlE +XYLzNYCpM4K3KgP23F2zbWVNxymD3YdCAGLMt+7+sE1SdxPci48RCu2gaC5VJ1x0iDjntw +7WEl6rJq0H5UmfFkFA2NZphCzzmgdmzifSzMSRyOQE49CxZHtKYVksyMtWwu9tfJs/Y/M2 +oKwD78mxpfzYqET+VcetR1zQ/wlFq94ux/drFhYCoLGj6rPHOqloIKAc7uB7iG+hrRnzI6 +FVpn5BVjBo2+IxzmlT5q2/Q1aaT9mVi/fWpdgMfUXbO9oQCVHEgRlpPYaUF9j+GgagaJ4e +if8VI2h7BqxWoeeFFmNjOcTkgeXC6G7bs4Xos1KxtVHlkxVh0z12a8+hYyN4JoZl2bjCWS +64fcWHFWKm1h/MCVqObZ65Ed5OyylZCV3nmfhrtAzcjoTJp25bdTHJ/T/ruTSgGbrTXm7s +zhfdXecu5vrE6DPh/RDPq7Byjqzab3b3BGeW2je2P46s5/eC68jh03UN8m5frde0DstkIg +LSsZ7Kxi0r/jIDFv6u/v7ub1LfNvzo7Y0F3RBmZmQboC+ASvmeW0qe6kavxfZhQJi7BJDQ +dKYLXMYxIwkaqNZX06oWX1yf3BxngIkZhinGhRavrhcOmsow+TVwCeFYWlcyr2wotfZov0 +A1aLXFjesV9LfPNwz+46dcnPrMtTLcnNzfdvgPpvwgWvcu51794gHCz3qB+Wi83qcA/9Lp +PJValjRjzEptd+hFUlwXeO0mu27I6mMRDdXr5qP2YKYQ44u1NsuYy7gYOSUzXw420SXRel +8Nx0+Ifpi62ZPooh85EiofVyOlCNwFc6KhWfUvPBaWJ6gnYYf6mgK7hImEio1A69dKyfUI ++ewUaOQRcRzbDa/vV3t1KGA3YeboTdzowmCjQucFUNQz2nr5wonrfZO0y5AJO3h5eK+ZEu +qwlCQcgV5g6eo9U7Ea5Ywl80lLTkBV0Bdxn1VPDrcVnIZqDJo9uzA9gIZkREFqnqQGnoVJ +OU6tu7LU7VyQ0jmW0x4kzBQQkfziSkwpMB1lfSDOPKGenaMVvZ1mTmi+e6e7JjT99Twiu0 +ajohdMVfv4a8xt2XYP+xdEu7O7Jg1K1/cXVK7Pxd4HdxL1oPkipmuzcX1MS42Bd0yKsGt1 +CcNpolEelZWxMPEruzUFDw7A9bkRi/UPCfi+Inu4UidwaMmOgIKZyufE/KPg0ssG5my7HG +O/lChgWvkg98U/TpYrTUNCvRhefcDv7Lzpc3Hw5g8SpOvy1knOeS41pXA+94WIxoC4EFgN +DAw0C68aXlAKwhJm4WL0C9spPdEsIEHl/w4nhudUeeBB4ll0wC1mPRyRGd/m9YM77D/2Kg +Pl2sA046Bli/tK6fj+pTBW57uMCuJuWC2b//gfIw9JdNGpd60C3VZ8ImZjVWRbW4CB1F/v +pRgGv9EuD0uVoJ+6pYl41x/Tm2fE7BUerrHl2Q1J5SlbhJN8vsLzxnezOrP46Xa+/gYIyr +GCLaLMyzoTBlLWKjjhT9oXYvl7SpSuk2EHyU9TXKXU/gp8szcdb66nRHeBTvQ66i902QDr +3RCZtZ6klAoZUwOHGmeF9T9qZgSXjgtO/9KIkfoRzX5rSnEiPr4wV1jWGvdl0PB4ZGrsi4 +lX0eB8w0PyVQFErhQ+E/+4v5IE0xE1+k4SIEG8ZbZvFxPDqEynFgAAAEAy11NtmC4I8S62 +N3waM7qJ4N/lwwc276O8JNTnAdVfl0eKZEa9xjIP3Hi0sV7x16n7TqOl8+TcIxaIck/Bey +kwAAAAG01MRFNBNDQtRUQyNTUxOSB0ZXN0IGtleSAjMQECAwQFBg== +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp new file mode 100644 index 000000000000..7f4ab4e7f65a --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp @@ -0,0 +1 @@ +SHA256:MHrtMS/Vf35zxTemIBpFyKqv9rT1bd1XMLqM9CnT8WY diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub new file mode 100644 index 000000000000..d076e5118124 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519-cert-v01@openssh.com AAAAKHNzaC1tbGRzYTQ0LWVkMjU1MTktY2VydC12MDFAb3BlbnNzaC5jb20AAAAgcCxqx/etG+GuzLfWqNiUZ7mUjLru2WzytiIn5MNlvNcAAAVA8QQbc4KQ8kqE9dEtVE6wZo/v4XRmRufNJGj9GlPtJR+5F5Ubvez2tTfW2p4x0BFXxgT1D+BPU2NFqlfEcOgV6YEzPmlU7zHAF0P4vM3U9SBjHyXu7LKTsHcd38m5iK+52URdgvM1gKkzgrcqA/bcXbNtZU3HKYPdh0IAYsy37v6wTVJ3E9yLjxEK7aBoLlUnXHSIOOe3DtYSXqsmrQflSZ8WQUDY1mmELPOaB2bOJ9LMxJHI5ATj0LFke0phWSzIy1bC7218mz9j8zagrAPvybGl/NioRP5Vx61HXND/CUWr3i7H92sWFgKgsaPqs8c6qWggoBzu4HuIb6GtGfMjoVWmfkFWMGjb4jHOaVPmrb9DVppP2ZWL99al2Ax9Rds72hAJUcSBGWk9hpQX2P4aBqBonh6J/xUjaHsGrFah54UWY2M5xOSB5cLobtuzheizUrG1UeWTFWHTPXZrz6FjI3gmhmXZuMJZLrh9xYcVYqbWH8wJWo5tnrkR3k7LKVkJXeeZ+Gu0DNyOhMmnblt1Mcn9P+u5NKAZutNebuzOF91d5y7m+sToM+H9EM+rsHKOrNpvdvcEZ5baN7Y/jqzn94LryOHTdQ3ybl+t17QOy2QiAtKxnsrGLSv+MgMW/q7+/u5vUt82/OjtjQXdEGZmZBugL4BK+Z5bSp7qRq/F9mFAmLsEkNB0pgtcxjEjCRqo1lfTqhZfXJ/cHGeAiRmGKcaFFq+uFw6ayjD5NXAJ4VhaVzKvbCi19mi/QDVotcWN6xX0t883DP7jp1yc+sy1Mtyc3N92+A+m/CBa9y7nXv3iAcLPeoH5aLzepwD/0uk8lVqWNGPMSm136EVSXBd47Sa7bsjqYxEN1evmo/ZgphDji7U2y5jLuBg5JTNfDjbRJdF6Xw3HT4h+mLrZk+iiHzkSKh9XI6UI3AVzoqFZ9S88FpYnqCdhh/qaAruEiYSKjUDr10rJ9Qj57BRo5BFxHNsNr+9Xe3UoYDdh5uhN3OjCYKNC5wVQ1DPaevnCiet9k7TLkAk7eHl4r5kS6rCUJByBXmDp6j1TsRrljCXzSUtOQFXQF3GfVU8OtxWchmoMmj27MD2AhmREQWqepAaehUk5Tq27stTtXJDSOZbTHiTMFBCR/OJKTCkwHWV9IM48oZ6doxW9nWZOaL57p7smNP31PCK7RqOiF0xV+/hrzG3Zdg/7F0S7s7smDUrX9xdUrs/F3gd3EvWg+SKma7NxfUxLjYF3TIqwa3UJw2miUR6VlbEw8Su7NQUPDsD1uRGL9Q8J+L4ie7hSJ3BoyY6AgpnK58T8o+DSywbmbLscY7+UKGBa+SD3xT9OlitNQ0K9GF59wO/svOlzcfDmDxKk6/LWSc55LjWlcD73hYjGgLgQWA0MDDQLrxpeUArCEmbhYvQL2yk90SwgQeX/DieG51R54EHiWXTALWY9HJEZ3+b1gzvsP/YqA+XawDTjoGWL+0rp+P6lMFbnu4wK4m5YLZv/+B8jD0l00al3rQLdVnwiZmNVZFtbgIHUX++lGAa/0S4PS5Wgn7qliXjXH9ObZ8TsFR6useXZDUnlKVuEk3y+wvPGd7M6s/jpdr7+BgjKsYItoszLOhMGUtYqOOFP2hdi+XtKlK6TYQfJT1NcpdT+CnyzNx1vrqdEd4FO9DrqL3TZAOvdEJm1nqSUChlTA4caZ4X1P2pmBJeOC07/0oiR+hHNfmtKcSI+vjBXWNYa92XQ8HhkauyLiVfR4HzDQ/JVAUSuFD4T/7i/kgTTETX6ThIgQbxltm8XE8OoTKcWAAAAAAAAAAgAAAACAAAABmp1bGl1cwAAABIAAAAFaG9zdDEAAAAFaG9zdDIAAAAANouDYAAAAABNHeHgAAAAAAAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAhFpxIluaiv+6TtAqAvQbSMns/0Ta+OVHZ9uvy6CrnswAAAFMAAAALc3NoLWVkMjU1MTkAAABASbd3yUNRkfDqbKkNCuaEcI0bxeQqVCOdp5TIDGBy3YiYudknX0VWiGYkdY2ULua4OevDBgXNQ1b+j5xMBLLUAw== MLDSA44-ED25519 test key #1 diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp new file mode 100644 index 000000000000..7f4ab4e7f65a --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp @@ -0,0 +1 @@ +SHA256:MHrtMS/Vf35zxTemIBpFyKqv9rT1bd1XMLqM9CnT8WY diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb new file mode 100644 index 000000000000..071c90bcb181 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb @@ -0,0 +1 @@ +xehik-vycid-vovos-cumor-hydoz-zimyd-pidut-rugyv-keseb-nupyb-ryxux diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub new file mode 100644 index 000000000000..f31f8b82a8b0 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519@openssh.com AAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNzaC5jb20AAAVA8QQbc4KQ8kqE9dEtVE6wZo/v4XRmRufNJGj9GlPtJR+5F5Ubvez2tTfW2p4x0BFXxgT1D+BPU2NFqlfEcOgV6YEzPmlU7zHAF0P4vM3U9SBjHyXu7LKTsHcd38m5iK+52URdgvM1gKkzgrcqA/bcXbNtZU3HKYPdh0IAYsy37v6wTVJ3E9yLjxEK7aBoLlUnXHSIOOe3DtYSXqsmrQflSZ8WQUDY1mmELPOaB2bOJ9LMxJHI5ATj0LFke0phWSzIy1bC7218mz9j8zagrAPvybGl/NioRP5Vx61HXND/CUWr3i7H92sWFgKgsaPqs8c6qWggoBzu4HuIb6GtGfMjoVWmfkFWMGjb4jHOaVPmrb9DVppP2ZWL99al2Ax9Rds72hAJUcSBGWk9hpQX2P4aBqBonh6J/xUjaHsGrFah54UWY2M5xOSB5cLobtuzheizUrG1UeWTFWHTPXZrz6FjI3gmhmXZuMJZLrh9xYcVYqbWH8wJWo5tnrkR3k7LKVkJXeeZ+Gu0DNyOhMmnblt1Mcn9P+u5NKAZutNebuzOF91d5y7m+sToM+H9EM+rsHKOrNpvdvcEZ5baN7Y/jqzn94LryOHTdQ3ybl+t17QOy2QiAtKxnsrGLSv+MgMW/q7+/u5vUt82/OjtjQXdEGZmZBugL4BK+Z5bSp7qRq/F9mFAmLsEkNB0pgtcxjEjCRqo1lfTqhZfXJ/cHGeAiRmGKcaFFq+uFw6ayjD5NXAJ4VhaVzKvbCi19mi/QDVotcWN6xX0t883DP7jp1yc+sy1Mtyc3N92+A+m/CBa9y7nXv3iAcLPeoH5aLzepwD/0uk8lVqWNGPMSm136EVSXBd47Sa7bsjqYxEN1evmo/ZgphDji7U2y5jLuBg5JTNfDjbRJdF6Xw3HT4h+mLrZk+iiHzkSKh9XI6UI3AVzoqFZ9S88FpYnqCdhh/qaAruEiYSKjUDr10rJ9Qj57BRo5BFxHNsNr+9Xe3UoYDdh5uhN3OjCYKNC5wVQ1DPaevnCiet9k7TLkAk7eHl4r5kS6rCUJByBXmDp6j1TsRrljCXzSUtOQFXQF3GfVU8OtxWchmoMmj27MD2AhmREQWqepAaehUk5Tq27stTtXJDSOZbTHiTMFBCR/OJKTCkwHWV9IM48oZ6doxW9nWZOaL57p7smNP31PCK7RqOiF0xV+/hrzG3Zdg/7F0S7s7smDUrX9xdUrs/F3gd3EvWg+SKma7NxfUxLjYF3TIqwa3UJw2miUR6VlbEw8Su7NQUPDsD1uRGL9Q8J+L4ie7hSJ3BoyY6AgpnK58T8o+DSywbmbLscY7+UKGBa+SD3xT9OlitNQ0K9GF59wO/svOlzcfDmDxKk6/LWSc55LjWlcD73hYjGgLgQWA0MDDQLrxpeUArCEmbhYvQL2yk90SwgQeX/DieG51R54EHiWXTALWY9HJEZ3+b1gzvsP/YqA+XawDTjoGWL+0rp+P6lMFbnu4wK4m5YLZv/+B8jD0l00al3rQLdVnwiZmNVZFtbgIHUX++lGAa/0S4PS5Wgn7qliXjXH9ObZ8TsFR6useXZDUnlKVuEk3y+wvPGd7M6s/jpdr7+BgjKsYItoszLOhMGUtYqOOFP2hdi+XtKlK6TYQfJT1NcpdT+CnyzNx1vrqdEd4FO9DrqL3TZAOvdEJm1nqSUChlTA4caZ4X1P2pmBJeOC07/0oiR+hHNfmtKcSI+vjBXWNYa92XQ8HhkauyLiVfR4HzDQ/JVAUSuFD4T/7i/kgTTETX6ThIgQbxltm8XE8OoTKcW MLDSA44-ED25519 test key #1 diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw new file mode 100644 index 000000000000..fdf9cae6f2ec --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw @@ -0,0 +1,59 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDIBnOrxJ +0GUTVroCc7LYB/AAAAGAAAAAEAAAVnAAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNz +aC5jb20AAAVA8QQbc4KQ8kqE9dEtVE6wZo/v4XRmRufNJGj9GlPtJR+5F5Ubvez2tTfW2p +4x0BFXxgT1D+BPU2NFqlfEcOgV6YEzPmlU7zHAF0P4vM3U9SBjHyXu7LKTsHcd38m5iK+5 +2URdgvM1gKkzgrcqA/bcXbNtZU3HKYPdh0IAYsy37v6wTVJ3E9yLjxEK7aBoLlUnXHSIOO +e3DtYSXqsmrQflSZ8WQUDY1mmELPOaB2bOJ9LMxJHI5ATj0LFke0phWSzIy1bC7218mz9j +8zagrAPvybGl/NioRP5Vx61HXND/CUWr3i7H92sWFgKgsaPqs8c6qWggoBzu4HuIb6GtGf +MjoVWmfkFWMGjb4jHOaVPmrb9DVppP2ZWL99al2Ax9Rds72hAJUcSBGWk9hpQX2P4aBqBo +nh6J/xUjaHsGrFah54UWY2M5xOSB5cLobtuzheizUrG1UeWTFWHTPXZrz6FjI3gmhmXZuM +JZLrh9xYcVYqbWH8wJWo5tnrkR3k7LKVkJXeeZ+Gu0DNyOhMmnblt1Mcn9P+u5NKAZutNe +buzOF91d5y7m+sToM+H9EM+rsHKOrNpvdvcEZ5baN7Y/jqzn94LryOHTdQ3ybl+t17QOy2 +QiAtKxnsrGLSv+MgMW/q7+/u5vUt82/OjtjQXdEGZmZBugL4BK+Z5bSp7qRq/F9mFAmLsE +kNB0pgtcxjEjCRqo1lfTqhZfXJ/cHGeAiRmGKcaFFq+uFw6ayjD5NXAJ4VhaVzKvbCi19m +i/QDVotcWN6xX0t883DP7jp1yc+sy1Mtyc3N92+A+m/CBa9y7nXv3iAcLPeoH5aLzepwD/ +0uk8lVqWNGPMSm136EVSXBd47Sa7bsjqYxEN1evmo/ZgphDji7U2y5jLuBg5JTNfDjbRJd +F6Xw3HT4h+mLrZk+iiHzkSKh9XI6UI3AVzoqFZ9S88FpYnqCdhh/qaAruEiYSKjUDr10rJ +9Qj57BRo5BFxHNsNr+9Xe3UoYDdh5uhN3OjCYKNC5wVQ1DPaevnCiet9k7TLkAk7eHl4r5 +kS6rCUJByBXmDp6j1TsRrljCXzSUtOQFXQF3GfVU8OtxWchmoMmj27MD2AhmREQWqepAae +hUk5Tq27stTtXJDSOZbTHiTMFBCR/OJKTCkwHWV9IM48oZ6doxW9nWZOaL57p7smNP31PC +K7RqOiF0xV+/hrzG3Zdg/7F0S7s7smDUrX9xdUrs/F3gd3EvWg+SKma7NxfUxLjYF3TIqw +a3UJw2miUR6VlbEw8Su7NQUPDsD1uRGL9Q8J+L4ie7hSJ3BoyY6AgpnK58T8o+DSywbmbL +scY7+UKGBa+SD3xT9OlitNQ0K9GF59wO/svOlzcfDmDxKk6/LWSc55LjWlcD73hYjGgLgQ +WA0MDDQLrxpeUArCEmbhYvQL2yk90SwgQeX/DieG51R54EHiWXTALWY9HJEZ3+b1gzvsP/ +YqA+XawDTjoGWL+0rp+P6lMFbnu4wK4m5YLZv/+B8jD0l00al3rQLdVnwiZmNVZFtbgIHU +X++lGAa/0S4PS5Wgn7qliXjXH9ObZ8TsFR6useXZDUnlKVuEk3y+wvPGd7M6s/jpdr7+Bg +jKsYItoszLOhMGUtYqOOFP2hdi+XtKlK6TYQfJT1NcpdT+CnyzNx1vrqdEd4FO9DrqL3TZ +AOvdEJm1nqSUChlTA4caZ4X1P2pmBJeOC07/0oiR+hHNfmtKcSI+vjBXWNYa92XQ8Hhkau +yLiVfR4HzDQ/JVAUSuFD4T/7i/kgTTETX6ThIgQbxltm8XE8OoTKcWAAAF4IJu4xhKCCAT +nGtM9HpYbikBGDeEhtoO8th7MxihQChEK4ImJchk7Zp74UR2YGK8vfFQoTeazqWKBaJmD5 +NV80eyEm4AOBJuzTdNXNk1yhqXOrq+UgzDjQ7HzAJH98DMLu2w3WvxCPPZoi8Zu6MVtOuZ +Exm6zN04CT+zs/LzJzqle8zN7coJwAM+apzOR4VMlSAh0XOEjdUfUpeCQJYeVox3usUI9T +6rCkxy1ZMk8qZyy6bftYIDY2OojsxFas1tuxwd/ypORX76c3ruORv6a3OB/sVgdAaTqQlP +HDsUurRautImLKmpHOMyiLsAT8SnnH3r1OJBFAPStCSjIusPTolhqJa81k9l7bJS8hPQb5 +6Jo5vNzwrO/XrqP/0aeMH8uu79dTj9/kvocIjROhVs9cZEABHzNa24DGRJybRTZqCm4pI/ +3V4QwuBQrXyqpkyl7Y0q4t7ScuoGu+i7EFN5XeHl36WVn/e23OBsjzjl/gKjLBDf9vmOqb +6JsrJCxpuHzXxbqgi84TSxlZ4QXWjQL/hTsAgNhMxJh2sIKEkQ5O0ZX/m1Z5aH4WCLGBJK +c105TvucEUoTvolIBHsOBPYag9TO6iFNsuAcnBV9gkLd5bIaV2MgFJXOLR6zzKAyb/59Pm +VSVzQEUUH704tfcqRWSpW6JCSFSX2m6+1h/289pdFVBK3WcNNsemcEJaFq0XP7PZjqW8uy +V5ReV2sGkR5Wdi4mUtE0flQ5PMPeVLWdFXpX5LOcAMSzrtndTg+x0JyIKkzBNQvEYQh74R +iFhf+JdoFa/a9RCg7qi8f2heoO+Z5m3kWSBGrtJae6901G43M7953WrZo86ZhZf+PGoivX +IO1IT5MLmsBD1L0sC1GSwXnakyv7Lgwzx6bsCc6jyhKIMc6uYFqzVoiax7f/BYLdi3wKIY +PYAeWJJnop1aDgbI8FJBImvce9iMK5jeH7jk5bEPb+mtIO+44rCq95wCboEIXemY+Dqlqb +CHS8whMXc1yprQnLj3hf76T58OaYNwDv6fec3I3eF1wSxIXEoeI4r03hGsroD1eJ3hXMwH ++MgDUT7+EAsh+wkUC9PvnhzB2CGcnwdRr8BZtiyhgm3Kkw40jJjf3Uyi62YJArV5XiYwWI +pqTk6kk9bZXUoBIRrW0Tt4dJBLrkWSeMwdtGwPsHsWqaBr7WSmQi2pRpqK8wpvVyB/KZCE +A0G+Nq5LAjw85FgW8h3MNOYBPTqFli325Jvtsn1as/KjG+7m7pc1KedX2lGN4y+5PynBcb +yerUdIr6xhn/8LN6korPB7EEjUBo8M1szs6mmsQ9tdrGmb4cdLjLQDnB4MWnYiOwgOUcIZ +dA4Y1XF4aYsiK/jl5uM3BXEq6mlgPDB0MHvxrDLOtBejLglqO+Mm9cbKKr+oGxkGJViabS +5D587UdrJ5d8/mlTLkikh0LXUS9SjSw5JkPyZZpcJ693nzA9/wcw9EkHG09DXpxU0Mdwu5 +q2bdh7jZ/bqhUQqpuEw39dXfIGSbYSxgMvASnWJtiKV06ffiuNw7nS67MO+r8qiGdQpC+R +vmCFjqQJF3kNd4WXg5jlkRAQqssz0oFcHKVu06tzX/KVD56ZQwtKAe01OpGa0s9/0tL7TY +8NCxOzzAL5qawQ0ZyYcW856R+54vGoMyKfG7jfN9QjZIn/WxDGOtRQDqqHBJHURYnLHczo +FcCcU7MR5MRT6hD75i/130fGcVIauXU6O1Yd0/N+K9aslAkZ75YWeQObL7ZucXhsqQDeeO +g3A1ZN0lZYr5kFfFio8juSDb1y/ukLz2EamTanXbo1V15x+XZh51EDAA8ISEy993qDvIS8 +EhuuPFWR9k1ssMaC/tJpgqQ6uIz/c5zRw9R1lRwcBmNT3+kuBXqWXcR13BYQ1zpcl1oPPo +rGp6IGlY+H2yQerRR8EKsFi4L12QH+CxuAsuMv+eFcqLXax9feetpuabWB3ItwgDLLn4+Q +SKsHIisqSi1zPyq0OdyZgY/OqsRW3ck8NJc= +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2 b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2 new file mode 100644 index 000000000000..f49cf8aa7aa0 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2 @@ -0,0 +1,58 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAFZwAAAB9zc2gtbW +xkc2E0NC1lZDI1NTE5QG9wZW5zc2guY29tAAAFQOcy63kPREcb1UtnuD9O6zFSOiaK0Aaa +FI+D7ikbE3cEKG/H6hAFpldBBrS1df5fs3gB4y4pClT5ZVSmVsurPMvSDgvOb67T56RPPu +fblXA2QD4YKyttiETIDqj8FulTEuL0QK57Lqkp2cOsD+F3qCPYDjr78g9XKKgL6WpYa0D9 +LXoUChsUylw6dDBZbUwg/p4X9bJFi/CYR0kEhPgkiRvW5EODy0NafinCfQ/Ghe9p3iWx7x +1Fl2sBcoH2FhxOx1FPnLRqNcMps/GaxHrJlg6LUWqeb700X9OHYGIhFEmClQuN1XDSimxD +F/cbOUCDswHQdNKKsXqh89jBBcoBKIiETui3u0CmW/sAS5PgYw383AkTPrRSUHWZQgXrJQ +wjx/f/KapsJ4wmLSr7Vx2kJEQO+mOJyK5K3dd40d8RTWggExXsXVLoINqpll0qmXz0ffVi +lT+IuYr+W2L7vStofFYUmZw6Nf+O6ZjxTy5vqZC/+9Kcy9oO4mDAec7CEPiqAfX+5YjZGF +adeI+B8UMBh2k/JmWXWUhLUtp0i28Tf025KFzg34kN7oGZZx2XpWXWKXxm1G/vKxXiel3n +nG725RbqLjYxGJqYsCGeKwF3uunOOHsq8dCLupcij2TY7vwwzm833QRE6Y8TQGcHT1v8e3 +uAJtM5M7hRU8fzz8/F4nLLdx366X5ffIQzN8zcFWFHUXPxJPKS7p0aQ7rfYzabZ2NOorVG +88oPWh7DZfZIDYKBekJVHNL2a80PefijVbB/+DeCkanTJUKjYMGq07Il/i2PXA6a9EVcRK +pniiSksRwaocxCTCVzZfnoLu2croijHvkSVNoCqF9c1Awmd53Gw5lZjbyJvABmuC1h0Q6U +PDsD2p1tPQ84QwSQ1C7SQhtuDCCeEPP6BOGCqhYTB6/TDSJZcptaIhNh2bOf2xrRgkHFge +d9JeYML+Xm1VqzNX2BWvV5EgFVtFVha20PdkrIMAZuyIU1IeVfJT62JjjGsT+GLkpZPfAg +7FQD6GGM7Czto4p5H52Tr8KhVUMDxbtEZszOG89bhvMs/hiEW5GaI7GTt/NYdVdY1aH0lF +9T17kRNOCRozX+roW6CvzqAXYORjMS4OgiYan/5OfuwjOUhFZBqZm8vXjD46OuskMKO/ou +QA/ByvCQHP8O7yQrx8e8UizWpsvw/FUQ+MbOwySxlF2eaU5/iEUCU32Iyvi4XpCFV6Xisq +STTNWUT4ckacwWTpKtVikrJavSMBTClCG/eDgJbetT2N7iGzLbUtCAN5+ti0BbI1R6kuNA +hct31OBkyX28AYhKSeR06H7Z3SegvQBaHoiY/mFLV0tTDpL6YMnBcEz2Meq+vcSmaegvii +tgX3NIlyqPIzyyVJAoh+l483Fgr4CoCxcaztIYUw0jCsEUWpSNcXPcgrp3GBHbqLlwbrsE +/ArGXXqfSg9T8zeiTsVcn6UYqwGWnhudyaHxkrG50sP2DMQ1p9ywyTTyrkSRHNthjeQKuM +3x8eNK4aK5fgw07wF15AU6IcXbhJAfh4X6Xtd9RJz93Jb7CKUoqSKJAbIZg9VEQXjTazC/ +NJPM98UeEsvKtjV+bmwt+4GnRfte8LcQ/40R+AwRJyq3r/d20i0Ktv1K4oB0VGNYsZZLe2 +eXgTgjYwA6Lube01fGQuKOUNjdp3bcinn3O8UcMfxKDGzWD+os2BbYTlL8zcPEDGytkSax +rTzsY8CktXJBwVrmMvpmigrZBpfGdKXEyVjADHaVAyo6Sr8pqOpY7kZ5KwcwVDklMmx2Zc +ZYaE5dvG9soAAABdi0TY7btE2O2wAAAB9zc2gtbWxkc2E0NC1lZDI1NTE5QG9wZW5zc2gu +Y29tAAAFQOcy63kPREcb1UtnuD9O6zFSOiaK0AaaFI+D7ikbE3cEKG/H6hAFpldBBrS1df +5fs3gB4y4pClT5ZVSmVsurPMvSDgvOb67T56RPPufblXA2QD4YKyttiETIDqj8FulTEuL0 +QK57Lqkp2cOsD+F3qCPYDjr78g9XKKgL6WpYa0D9LXoUChsUylw6dDBZbUwg/p4X9bJFi/ +CYR0kEhPgkiRvW5EODy0NafinCfQ/Ghe9p3iWx7x1Fl2sBcoH2FhxOx1FPnLRqNcMps/Ga +xHrJlg6LUWqeb700X9OHYGIhFEmClQuN1XDSimxDF/cbOUCDswHQdNKKsXqh89jBBcoBKI +iETui3u0CmW/sAS5PgYw383AkTPrRSUHWZQgXrJQwjx/f/KapsJ4wmLSr7Vx2kJEQO+mOJ +yK5K3dd40d8RTWggExXsXVLoINqpll0qmXz0ffVilT+IuYr+W2L7vStofFYUmZw6Nf+O6Z +jxTy5vqZC/+9Kcy9oO4mDAec7CEPiqAfX+5YjZGFadeI+B8UMBh2k/JmWXWUhLUtp0i28T +f025KFzg34kN7oGZZx2XpWXWKXxm1G/vKxXiel3nnG725RbqLjYxGJqYsCGeKwF3uunOOH +sq8dCLupcij2TY7vwwzm833QRE6Y8TQGcHT1v8e3uAJtM5M7hRU8fzz8/F4nLLdx366X5f +fIQzN8zcFWFHUXPxJPKS7p0aQ7rfYzabZ2NOorVG88oPWh7DZfZIDYKBekJVHNL2a80Pef +ijVbB/+DeCkanTJUKjYMGq07Il/i2PXA6a9EVcRKpniiSksRwaocxCTCVzZfnoLu2croij +HvkSVNoCqF9c1Awmd53Gw5lZjbyJvABmuC1h0Q6UPDsD2p1tPQ84QwSQ1C7SQhtuDCCeEP +P6BOGCqhYTB6/TDSJZcptaIhNh2bOf2xrRgkHFged9JeYML+Xm1VqzNX2BWvV5EgFVtFVh +a20PdkrIMAZuyIU1IeVfJT62JjjGsT+GLkpZPfAg7FQD6GGM7Czto4p5H52Tr8KhVUMDxb +tEZszOG89bhvMs/hiEW5GaI7GTt/NYdVdY1aH0lF9T17kRNOCRozX+roW6CvzqAXYORjMS +4OgiYan/5OfuwjOUhFZBqZm8vXjD46OuskMKO/ouQA/ByvCQHP8O7yQrx8e8UizWpsvw/F +UQ+MbOwySxlF2eaU5/iEUCU32Iyvi4XpCFV6XisqSTTNWUT4ckacwWTpKtVikrJavSMBTC +lCG/eDgJbetT2N7iGzLbUtCAN5+ti0BbI1R6kuNAhct31OBkyX28AYhKSeR06H7Z3SegvQ +BaHoiY/mFLV0tTDpL6YMnBcEz2Meq+vcSmaegviitgX3NIlyqPIzyyVJAoh+l483Fgr4Co +CxcaztIYUw0jCsEUWpSNcXPcgrp3GBHbqLlwbrsE/ArGXXqfSg9T8zeiTsVcn6UYqwGWnh +udyaHxkrG50sP2DMQ1p9ywyTTyrkSRHNthjeQKuM3x8eNK4aK5fgw07wF15AU6IcXbhJAf +h4X6Xtd9RJz93Jb7CKUoqSKJAbIZg9VEQXjTazC/NJPM98UeEsvKtjV+bmwt+4GnRfte8L +cQ/40R+AwRJyq3r/d20i0Ktv1K4oB0VGNYsZZLe2eXgTgjYwA6Lube01fGQuKOUNjdp3bc +inn3O8UcMfxKDGzWD+os2BbYTlL8zcPEDGytkSaxrTzsY8CktXJBwVrmMvpmigrZBpfGdK +XEyVjADHaVAyo6Sr8pqOpY7kZ5KwcwVDklMmx2ZcZYaE5dvG9soAAAAECYjzXEVsDuQN4j +5agpYRhp96U1oE5jZj9HWoQNkT/SxK52qYBXj4HwQL1N7MbGG6V2kW+EBMN8sLZ3N550kU +HUAAAAG01MRFNBNDQtRUQyNTUxOSB0ZXN0IGtleSAjMgECAwQFBg== +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp new file mode 100644 index 000000000000..464272743b2a --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp @@ -0,0 +1 @@ +SHA256:fkgm6buCjmefUacy+TObQT3vsbO08/z6D8VHKqlMh/4 diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb new file mode 100644 index 000000000000..b3ee5387cccb --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb @@ -0,0 +1 @@ +xobol-manef-nufyk-niteb-gyseb-mugis-myfin-meroc-mypac-fisof-vexex diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub new file mode 100644 index 000000000000..34f26faf3d15 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519@openssh.com AAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNzaC5jb20AAAVA5zLreQ9ERxvVS2e4P07rMVI6JorQBpoUj4PuKRsTdwQob8fqEAWmV0EGtLV1/l+zeAHjLikKVPllVKZWy6s8y9IOC85vrtPnpE8+59uVcDZAPhgrK22IRMgOqPwW6VMS4vRArnsuqSnZw6wP4XeoI9gOOvvyD1coqAvpalhrQP0tehQKGxTKXDp0MFltTCD+nhf1skWL8JhHSQSE+CSJG9bkQ4PLQ1p+KcJ9D8aF72neJbHvHUWXawFygfYWHE7HUU+ctGo1wymz8ZrEesmWDotRap5vvTRf04dgYiEUSYKVC43VcNKKbEMX9xs5QIOzAdB00oqxeqHz2MEFygEoiIRO6Le7QKZb+wBLk+BjDfzcCRM+tFJQdZlCBeslDCPH9/8pqmwnjCYtKvtXHaQkRA76Y4nIrkrd13jR3xFNaCATFexdUugg2qmWXSqZfPR99WKVP4i5iv5bYvu9K2h8VhSZnDo1/47pmPFPLm+pkL/70pzL2g7iYMB5zsIQ+KoB9f7liNkYVp14j4HxQwGHaT8mZZdZSEtS2nSLbxN/TbkoXODfiQ3ugZlnHZelZdYpfGbUb+8rFeJ6XeecbvblFuouNjEYmpiwIZ4rAXe66c44eyrx0Iu6lyKPZNju/DDObzfdBETpjxNAZwdPW/x7e4Am0zkzuFFTx/PPz8Xicst3Hfrpfl98hDM3zNwVYUdRc/Ek8pLunRpDut9jNptnY06itUbzyg9aHsNl9kgNgoF6QlUc0vZrzQ95+KNVsH/4N4KRqdMlQqNgwarTsiX+LY9cDpr0RVxEqmeKJKSxHBqhzEJMJXNl+egu7ZyuiKMe+RJU2gKoX1zUDCZ3ncbDmVmNvIm8AGa4LWHRDpQ8OwPanW09DzhDBJDULtJCG24MIJ4Q8/oE4YKqFhMHr9MNIllym1oiE2HZs5/bGtGCQcWB530l5gwv5ebVWrM1fYFa9XkSAVW0VWFrbQ92SsgwBm7IhTUh5V8lPrYmOMaxP4YuSlk98CDsVAPoYYzsLO2jinkfnZOvwqFVQwPFu0RmzM4bz1uG8yz+GIRbkZojsZO381h1V1jVofSUX1PXuRE04JGjNf6uhboK/OoBdg5GMxLg6CJhqf/k5+7CM5SEVkGpmby9eMPjo66yQwo7+i5AD8HK8JAc/w7vJCvHx7xSLNamy/D8VRD4xs7DJLGUXZ5pTn+IRQJTfYjK+LhekIVXpeKypJNM1ZRPhyRpzBZOkq1WKSslq9IwFMKUIb94OAlt61PY3uIbMttS0IA3n62LQFsjVHqS40CFy3fU4GTJfbwBiEpJ5HToftndJ6C9AFoeiJj+YUtXS1MOkvpgycFwTPYx6r69xKZp6C+KK2Bfc0iXKo8jPLJUkCiH6XjzcWCvgKgLFxrO0hhTDSMKwRRalI1xc9yCuncYEduouXBuuwT8CsZdep9KD1PzN6JOxVyfpRirAZaeG53JofGSsbnSw/YMxDWn3LDJNPKuRJEc22GN5Aq4zfHx40rhorl+DDTvAXXkBTohxduEkB+Hhfpe131EnP3clvsIpSipIokBshmD1URBeNNrML80k8z3xR4Sy8q2NX5ubC37gadF+17wtxD/jRH4DBEnKrev93bSLQq2/UrigHRUY1ixlkt7Z5eBOCNjADou5t7TV8ZC4o5Q2N2ndtyKefc7xRwx/EoMbNYP6izYFthOUvzNw8QMbK2RJrGtPOxjwKS1ckHBWuYy+maKCtkGl8Z0pcTJWMAMdpUDKjpKvymo6ljuRnkrBzBUOSUybHZlxlhoTl28b2yg MLDSA44-ED25519 test key #2 diff --git a/regress/unittests/sshkey/tests.c b/regress/unittests/sshkey/tests.c index 426543bd7c37..a797d6692092 100644 --- a/regress/unittests/sshkey/tests.c +++ b/regress/unittests/sshkey/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.2 2025/04/15 04:00:42 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.3 2026/06/29 07:46:22 djm Exp $ */ /* * Regress test for sshbuf.h buffer API * diff --git a/regress/unittests/sshsig/Makefile b/regress/unittests/sshsig/Makefile index 54abd8499b07..ed19c668e073 100644 --- a/regress/unittests/sshsig/Makefile +++ b/regress/unittests/sshsig/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.7 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.8 2026/06/14 04:08:06 djm Exp $ PROG=test_sshsig SRCS=tests.c @@ -11,7 +11,7 @@ SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c SRCS+=addr.c addrmatch.c bitmap.c sshsig.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c - +SRCS+=ssh-mldsa-eddsa.c libcrux-mlkem-mldsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c SRCS+=utf8.c diff --git a/regress/unittests/sshsig/mktestdata.sh b/regress/unittests/sshsig/mktestdata.sh index b7c60cc27767..5ad381c2b720 100755 --- a/regress/unittests/sshsig/mktestdata.sh +++ b/regress/unittests/sshsig/mktestdata.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: mktestdata.sh,v 1.2 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: mktestdata.sh,v 1.3 2026/06/14 04:08:06 djm Exp $ NAMESPACE=unittest @@ -17,8 +17,9 @@ else fi rm -f signed-data namespace -rm -f rsa ecdsa ed25519 ecdsa_sk ed25519_sk +rm -f rsa ecdsa ed25519 ecdsa_sk ed25519_sk mldsa44-ed25519 rm -f rsa.sig ecdsa.sig ed25519.sig ecdsa_sk.sig ed25519_sk.sig +rm -f mldsa44-ed25519.sig printf "This is a test, this is only a test" > signed-data printf "$NAMESPACE" > namespace @@ -26,6 +27,8 @@ printf "$NAMESPACE" > namespace ssh-keygen -t rsa -C "RSA test" -N "" -f rsa -m PEM ssh-keygen -t ecdsa -C "ECDSA test" -N "" -f ecdsa -m PEM ssh-keygen -t ed25519 -C "ED25519 test key" -N "" -f ed25519 +ssh-keygen -t mldsa44-ed25519 -C "MLDSA44-ED25519 test key" \ + -N "" -f mldsa44-ed25519 ssh-keygen -w "$SK_DUMMY" -t ecdsa-sk -C "ECDSA-SK test key" \ -N "" -f ecdsa_sk ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key" \ @@ -34,6 +37,8 @@ ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key" \ ssh-keygen -Y sign -f rsa -n $NAMESPACE - < signed-data > rsa.sig ssh-keygen -Y sign -f ecdsa -n $NAMESPACE - < signed-data > ecdsa.sig ssh-keygen -Y sign -f ed25519 -n $NAMESPACE - < signed-data > ed25519.sig +ssh-keygen -Y sign -f mldsa44-ed25519 -n $NAMESPACE - \ + < signed-data > mldsa44-ed25519.sig ssh-keygen -w "$SK_DUMMY" \ -Y sign -f ecdsa_sk -n $NAMESPACE - < signed-data > ecdsa_sk.sig ssh-keygen -w "$SK_DUMMY" \ diff --git a/regress/unittests/sshsig/testdata/mldsa44-ed25519 b/regress/unittests/sshsig/testdata/mldsa44-ed25519 new file mode 100644 index 000000000000..85c246e97dcb --- /dev/null +++ b/regress/unittests/sshsig/testdata/mldsa44-ed25519 @@ -0,0 +1,58 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAFZwAAAB9zc2gtbW +xkc2E0NC1lZDI1NTE5QG9wZW5zc2guY29tAAAFQEJyQnDXx/vv0OJPXSjYcevxmFZnX5aT +vX+En3YwS8Nb6wJC1CguawmJOD7J2zAmz5251gIIoDrhPPVSKdaXql4SUmSitP9AjKS9l3 +Vs8lb1mbxeuEuPY2W1jYMBWAr53Xp3Cj4X6NEi2glFIRHnl7lPBUyBVLT+6qmVRYRdG9pT +bNR/IyxsuDVQ4anaTlPE7Nck/zM86V+bmFblCGl4UPb2orUjcRT1INFHwfnFJOwzQEHdBL +ktjfdy6u5uZWCqC8T+zS7fnDPeitakFoOAeRuwy2SMjygaU8/4qHLoyJWpH56c1tm+oysf +ZmRZ7J6O3shBtoFohLBMlKc/Ni0U/2t5tkdCgK+e5oUhowQ9COgejVMxIgZg/JT3vVSbub +J3Gqi3kcLGtcCRyzPl7lS3CUb+jFG0sJaCZSHWMx7Aw3lV5CbjiAICnQgoa5l+w/rX3FWL +FmKyFB13FbsKJnVP4eNZe1VwB1NvqD3bLclIQ/bHJR8+YKsVVb9lqUtCI711Mkkc17XmiR +aEKaGcTkRr0w/5phUcerqCWvq4va81O1LmoBdlLzgRDELl9BfLygziQzkakOxaUzhZ8ooJ +Mf86L3Qba0l7+U9Me+7cDeFGIP7t91GsPGfokWcBcjaCaRis6YypGDPtSAX6NdB+UOIPDP +dWjmnugcLL+1lKOqoLVp7RE3m1Uz2Fm2eRr6m1CyUCC4Akv4ahDcq0qOxpXkxP37zKp+av +JjPKJMhVncH3LQ7A9DyGkxnWtAg8/1HK1lNIb9pTILd4+c3wlCjVWCo88upqbEp67GqhfO +WlDzw4HFGH0D0l8el9NNZ1cP5yrppxlA8LegIWN/EVVlp+qNgLF6bk2m9shjQfy2j5Mo71 +HTQU1Z8xm4I4kYL7Nu8hjgK/wUTIzaJ8tN5ujyDbcztsR646BiEYGPBEkxxwMRomn7w7mt +97inrE9aIOBc2lKkJO+s7wILcM1bMaelbZKqC+528XHUEWhvIgaY7CXkNIBBWSDFp0kXyA +ntkMaHR6VuTIvZefINczm5jJ++/YfRpkDequptTjH5uFnKayV47vQII4wGAepl+cWqv5Jk ++8pJChi5TTaeiEZhn9pC7loK0//nLJAreP/wVsuMr+uSyL00NvV8Bpf+68aa3bn9BeH9zX +KpMRKdKiCLOc94Dw23J4sIjJr7qBtaXCJQOhU0+l5P1JRDSNhr0VHRCvb/H1+5gGuq0rsy +PmOtn9M0mIfHPKzOKy2ZX/WaY4f+FytZnRlY1NClAKUf0DtIzNpJJ0vpjc/ZyaonJxaPtJ +oDKq37ktOrUh7mlFLCVzwM7Ly5Q4v0h542awn15x8qRa7t50f1rgPTGDSDTIyHfj544C2Z +eePMcFyTQFH6woCzQr9Ojm60CbgjCgT3A5MWFFFDFKlDRu9ZJbSlXdyH9V6hlleKE8Nual +CXMpIdEZq/JrsuKQTLRu2uWKApvIGBF7atZHZiw+mL5oNQq+3A+PDnrIWMABm258M5A69m +62iz/FraKwqDNEEwioecGAAv69E5ueMabvMBePEw90kh+XC3KKoRlcSGLikBuPZRfeIPSs +41jDaE/TXv83NkyGUqoaHFDFmHQ15dK0ZJtPbGZNbE75v2QKg8rU438/6dfl7grEoTrXSf +96NqKExoq8OgZIi8ZgT9ILRq9z2VOTupmHSbT9zf2vmcDHmmNOsrTVf0ajiECgdbujFJJG +uDHPgcL1hhLbKi31SomO2fvbBAYXd9nyef854cNVQMK32D8h7FOE3DIOWIesctPrU10E97 +FNDffHMsaOtgAABdDBhc9xwYXPcQAAAB9zc2gtbWxkc2E0NC1lZDI1NTE5QG9wZW5zc2gu +Y29tAAAFQEJyQnDXx/vv0OJPXSjYcevxmFZnX5aTvX+En3YwS8Nb6wJC1CguawmJOD7J2z +Amz5251gIIoDrhPPVSKdaXql4SUmSitP9AjKS9l3Vs8lb1mbxeuEuPY2W1jYMBWAr53Xp3 +Cj4X6NEi2glFIRHnl7lPBUyBVLT+6qmVRYRdG9pTbNR/IyxsuDVQ4anaTlPE7Nck/zM86V ++bmFblCGl4UPb2orUjcRT1INFHwfnFJOwzQEHdBLktjfdy6u5uZWCqC8T+zS7fnDPeitak +FoOAeRuwy2SMjygaU8/4qHLoyJWpH56c1tm+oysfZmRZ7J6O3shBtoFohLBMlKc/Ni0U/2 +t5tkdCgK+e5oUhowQ9COgejVMxIgZg/JT3vVSbubJ3Gqi3kcLGtcCRyzPl7lS3CUb+jFG0 +sJaCZSHWMx7Aw3lV5CbjiAICnQgoa5l+w/rX3FWLFmKyFB13FbsKJnVP4eNZe1VwB1NvqD +3bLclIQ/bHJR8+YKsVVb9lqUtCI711Mkkc17XmiRaEKaGcTkRr0w/5phUcerqCWvq4va81 +O1LmoBdlLzgRDELl9BfLygziQzkakOxaUzhZ8ooJMf86L3Qba0l7+U9Me+7cDeFGIP7t91 +GsPGfokWcBcjaCaRis6YypGDPtSAX6NdB+UOIPDPdWjmnugcLL+1lKOqoLVp7RE3m1Uz2F +m2eRr6m1CyUCC4Akv4ahDcq0qOxpXkxP37zKp+avJjPKJMhVncH3LQ7A9DyGkxnWtAg8/1 +HK1lNIb9pTILd4+c3wlCjVWCo88upqbEp67GqhfOWlDzw4HFGH0D0l8el9NNZ1cP5yrppx +lA8LegIWN/EVVlp+qNgLF6bk2m9shjQfy2j5Mo71HTQU1Z8xm4I4kYL7Nu8hjgK/wUTIza +J8tN5ujyDbcztsR646BiEYGPBEkxxwMRomn7w7mt97inrE9aIOBc2lKkJO+s7wILcM1bMa +elbZKqC+528XHUEWhvIgaY7CXkNIBBWSDFp0kXyAntkMaHR6VuTIvZefINczm5jJ++/YfR +pkDequptTjH5uFnKayV47vQII4wGAepl+cWqv5Jk+8pJChi5TTaeiEZhn9pC7loK0//nLJ +AreP/wVsuMr+uSyL00NvV8Bpf+68aa3bn9BeH9zXKpMRKdKiCLOc94Dw23J4sIjJr7qBta +XCJQOhU0+l5P1JRDSNhr0VHRCvb/H1+5gGuq0rsyPmOtn9M0mIfHPKzOKy2ZX/WaY4f+Fy +tZnRlY1NClAKUf0DtIzNpJJ0vpjc/ZyaonJxaPtJoDKq37ktOrUh7mlFLCVzwM7Ly5Q4v0 +h542awn15x8qRa7t50f1rgPTGDSDTIyHfj544C2ZeePMcFyTQFH6woCzQr9Ojm60CbgjCg +T3A5MWFFFDFKlDRu9ZJbSlXdyH9V6hlleKE8NualCXMpIdEZq/JrsuKQTLRu2uWKApvIGB +F7atZHZiw+mL5oNQq+3A+PDnrIWMABm258M5A69m62iz/FraKwqDNEEwioecGAAv69E5ue +MabvMBePEw90kh+XC3KKoRlcSGLikBuPZRfeIPSs41jDaE/TXv83NkyGUqoaHFDFmHQ15d +K0ZJtPbGZNbE75v2QKg8rU438/6dfl7grEoTrXSf96NqKExoq8OgZIi8ZgT9ILRq9z2VOT +upmHSbT9zf2vmcDHmmNOsrTVf0ajiECgdbujFJJGuDHPgcL1hhLbKi31SomO2fvbBAYXd9 +nyef854cNVQMK32D8h7FOE3DIOWIesctPrU10E97FNDffHMsaOtgAAAECtgRPgibkKYTEU +inI+TpS2aiu7bHRYkvn/2BqHT2zd1f57PMPDEvJhOvmVhk7rZWBeW6lEUXmVSk8PlxP9GS +FEAAAAGE1MRFNBNDQtRUQyNTUxOSB0ZXN0IGtleQE= +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshsig/testdata/mldsa44-ed25519.pub b/regress/unittests/sshsig/testdata/mldsa44-ed25519.pub new file mode 100644 index 000000000000..92af10c4a0a9 --- /dev/null +++ b/regress/unittests/sshsig/testdata/mldsa44-ed25519.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519@openssh.com AAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNzaC5jb20AAAVAQnJCcNfH++/Q4k9dKNhx6/GYVmdflpO9f4SfdjBLw1vrAkLUKC5rCYk4PsnbMCbPnbnWAgigOuE89VIp1peqXhJSZKK0/0CMpL2XdWzyVvWZvF64S49jZbWNgwFYCvndencKPhfo0SLaCUUhEeeXuU8FTIFUtP7qqZVFhF0b2lNs1H8jLGy4NVDhqdpOU8Ts1yT/MzzpX5uYVuUIaXhQ9vaitSNxFPUg0UfB+cUk7DNAQd0EuS2N93Lq7m5lYKoLxP7NLt+cM96K1qQWg4B5G7DLZIyPKBpTz/iocujIlakfnpzW2b6jKx9mZFnsno7eyEG2gWiEsEyUpz82LRT/a3m2R0KAr57mhSGjBD0I6B6NUzEiBmD8lPe9VJu5sncaqLeRwsa1wJHLM+XuVLcJRv6MUbSwloJlIdYzHsDDeVXkJuOIAgKdCChrmX7D+tfcVYsWYrIUHXcVuwomdU/h41l7VXAHU2+oPdstyUhD9sclHz5gqxVVv2WpS0IjvXUySRzXteaJFoQpoZxORGvTD/mmFRx6uoJa+ri9rzU7UuagF2UvOBEMQuX0F8vKDOJDORqQ7FpTOFnyigkx/zovdBtrSXv5T0x77twN4UYg/u33Uaw8Z+iRZwFyNoJpGKzpjKkYM+1IBfo10H5Q4g8M91aOae6Bwsv7WUo6qgtWntETebVTPYWbZ5GvqbULJQILgCS/hqENyrSo7GleTE/fvMqn5q8mM8okyFWdwfctDsD0PIaTGda0CDz/UcrWU0hv2lMgt3j5zfCUKNVYKjzy6mpsSnrsaqF85aUPPDgcUYfQPSXx6X001nVw/nKumnGUDwt6AhY38RVWWn6o2AsXpuTab2yGNB/LaPkyjvUdNBTVnzGbgjiRgvs27yGOAr/BRMjNony03m6PINtzO2xHrjoGIRgY8ESTHHAxGiafvDua33uKesT1og4FzaUqQk76zvAgtwzVsxp6VtkqoL7nbxcdQRaG8iBpjsJeQ0gEFZIMWnSRfICe2QxodHpW5Mi9l58g1zObmMn779h9GmQN6q6m1OMfm4WcprJXju9AgjjAYB6mX5xaq/kmT7ykkKGLlNNp6IRmGf2kLuWgrT/+cskCt4//BWy4yv65LIvTQ29XwGl/7rxprduf0F4f3NcqkxEp0qIIs5z3gPDbcniwiMmvuoG1pcIlA6FTT6Xk/UlENI2GvRUdEK9v8fX7mAa6rSuzI+Y62f0zSYh8c8rM4rLZlf9Zpjh/4XK1mdGVjU0KUApR/QO0jM2kknS+mNz9nJqicnFo+0mgMqrfuS06tSHuaUUsJXPAzsvLlDi/SHnjZrCfXnHypFru3nR/WuA9MYNINMjId+PnjgLZl548xwXJNAUfrCgLNCv06ObrQJuCMKBPcDkxYUUUMUqUNG71kltKVd3If1XqGWV4oTw25qUJcykh0Rmr8muy4pBMtG7a5YoCm8gYEXtq1kdmLD6Yvmg1Cr7cD48OeshYwAGbbnwzkDr2braLP8WtorCoM0QTCKh5wYAC/r0Tm54xpu8wF48TD3SSH5cLcoqhGVxIYuKQG49lF94g9KzjWMNoT9Ne/zc2TIZSqhocUMWYdDXl0rRkm09sZk1sTvm/ZAqDytTjfz/p1+XuCsShOtdJ/3o2ooTGirw6BkiLxmBP0gtGr3PZU5O6mYdJtP3N/a+ZwMeaY06ytNV/RqOIQKB1u6MUkka4Mc+BwvWGEtsqLfVKiY7Z+9sEBhd32fJ5/znhw1VAwrfYPyHsU4TcMg5Yh6xy0+tTXQT3sU0N98cyxo62 MLDSA44-ED25519 test key diff --git a/regress/unittests/sshsig/testdata/mldsa44-ed25519.sig b/regress/unittests/sshsig/testdata/mldsa44-ed25519.sig new file mode 100644 index 000000000000..45b1e7589226 --- /dev/null +++ b/regress/unittests/sshsig/testdata/mldsa44-ed25519.sig @@ -0,0 +1,78 @@ +-----BEGIN SSH SIGNATURE----- +U1NIU0lHAAAAAQAABWcAAAAfc3NoLW1sZHNhNDQtZWQyNTUxOUBvcGVuc3NoLmNvbQAABU +BCckJw18f779DiT10o2HHr8ZhWZ1+Wk71/hJ92MEvDW+sCQtQoLmsJiTg+ydswJs+dudYC +CKA64Tz1UinWl6peElJkorT/QIykvZd1bPJW9Zm8XrhLj2NltY2DAVgK+d16dwo+F+jRIt +oJRSER55e5TwVMgVS0/uqplUWEXRvaU2zUfyMsbLg1UOGp2k5TxOzXJP8zPOlfm5hW5Qhp +eFD29qK1I3EU9SDRR8H5xSTsM0BB3QS5LY33curubmVgqgvE/s0u35wz3orWpBaDgHkbsM +tkjI8oGlPP+Khy6MiVqR+enNbZvqMrH2ZkWeyejt7IQbaBaISwTJSnPzYtFP9rebZHQoCv +nuaFIaMEPQjoHo1TMSIGYPyU971Um7mydxqot5HCxrXAkcsz5e5UtwlG/oxRtLCWgmUh1j +MewMN5VeQm44gCAp0IKGuZfsP619xVixZishQddxW7CiZ1T+HjWXtVcAdTb6g92y3JSEP2 +xyUfPmCrFVW/ZalLQiO9dTJJHNe15okWhCmhnE5Ea9MP+aYVHHq6glr6uL2vNTtS5qAXZS +84EQxC5fQXy8oM4kM5GpDsWlM4WfKKCTH/Oi90G2tJe/lPTHvu3A3hRiD+7fdRrDxn6JFn +AXI2gmkYrOmMqRgz7UgF+jXQflDiDwz3Vo5p7oHCy/tZSjqqC1ae0RN5tVM9hZtnka+ptQ +slAguAJL+GoQ3KtKjsaV5MT9+8yqfmryYzyiTIVZ3B9y0OwPQ8hpMZ1rQIPP9RytZTSG/a +UyC3ePnN8JQo1VgqPPLqamxKeuxqoXzlpQ88OBxRh9A9JfHpfTTWdXD+cq6acZQPC3oCFj +fxFVZafqjYCxem5NpvbIY0H8to+TKO9R00FNWfMZuCOJGC+zbvIY4Cv8FEyM2ifLTebo8g +23M7bEeuOgYhGBjwRJMccDEaJp+8O5rfe4p6xPWiDgXNpSpCTvrO8CC3DNWzGnpW2Sqgvu +dvFx1BFobyIGmOwl5DSAQVkgxadJF8gJ7ZDGh0elbkyL2XnyDXM5uYyfvv2H0aZA3qrqbU +4x+bhZymsleO70CCOMBgHqZfnFqr+SZPvKSQoYuU02nohGYZ/aQu5aCtP/5yyQK3j/8FbL +jK/rksi9NDb1fAaX/uvGmt25/QXh/c1yqTESnSogiznPeA8NtyeLCIya+6gbWlwiUDoVNP +peT9SUQ0jYa9FR0Qr2/x9fuYBrqtK7Mj5jrZ/TNJiHxzyszistmV/1mmOH/hcrWZ0ZWNTQ +pQClH9A7SMzaSSdL6Y3P2cmqJycWj7SaAyqt+5LTq1Ie5pRSwlc8DOy8uUOL9IeeNmsJ9e +cfKkWu7edH9a4D0xg0g0yMh34+eOAtmXnjzHBck0BR+sKAs0K/To5utAm4IwoE9wOTFhRR +QxSpQ0bvWSW0pV3ch/VeoZZXihPDbmpQlzKSHRGavya7LikEy0btrligKbyBgRe2rWR2Ys +Ppi+aDUKvtwPjw56yFjAAZtufDOQOvZutos/xa2isKgzRBMIqHnBgAL+vRObnjGm7zAXjx +MPdJIflwtyiqEZXEhi4pAbj2UX3iD0rONYw2hP017/NzZMhlKqGhxQxZh0NeXStGSbT2xm +TWxO+b9kCoPK1ON/P+nX5e4KxKE610n/ejaihMaKvDoGSIvGYE/SC0avc9lTk7qZh0m0/c +39r5nAx5pjTrK01X9Go4hAoHW7oxSSRrgxz4HC9YYS2yot9UqJjtn72wQGF3fZ8nn/OeHD +VUDCt9g/IexThNwyDliHrHLT61NdBPexTQ33xzLGjrYAAAAIdW5pdHRlc3QAAAAAAAAABn +NoYTUxMgAACdsAAAAfc3NoLW1sZHNhNDQtZWQyNTUxOUBvcGVuc3NoLmNvbQAACbTPlGm4 +hZSSu1pnt2Tr5TpqUqvjw8F55anEUT1Yi05dtTlnkewIxMeleaY/DJGK9uoSYlauaTh+8w +Ijrn6ZMrFkGHY8mnA73jw0b71CWljntHPWI2lS/mWOhRcAwAKakxkmgKQDNXGCC/NfpKn2 +hfDvUezAbhThoBS5hNlQ+FJKWnRN2Mpa01Q7ZqBZ2vVQ2oDTPd2Yivf/5tJzkiYufkEWZK +VWEO6lYjWGlk9MIXVegQPO/Ucp+B42DckzHbOiDozFC4N+DrkyMwMeY98/H7nlR72xmzw2 +/ylnACyLCstcagxG9cRbA2FQvbVgxQzO7Am0XLQ8ELsinwphAYRVuyU6cgClFDutraA80S +VaEVHrJgKYd2FpdDfjV1cXDUaN2bQz3VXYOEq42LKOmOJBCxNCqm/EUhY1fY+nFdIwmIy5 +OraN6Ut93PCKtLzmlXPMwXJA5eHORnUy8j4RpO7egKEQ52GDEHHsQDjf9siEoyaVSwfgKI +A30SwzXALQh3uFOjjEizv4rZb/eID6PWWu1cD/nVMG2oEJWoUeARGrRPeJHDjW4eGgAZWT +bz4GRqf4t/oCeLyNvjwIg0gLphE6YTCpBttBJahG1GNWVhD1Q9EpmgWBGiEOk4ak7dPEZB +0ljMgONB6p+z7H2SlvHSihpzzOldZhPMTgxMUDSG20pvyTwL40sHKPe3bOfIi7H31LDkF/ +OeXB7SwNitG2S1dTLLzpwBbdAahqxDikDH+s17NFzNatGWlEzWQ+jzcI9/mbLpKAveGxiY +C8eoL1C/y7u+vXL9eW+zyRNlSt0ewD1SIPxoEFNz/IbjzLB4TMs/raEgwPu4sLm4KAuvoj +A8mGbNiTXAWsGIns5UJgsSrJUnM3/yxT86V9KBVhIUDV0GKS81+WoSnlQ/o4le0CCTXJUU +feV3gnL5SlF5RFgfE+5OFYQ2WYhl7o1MLymunQ7S0BWzBGYMXGoT/DQ6LMxqAOZkNWADeV +76jDwgeIso3q4BEmHeiZOJBat5mQ04FWkrY7decWXNpkEEUQdhHc09wA/NtGla6EQzNxG7 +voc4gr7h1ZbJg6IhI5wnr80maDpFFoC3FAy9w1gic0kBfpklprgg9f/BMwz9RK0iULTvjT +HB7vIs4iGaIhPjaiD/kxiC/spIfyWLrHT7RFWpOUIDQrCMEiF/OoJhp8v2gzW9LlYisP4U +ljZOj0438lxefebJQry1KUOH99HZVC7cjm41PWMkYUT1RRITlz/HhOrMqt1LZ64yVbazau +kvs/P5Ngeo0HcKbbExFWu4efgeYzqgZ7wZ7PAlu82LUkBtdjaFV+c/HOkTAv1pc9X8/DuQ +K2eeLnO4Z9cwF2G2OaOsU53Cq4xypxqrmGEcS7Lf/9vZe271RNfH62HvlLv/PEG3VlpEHp +BmUzqHiNp85aYtcMKhK6JcY6UnYiFXOarxymZYiCykVZDAUN3azdh7ClYIvUg/k7ZjSHHX +2ELtzJKsonNBtt/YybaNLInrhj8s58GaJv3tZTkfxOzEMXR6iBauOATMEKu8YQ8e6h4dag +sf6Q7SGzcr6Kc2Gtw+qjoDjVWcgp5ZfHKxM9e1VpWhA46INTaLzej45iI+JMqkyjMiVIEy +vnydouPPRAe06CSOE4pBofDAZf+3RsiFZN9J55lcK6sBR1T7hSIIE6+XLg5ktLC+W6/1mp +IWXhz+PQEZTjLwUb6KaHs8gzvolmm5OpMCw8i5WLSAQ4HPWMPxwRHdxUu2k9NQQPogw90I +esBazP2+b/rZWrPNuRM63mjeZyKM8nuouID3D+C75hosfU2WNMPn0lwg+IaN4IyfMT5+TD +rV3/Vtwqz+WE4fIT7IW13A5G54VyCWEazWtVQFQiGuY7JcgbcJXDtAi/Hg0yzThjU+FRJn +Z2nsqi3SlTQW1nKK2xcfnrT28HN8M384KNQTJoOfAHPGWZvjMwAwMyFvwNlTzekJtmnV9Y +GxeK7iZml66oEFkEA0UFL69cFuXs38WFfTSmRslqw5YMea0/N/CLMDEeIrbUqzMxGFyRPu ++6VS3zJ6OyvAAGuNohW6PBFmtNJ4V8A/OavoAmh4Wklyb+ZZn9x5U2k1PvVQYHWlqa14Y8 +ar/THn3IAAdI8rsEZeq/phg2RlAuagpNHeK5C+SfLi5uRXbbwRqTZIGiCsb0RmKKBlp6Tt +cZEq7mjXprD6X1T6QsOZ191fZ3JHwzgxPyrlOgIs0XVN7MqJsnMbHLZr5/sX0W/UPRxonT +a5kDcNBl/ngwbFZQjY1dwQGEtG0Pe5A45TJU0Ycfo+MRreU14FHYPq/f2Qz/585qK3epPE +vVZPiZkpKITN+e8XcwvO9pgRF2+9zZYC5iKtinumQtZ3QkxagaAzt2QjacxD2HbDuKhe1r +B7ITPw6TDPn50fio/vb7lkFl/7uip9Jy7yn7+6lPaKNU20KwEeWj9d0tPv8xSylW/lfU7u +UQmNIe+NQrhF6qo54GOLGmiuZa7tDb6lF3/EyahlNXhuCv5+Fzd+QPumizQIOD6mv9SDf4 +VC0GGkmSomVqsuQUJrcVdcUZvcV54ozAM+mMlJ2ZzaTXxJ2ud6QjUFco6Vt8qudFNG6hFq +9L348x97RxIgKHh4H6XKAZKY2fnJh+TNZp+vobElw06PA8iY2mqOeouJTc5QXHdrvsfuli +v78YG/2/w7H7dcFjsKgQBy+k8txWf0LlF7pAz1r5Sha6ipJZXyvEVCJT54zLR7Jq4KkFmi +OVUJjNE3x0a+3Rhf6JjBvXY4eipE80bRQarhYyx5UCj4Rz+AwDpCelpzUKEuLnSgwe+i7s +1Ahz6S6jtR27AD6SFZJV7cgbRGlU+0AF6c8+oN6g6W6m7AOVGeV3JhfjqGdB+anRQBlc8l +0tHsK7HXx7qnO7Q6MUBb0DH4ULy2lKuVfBcnnF2ECCd0b8tnHcJ392SRrW2DI+PZuTPVZ9 +svHiHHaLMRgj83MOFUigyYASFpJyfugKYUfazkxegp5bqJqS13+EXeZ/v5ax3pxA9x0jJD +u56JU/IeQK9NAiEyaVz6vk2y5NsyiHS1i7dle1ShjlsKdVKHHIujs6xlRECal4/TI04MSV +HFFDVr20LNhynZmFA9nxyRUfJW3+mSU0U1ZXdoCGudHk9gEHDyc+P1ZvdX2RmaGouL7S6f +UHDg8YGywvRlBZWmNscHOXnJ2ssLe4vsLI5fT7/wgRNlJucHOosLu8vs/f+AAAAAAADB88 +S5ANc0JiZDzQZe2HdFhRQjE7+PY7mDMleC/fcu1YitJorDd+KZ4rARVqHn96ps17jJVCGN +X21nUV3kRQplF/RQk= +-----END SSH SIGNATURE----- diff --git a/regress/unittests/sshsig/tests.c b/regress/unittests/sshsig/tests.c index 670d06718955..68e893147635 100644 --- a/regress/unittests/sshsig/tests.c +++ b/regress/unittests/sshsig/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.6 2025/05/06 06:05:48 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.8 2026/06/29 07:46:22 djm Exp $ */ /* * Regress test for sshbuf.h buffer API * @@ -17,6 +17,7 @@ #include <unistd.h> #ifdef WITH_OPENSSL +#include <openssl/err.h> #include <openssl/evp.h> #include <openssl/crypto.h> #endif @@ -85,7 +86,7 @@ tests(void) #ifdef WITH_OPENSSL OpenSSL_add_all_algorithms(); - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); #endif TEST_START("load data"); @@ -113,6 +114,10 @@ tests(void) check_sig("ed25519.pub", "ed25519.sig", msg, namespace); TEST_DONE(); + TEST_START("check MLDSA44-ED25519 signature"); + check_sig("mldsa44-ed25519.pub", "mldsa44-ed25519.sig", msg, namespace); + TEST_DONE(); + #ifdef ENABLE_SK #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) TEST_START("check ECDSA-SK signature"); diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c index 525a82b1ff87..a2cb02d838cc 100644 --- a/regress/unittests/test_helper/test_helper.c +++ b/regress/unittests/test_helper/test_helper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_helper.c,v 1.16 2026/03/06 06:57:33 dtucker Exp $ */ +/* $OpenBSD: test_helper.c,v 1.18 2026/06/22 12:08:33 dtucker Exp $ */ /* * Copyright (c) 2011 Damien Miller <djm@mindrot.org> * @@ -151,7 +151,7 @@ main(int argc, char **argv) seed_rng(); #ifdef WITH_OPENSSL - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); #endif /* Handle systems without __progname */ @@ -663,6 +663,20 @@ tstod(const struct timespec *ts) } void +hex2bin(uint8_t *bin, const char *hex, size_t len) +{ + size_t i; + unsigned int v; + + /* Don't use %hhx since it's C99 and older platforms don't have it. */ + for (i = 0; i < len; i++) { + ASSERT_INT_EQ(sscanf(hex + i * 2, "%02x", &v), 1); + ASSERT_U_INT_LE(v, 256); + bin[i] = (uint8_t)v; + } +} + +void bench_start(const char *file, int line, const char *name) { char *cp; diff --git a/regress/unittests/test_helper/test_helper.h b/regress/unittests/test_helper/test_helper.h index 91fdca435347..9cfc415539d4 100644 --- a/regress/unittests/test_helper/test_helper.h +++ b/regress/unittests/test_helper/test_helper.h @@ -1,4 +1,4 @@ -/* $OpenBSD: test_helper.h,v 1.12 2026/03/06 06:57:33 dtucker Exp $ */ +/* $OpenBSD: test_helper.h,v 1.13 2026/06/16 22:27:10 dtucker Exp $ */ /* * Copyright (c) 2011 Damien Miller <djm@mindrot.org> * @@ -39,6 +39,8 @@ typedef void (test_onerror_func_t)(void *); void tests(void); void benchmarks(void); +void hex2bin(uint8_t *, const char *, size_t); + const char *test_data_file(const char *name); void test_start(const char *n); void test_info(char *s, size_t len); diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c index 7b2444930d1a..bf753eef22c0 100644 --- a/sandbox-seccomp-filter.c +++ b/sandbox-seccomp-filter.c @@ -381,9 +381,6 @@ static const struct sock_filter preauth_insns[] = { #ifdef __NR_clock_nanosleep_time64 SC_ALLOW(__NR_clock_nanosleep_time64), #endif -#ifdef __NR_clock_gettime64 - SC_ALLOW(__NR_clock_gettime64), -#endif #ifdef __NR__newselect SC_ALLOW(__NR__newselect), #endif @@ -538,7 +535,6 @@ void ssh_sandbox_child(struct ssh_sandbox *box) { struct rlimit rl_zero, rl_one = {.rlim_cur = 1, .rlim_max = 1}; - int nnp_failed = 0; /* Set rlimits for completeness if possible. */ rl_zero.rlim_cur = rl_zero.rlim_max = 0; @@ -561,18 +557,11 @@ ssh_sandbox_child(struct ssh_sandbox *box) #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ debug3_f("setting PR_SET_NO_NEW_PRIVS"); - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) { - debug("%s: prctl(PR_SET_NO_NEW_PRIVS): %s", - __func__, strerror(errno)); - nnp_failed = 1; - } + if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) + fatal_f("prctl(PR_SET_NO_NEW_PRIVS): %s", strerror(errno)); debug3_f("attaching seccomp filter program"); if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &preauth_program) == -1) - debug("%s: prctl(PR_SET_SECCOMP): %s", - __func__, strerror(errno)); - else if (nnp_failed) - fatal("%s: SECCOMP_MODE_FILTER activated but " - "PR_SET_NO_NEW_PRIVS failed", __func__); + fatal_f("prctl(PR_SET_SECCOMP): %s", strerror(errno)); } #endif /* SANDBOX_SECCOMP_FILTER */ @@ -270,4 +270,4 @@ CAVEATS requires careful quoting of any characters that have special meaning to the remote shell, such as quote characters. -OpenBSD 7.8 October 4, 2025 SCP(1) +OpenBSD 7.9 October 4, 2025 SCP(1) @@ -1,4 +1,4 @@ -/* $OpenBSD: scp.c,v 1.273 2026/04/02 07:42:16 djm Exp $ */ +/* $OpenBSD: scp.c,v 1.275 2026/06/28 23:47:16 djm Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -1679,8 +1679,8 @@ sink(int argc, char **argv, const char *src) setimes = targisdir = 0; mask = umask(0); if (!pflag) { - mask |= 07000; (void) umask(mask); + mask |= 07000; } if (argc != 1) { run_err("ambiguous target"); @@ -2039,6 +2039,10 @@ throughlocal_sftp(struct sftp_conn *from, struct sftp_conn *to, goto out; } + /* Special handling for source of '..' */ + if (strcmp(filename, "..") == 0) + filename = "."; /* Download to dest, not dest/.. */ + if (targetisdir) abs_dst = sftp_path_append(target, filename); else diff --git a/servconf.c b/servconf.c index 668259a2074b..ce388f1dd93f 100644 --- a/servconf.c +++ b/servconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.446 2026/04/02 07:38:14 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.450 2026/06/29 08:59:31 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * All rights reserved @@ -63,6 +63,8 @@ #include "digest.h" #include "version.h" +#define SSHD_CONFIG_BLOB_VERSION 1 + #if !defined(SSHD_PAM_SERVICE) # define SSHD_PAM_SERVICE "sshd" #endif @@ -83,136 +85,111 @@ void initialize_server_options(ServerOptions *options) { memset(options, 0, sizeof(*options)); +#define SSHCONF_INT(var, conf, flags, ms, def, cp) options->var = -1; +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) options->var = -1; +#define SSHCONF_STRING(var, conf, flags, cp) options->var = NULL; +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + options->nvar = 0; \ + options->var = NULL; +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + init_##funcsuffix(options) +#define SSHCONF_NONCONF(funcsuffix) \ + init_##funcsuffix(options) +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) options->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) options->var = NULL; +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ - /* Portable-specific options */ - options->use_pam = -1; - options->pam_service_name = NULL; - - /* Standard Options */ - options->num_ports = 0; - options->ports_from_cmdline = 0; - options->queued_listen_addrs = NULL; - options->num_queued_listens = 0; - options->listen_addrs = NULL; + /* Using macros for these is a bit overkill but forces consistency */ +#define init_hostkeyfile(options) \ + options->host_key_files = 0; \ + options->num_host_key_files = 0; \ + options->host_key_file_userprovided = NULL; +#define init_ipqos(options) \ + options->ip_qos_interactive = -1; \ + options->ip_qos_bulk = -1; +#define init_listenaddress(options) \ + options->queued_listen_addrs = NULL; \ + options->num_queued_listens = 0; \ + options->listen_addrs = NULL; \ options->num_listen_addrs = 0; - options->address_family = -1; - options->routing_domain = NULL; - options->num_host_key_files = 0; - options->num_host_cert_files = 0; - options->host_key_agent = NULL; - options->pid_file = NULL; - options->login_grace_time = -1; - options->permit_root_login = PERMIT_NOT_SET; - options->ignore_rhosts = -1; - options->ignore_user_known_hosts = -1; - options->print_motd = -1; - options->print_lastlog = -1; - options->x11_forwarding = -1; - options->x11_display_offset = -1; - options->x11_use_localhost = -1; - options->permit_tty = -1; - options->permit_user_rc = -1; - options->xauth_location = NULL; - options->strict_modes = -1; - options->tcp_keep_alive = -1; +#define init_logfacility(options) \ options->log_facility = SYSLOG_FACILITY_NOT_SET; +#define init_loglevel(options) \ options->log_level = SYSLOG_LEVEL_NOT_SET; - options->num_log_verbose = 0; - options->log_verbose = NULL; - options->hostbased_authentication = -1; - options->hostbased_uses_name_from_packet_only = -1; - options->hostbased_accepted_algos = NULL; - options->hostkeyalgorithms = NULL; - options->pubkey_authentication = -1; - options->pubkey_auth_options = -1; - options->pubkey_accepted_algos = NULL; - options->kerberos_authentication = -1; - options->kerberos_or_local_passwd = -1; - options->kerberos_ticket_cleanup = -1; - options->kerberos_get_afs_token = -1; - options->gss_authentication=-1; - options->gss_cleanup_creds = -1; - options->gss_deleg_creds = -1; - options->gss_strict_acceptor = -1; - options->password_authentication = -1; - options->kbd_interactive_authentication = -1; - options->permit_empty_passwd = -1; - options->permit_user_env = -1; - options->permit_user_env_allowlist = NULL; - options->compression = -1; - options->rekey_limit = -1; - options->rekey_interval = -1; - options->allow_tcp_forwarding = -1; - options->allow_streamlocal_forwarding = -1; - options->allow_agent_forwarding = -1; - options->num_allow_users = 0; - options->num_deny_users = 0; - options->num_allow_groups = 0; - options->num_deny_groups = 0; - options->ciphers = NULL; - options->macs = NULL; - options->kex_algorithms = NULL; - options->ca_sign_algorithms = NULL; +#define init_port(options) \ + options->num_ports = 0; \ + options->ports_from_cmdline = 0; +#define init_gatewayports(options) \ options->fwd_opts.gateway_ports = -1; +#define init_streamlocalbindmask(options) \ options->fwd_opts.streamlocal_bind_mask = (mode_t)-1; +#define init_streamlocalbindunlink(options) \ options->fwd_opts.streamlocal_bind_unlink = -1; - options->num_subsystems = 0; - options->max_startups_begin = -1; - options->max_startups_rate = -1; +#define init_maxstartups(options) \ + options->max_startups_begin = -1; \ + options->max_startups_rate = -1; \ options->max_startups = -1; - options->per_source_max_startups = -1; - options->per_source_masklen_ipv4 = -1; +#define init_permituserenv(options) \ + options->permit_user_env = -1; \ + options->permit_user_env_allowlist = NULL; +#define init_persourcenetblocksize(options) \ + options->per_source_masklen_ipv4 = -1; \ options->per_source_masklen_ipv6 = -1; - options->per_source_penalty_exempt = NULL; - options->per_source_penalty.enabled = -1; - options->per_source_penalty.max_sources4 = -1; - options->per_source_penalty.max_sources6 = -1; - options->per_source_penalty.overflow_mode = -1; - options->per_source_penalty.overflow_mode6 = -1; - options->per_source_penalty.penalty_crash = -1.0; - options->per_source_penalty.penalty_authfail = -1.0; - options->per_source_penalty.penalty_invaliduser = -1.0; - options->per_source_penalty.penalty_noauth = -1.0; - options->per_source_penalty.penalty_grace = -1.0; - options->per_source_penalty.penalty_refuseconnection = -1.0; - options->per_source_penalty.penalty_max = -1.0; +#define init_persourcepenalties(options) \ + options->per_source_penalty_exempt = NULL; \ + options->per_source_penalty.enabled = -1; \ + options->per_source_penalty.max_sources4 = -1; \ + options->per_source_penalty.max_sources6 = -1; \ + options->per_source_penalty.overflow_mode = -1; \ + options->per_source_penalty.overflow_mode6 = -1; \ + options->per_source_penalty.penalty_crash = -1.0; \ + options->per_source_penalty.penalty_authfail = -1.0; \ + options->per_source_penalty.penalty_invaliduser = -1.0; \ + options->per_source_penalty.penalty_noauth = -1.0; \ + options->per_source_penalty.penalty_grace = -1.0; \ + options->per_source_penalty.penalty_refuseconnection = -1.0; \ + options->per_source_penalty.penalty_max = -1.0; \ options->per_source_penalty.penalty_min = -1.0; - options->max_authtries = -1; - options->max_sessions = -1; - options->banner = NULL; - options->use_dns = -1; - options->client_alive_interval = -1; - options->client_alive_count_max = -1; - options->num_authkeys_files = 0; - options->num_accept_env = 0; - options->num_setenv = 0; - options->permit_tun = -1; - options->permitted_opens = NULL; - options->permitted_listens = NULL; - options->adm_forced_command = NULL; - options->chroot_directory = NULL; - options->authorized_keys_command = NULL; - options->authorized_keys_command_user = NULL; - options->revoked_keys_files = NULL; - options->num_revoked_keys_files = 0; - options->sk_provider = NULL; - options->trusted_user_ca_keys = NULL; - options->authorized_principals_file = NULL; - options->authorized_principals_command = NULL; - options->authorized_principals_command_user = NULL; - options->ip_qos_interactive = -1; - options->ip_qos_bulk = -1; - options->version_addendum = NULL; - options->fingerprint_hash = -1; - options->disable_forwarding = -1; - options->expose_userauth_info = -1; - options->required_rsa_size = -1; - options->channel_timeouts = NULL; - options->num_channel_timeouts = 0; - options->unused_connection_timeout = -1; - options->sshd_session_path = NULL; - options->sshd_auth_path = NULL; - options->refuse_connection = -1; +#define init_rekeylimit(options) \ + options->rekey_limit = -1; \ + options->rekey_interval = -1; +#define init_subsystem(options) \ + options->num_subsystems = 0; \ + options->subsystem_name = NULL; \ + options->subsystem_command = NULL; \ + options->subsystem_args = NULL; +#define init_timingsecret(options) \ + options->timing_secret = 0; + + SSHD_CONFIG_ENTRIES + +#undef init_hostkeyfile +#undef init_ipqos +#undef init_listenaddress +#undef init_logfacility +#undef init_loglevel +#undef init_port +#undef init_gatewayports +#undef init_streamlocalbindmask +#undef init_streamlocalbindunlink +#undef init_maxstartups +#undef init_permituserenv +#undef init_persourcenetblocksize +#undef init_persourcepenalties +#undef init_rekeylimit +#undef init_subsystem +#undef init_timingsecret +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS } /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ @@ -293,15 +270,47 @@ fill_default_server_options(ServerOptions *options) { u_int i; - /* Portable-specific options */ - if (options->use_pam == -1) - options->use_pam = 0; +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + if (options->var == -1) \ + options->var = def; +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + if (options->var == -1) \ + options->var = def; +#define SSHCONF_STRING(var, conf, flags, cp) /* done manually */ +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) /* done manually */ +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) /* done manually */ +#define SSHCONF_NONCONF(funcsuffix) /* done manually */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) options->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(options->var); \ + options->var = NULL; \ + } while (0); +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + /* XXX maybe use macros here too to force consistency? */ + + SSHD_CONFIG_ENTRIES + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS + +#ifdef USE_PAM if (options->pam_service_name == NULL) options->pam_service_name = xstrdup(SSHD_PAM_SERVICE); +#endif - /* Standard Options */ if (options->num_host_key_files == 0) { - /* fill default hostkeys for protocols */ + /* fill default hostkeys */ servconf_add_hostkey("[default]", 0, options, _PATH_HOST_RSA_KEY_FILE, 0); #ifdef OPENSSL_HAS_ECC @@ -310,101 +319,32 @@ fill_default_server_options(ServerOptions *options) #endif servconf_add_hostkey("[default]", 0, options, _PATH_HOST_ED25519_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_MLDSA44_ED25519_KEY_FILE, 0); } /* No certificates by default */ if (options->num_ports == 0) options->ports[options->num_ports++] = SSH_DEFAULT_PORT; - if (options->address_family == -1) - options->address_family = AF_UNSPEC; if (options->listen_addrs == NULL) add_listen_addr(options, NULL, NULL, 0); if (options->pid_file == NULL) options->pid_file = xstrdup(_PATH_SSH_DAEMON_PID_FILE); if (options->moduli_file == NULL) options->moduli_file = xstrdup(_PATH_DH_MODULI); - if (options->login_grace_time == -1) - options->login_grace_time = 120; - if (options->permit_root_login == PERMIT_NOT_SET) - options->permit_root_login = PERMIT_NO_PASSWD; - if (options->ignore_rhosts == -1) - options->ignore_rhosts = 1; - if (options->ignore_user_known_hosts == -1) - options->ignore_user_known_hosts = 0; - if (options->print_motd == -1) - options->print_motd = 1; - if (options->print_lastlog == -1) - options->print_lastlog = 1; - if (options->x11_forwarding == -1) - options->x11_forwarding = 0; - if (options->x11_display_offset == -1) - options->x11_display_offset = 10; - if (options->x11_use_localhost == -1) - options->x11_use_localhost = 1; if (options->xauth_location == NULL) options->xauth_location = xstrdup(_PATH_XAUTH); - if (options->permit_tty == -1) - options->permit_tty = 1; - if (options->permit_user_rc == -1) - options->permit_user_rc = 1; - if (options->strict_modes == -1) - options->strict_modes = 1; - if (options->tcp_keep_alive == -1) - options->tcp_keep_alive = 1; if (options->log_facility == SYSLOG_FACILITY_NOT_SET) options->log_facility = SYSLOG_FACILITY_AUTH; if (options->log_level == SYSLOG_LEVEL_NOT_SET) options->log_level = SYSLOG_LEVEL_INFO; - if (options->hostbased_authentication == -1) - options->hostbased_authentication = 0; - if (options->hostbased_uses_name_from_packet_only == -1) - options->hostbased_uses_name_from_packet_only = 0; - if (options->pubkey_authentication == -1) - options->pubkey_authentication = 1; - if (options->pubkey_auth_options == -1) - options->pubkey_auth_options = 0; - if (options->kerberos_authentication == -1) - options->kerberos_authentication = 0; - if (options->kerberos_or_local_passwd == -1) - options->kerberos_or_local_passwd = 1; - if (options->kerberos_ticket_cleanup == -1) - options->kerberos_ticket_cleanup = 1; - if (options->kerberos_get_afs_token == -1) - options->kerberos_get_afs_token = 0; - if (options->gss_authentication == -1) - options->gss_authentication = 0; - if (options->gss_cleanup_creds == -1) - options->gss_cleanup_creds = 1; - if (options->gss_deleg_creds == -1) - options->gss_deleg_creds = 1; - if (options->gss_strict_acceptor == -1) - options->gss_strict_acceptor = 1; - if (options->password_authentication == -1) - options->password_authentication = 1; - if (options->kbd_interactive_authentication == -1) - options->kbd_interactive_authentication = 1; - if (options->permit_empty_passwd == -1) - options->permit_empty_passwd = 0; if (options->permit_user_env == -1) { options->permit_user_env = 0; options->permit_user_env_allowlist = NULL; } - if (options->compression == -1) -#ifdef WITH_ZLIB - options->compression = COMP_DELAYED; -#else - options->compression = COMP_NONE; -#endif - if (options->rekey_limit == -1) options->rekey_limit = 0; if (options->rekey_interval == -1) options->rekey_interval = 0; - if (options->allow_tcp_forwarding == -1) - options->allow_tcp_forwarding = FORWARD_ALLOW; - if (options->allow_streamlocal_forwarding == -1) - options->allow_streamlocal_forwarding = FORWARD_ALLOW; - if (options->allow_agent_forwarding == -1) - options->allow_agent_forwarding = 1; if (options->fwd_opts.gateway_ports == -1) options->fwd_opts.gateway_ports = 0; if (options->max_startups == -1) @@ -413,8 +353,6 @@ fill_default_server_options(ServerOptions *options) options->max_startups_rate = 30; /* 30% */ if (options->max_startups_begin == -1) options->max_startups_begin = 10; - if (options->per_source_max_startups == -1) - options->per_source_max_startups = INT_MAX; if (options->per_source_masklen_ipv4 == -1) options->per_source_masklen_ipv4 = 32; if (options->per_source_masklen_ipv6 == -1) @@ -445,16 +383,6 @@ fill_default_server_options(ServerOptions *options) options->per_source_penalty.penalty_min = 15.0; if (options->per_source_penalty.penalty_max < 0.0) options->per_source_penalty.penalty_max = 600.0; - if (options->max_authtries == -1) - options->max_authtries = DEFAULT_AUTH_FAIL_MAX; - if (options->max_sessions == -1) - options->max_sessions = DEFAULT_SESSIONS_MAX; - if (options->use_dns == -1) - options->use_dns = 0; - if (options->client_alive_interval == -1) - options->client_alive_interval = 0; - if (options->client_alive_count_max == -1) - options->client_alive_count_max = 3; if (options->num_authkeys_files == 0) { opt_array_append("[default]", 0, "AuthorizedKeysFiles", &options->authorized_keys_files, @@ -465,8 +393,6 @@ fill_default_server_options(ServerOptions *options) &options->num_authkeys_files, _PATH_SSH_USER_PERMITTED_KEYS2); } - if (options->permit_tun == -1) - options->permit_tun = SSH_TUNMODE_NO; if (options->ip_qos_interactive == -1) options->ip_qos_interactive = IPTOS_DSCP_EF; if (options->ip_qos_bulk == -1) @@ -477,24 +403,12 @@ fill_default_server_options(ServerOptions *options) options->fwd_opts.streamlocal_bind_mask = 0177; if (options->fwd_opts.streamlocal_bind_unlink == -1) options->fwd_opts.streamlocal_bind_unlink = 0; - if (options->fingerprint_hash == -1) - options->fingerprint_hash = SSH_FP_HASH_DEFAULT; - if (options->disable_forwarding == -1) - options->disable_forwarding = 0; - if (options->expose_userauth_info == -1) - options->expose_userauth_info = 0; if (options->sk_provider == NULL) options->sk_provider = xstrdup("internal"); - if (options->required_rsa_size == -1) - options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE; - if (options->unused_connection_timeout == -1) - options->unused_connection_timeout = 0; if (options->sshd_session_path == NULL) options->sshd_session_path = xstrdup(_PATH_SSHD_SESSION); if (options->sshd_auth_path == NULL) options->sshd_auth_path = xstrdup(_PATH_SSHD_AUTH); - if (options->refuse_connection == -1) - options->refuse_connection = 0; assemble_algorithms(options); @@ -540,47 +454,35 @@ fill_default_server_options(ServerOptions *options) #undef CLEAR_ON_NONE_ARRAY } +/* Macros to declare ServerOpCodes enum values */ +#define SSHCONF_INT(var, conf, flags, ms, def, cp) s##conf, +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) s##conf, +#define SSHCONF_STRING(var, conf, flags, cp) s##conf, +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) s##conf, +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) s##conf, +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) /* empty */ +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + /* Keyword tokens. */ typedef enum { sBadOption, /* == unknown option */ - /* Portable-specific options */ - sUsePAM, sPAMServiceName, - /* Standard Options */ - sPort, sHostKeyFile, sLoginGraceTime, - sPermitRootLogin, sLogFacility, sLogLevel, sLogVerbose, - sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, - sKerberosGetAFSToken, sPasswordAuthentication, - sKbdInteractiveAuthentication, sListenAddress, sAddressFamily, - sPrintMotd, sPrintLastLog, sIgnoreRhosts, - sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost, - sPermitTTY, sStrictModes, sEmptyPasswd, sTCPKeepAlive, - sPermitUserEnvironment, sAllowTcpForwarding, sCompression, - sRekeyLimit, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups, - sIgnoreUserKnownHosts, sCiphers, sMacs, sPidFile, sModuliFile, - sGatewayPorts, sPubkeyAuthentication, sPubkeyAcceptedAlgorithms, - sXAuthLocation, sSubsystem, sMaxStartups, sMaxAuthTries, sMaxSessions, - sBanner, sUseDNS, sHostbasedAuthentication, - sHostbasedUsesNameFromPacketOnly, sHostbasedAcceptedAlgorithms, - sHostKeyAlgorithms, sPerSourceMaxStartups, sPerSourceNetBlockSize, - sPerSourcePenalties, sPerSourcePenaltyExemptList, - sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile, - sGssAuthentication, sGssCleanupCreds, sGssDelegateCreds, sGssStrictAcceptor, - sAcceptEnv, sSetEnv, sPermitTunnel, - sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory, - sUsePrivilegeSeparation, sAllowAgentForwarding, - sHostCertificate, sInclude, - sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile, - sAuthorizedPrincipalsCommand, sAuthorizedPrincipalsCommandUser, - sKexAlgorithms, sCASignatureAlgorithms, sIPQoS, sVersionAddendum, - sAuthorizedKeysCommand, sAuthorizedKeysCommandUser, - sAuthenticationMethods, sHostKeyAgent, sPermitUserRC, - sStreamLocalBindMask, sStreamLocalBindUnlink, - sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding, - sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider, - sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout, - sSshdSessionPath, sSshdAuthPath, sRefuseConnection, + SSHD_CONFIG_ENTRIES + sMatch, sInclude, sDeprecated, sIgnore, sUnsupported } ServerOpCodes; +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS #define SSHCFG_GLOBAL 0x01 /* allowed in main section of config */ #define SSHCFG_MATCH 0x02 /* allowed inside a Match section */ @@ -588,170 +490,48 @@ typedef enum { #define SSHCFG_NEVERMATCH 0x04 /* Match never matches; internal only */ #define SSHCFG_MATCH_ONLY 0x08 /* Match only in conditional blocks; internal only */ +/* Macros to define keywords[] entries */ +#define SSHCONF_KW(conf, flags) { #conf, s##conf, flags }, +#define SSHCONF_INT(var, conf, flags, ms, def, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_STRING(var, conf, flags, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_DEPRECATED sDeprecated +#define SSHCONF_IGNORE sIgnore +#define SSHCONF_DEPRECATE(conf, flags, opcode) \ + { #conf, opcode, flags }, +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) \ + { #conf, sUnsupported, flags }, +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + { #conf, sUnsupported, flags }, +#define SSHCONF_ALIAS(old, conf, flags) \ + { #old, s##conf, flags }, + /* Textual representation of the tokens. */ static struct { const char *name; ServerOpCodes opcode; u_int flags; } keywords[] = { - /* Portable-specific options */ -#ifdef USE_PAM - { "usepam", sUsePAM, SSHCFG_GLOBAL }, - { "pamservicename", sPAMServiceName, SSHCFG_ALL }, -#else - { "usepam", sUnsupported, SSHCFG_GLOBAL }, - { "pamservicename", sUnsupported, SSHCFG_ALL }, -#endif - { "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL }, - /* Standard Options */ - { "port", sPort, SSHCFG_GLOBAL }, - { "hostkey", sHostKeyFile, SSHCFG_GLOBAL }, - { "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL }, /* alias */ - { "hostkeyagent", sHostKeyAgent, SSHCFG_GLOBAL }, - { "pidfile", sPidFile, SSHCFG_GLOBAL }, - { "modulifile", sModuliFile, SSHCFG_GLOBAL }, - { "serverkeybits", sDeprecated, SSHCFG_GLOBAL }, - { "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL }, - { "keyregenerationinterval", sDeprecated, SSHCFG_GLOBAL }, - { "permitrootlogin", sPermitRootLogin, SSHCFG_ALL }, - { "syslogfacility", sLogFacility, SSHCFG_GLOBAL }, - { "loglevel", sLogLevel, SSHCFG_ALL }, - { "logverbose", sLogVerbose, SSHCFG_ALL }, - { "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL }, - { "rhostsrsaauthentication", sDeprecated, SSHCFG_ALL }, - { "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL }, - { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_ALL }, - { "hostbasedacceptedalgorithms", sHostbasedAcceptedAlgorithms, SSHCFG_ALL }, - { "hostbasedacceptedkeytypes", sHostbasedAcceptedAlgorithms, SSHCFG_ALL }, /* obsolete */ - { "hostkeyalgorithms", sHostKeyAlgorithms, SSHCFG_GLOBAL }, - { "rsaauthentication", sDeprecated, SSHCFG_ALL }, - { "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL }, - { "pubkeyacceptedalgorithms", sPubkeyAcceptedAlgorithms, SSHCFG_ALL }, - { "pubkeyacceptedkeytypes", sPubkeyAcceptedAlgorithms, SSHCFG_ALL }, /* obsolete */ - { "pubkeyauthoptions", sPubkeyAuthOptions, SSHCFG_ALL }, - { "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */ -#ifdef KRB5 - { "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL }, - { "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL }, - { "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL }, -#ifdef USE_AFS - { "kerberosgetafstoken", sKerberosGetAFSToken, SSHCFG_GLOBAL }, -#else - { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, -#endif -#else - { "kerberosauthentication", sUnsupported, SSHCFG_ALL }, - { "kerberosorlocalpasswd", sUnsupported, SSHCFG_GLOBAL }, - { "kerberosticketcleanup", sUnsupported, SSHCFG_GLOBAL }, - { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, -#endif - { "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL }, - { "afstokenpassing", sUnsupported, SSHCFG_GLOBAL }, -#ifdef GSSAPI - { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL }, - { "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL }, - { "gssapidelegatecredentials", sGssDelegateCreds, SSHCFG_GLOBAL }, - { "gssapistrictacceptorcheck", sGssStrictAcceptor, SSHCFG_GLOBAL }, -#else - { "gssapiauthentication", sUnsupported, SSHCFG_ALL }, - { "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL }, - { "gssapidelegatecredentials", sUnsupported, SSHCFG_GLOBAL }, - { "gssapistrictacceptorcheck", sUnsupported, SSHCFG_GLOBAL }, -#endif - { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL }, - { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, - { "challengeresponseauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */ - { "skeyauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */ - { "checkmail", sDeprecated, SSHCFG_GLOBAL }, - { "listenaddress", sListenAddress, SSHCFG_GLOBAL }, - { "addressfamily", sAddressFamily, SSHCFG_GLOBAL }, - { "printmotd", sPrintMotd, SSHCFG_GLOBAL }, -#ifdef DISABLE_LASTLOG - { "printlastlog", sUnsupported, SSHCFG_GLOBAL }, -#else - { "printlastlog", sPrintLastLog, SSHCFG_GLOBAL }, -#endif - { "ignorerhosts", sIgnoreRhosts, SSHCFG_ALL }, - { "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL }, - { "x11forwarding", sX11Forwarding, SSHCFG_ALL }, - { "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL }, - { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL }, - { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL }, - { "strictmodes", sStrictModes, SSHCFG_GLOBAL }, - { "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL }, - { "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL }, - { "uselogin", sDeprecated, SSHCFG_GLOBAL }, - { "compression", sCompression, SSHCFG_GLOBAL }, - { "rekeylimit", sRekeyLimit, SSHCFG_ALL }, - { "tcpkeepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, - { "keepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, /* obsolete alias */ - { "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL }, - { "allowagentforwarding", sAllowAgentForwarding, SSHCFG_ALL }, - { "allowusers", sAllowUsers, SSHCFG_ALL }, - { "denyusers", sDenyUsers, SSHCFG_ALL }, - { "allowgroups", sAllowGroups, SSHCFG_ALL }, - { "denygroups", sDenyGroups, SSHCFG_ALL }, - { "ciphers", sCiphers, SSHCFG_GLOBAL }, - { "macs", sMacs, SSHCFG_GLOBAL }, - { "protocol", sIgnore, SSHCFG_GLOBAL }, - { "gatewayports", sGatewayPorts, SSHCFG_ALL }, - { "subsystem", sSubsystem, SSHCFG_ALL }, - { "maxstartups", sMaxStartups, SSHCFG_GLOBAL }, - { "persourcemaxstartups", sPerSourceMaxStartups, SSHCFG_GLOBAL }, - { "persourcenetblocksize", sPerSourceNetBlockSize, SSHCFG_GLOBAL }, - { "persourcepenalties", sPerSourcePenalties, SSHCFG_GLOBAL }, - { "persourcepenaltyexemptlist", sPerSourcePenaltyExemptList, SSHCFG_GLOBAL }, - { "maxauthtries", sMaxAuthTries, SSHCFG_ALL }, - { "maxsessions", sMaxSessions, SSHCFG_ALL }, - { "banner", sBanner, SSHCFG_ALL }, - { "usedns", sUseDNS, SSHCFG_GLOBAL }, - { "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL }, - { "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL }, - { "clientaliveinterval", sClientAliveInterval, SSHCFG_ALL }, - { "clientalivecountmax", sClientAliveCountMax, SSHCFG_ALL }, - { "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_ALL }, - { "authorizedkeysfile2", sDeprecated, SSHCFG_ALL }, - { "useprivilegeseparation", sDeprecated, SSHCFG_GLOBAL}, - { "acceptenv", sAcceptEnv, SSHCFG_ALL }, - { "setenv", sSetEnv, SSHCFG_ALL }, - { "permittunnel", sPermitTunnel, SSHCFG_ALL }, - { "permittty", sPermitTTY, SSHCFG_ALL }, - { "permituserrc", sPermitUserRC, SSHCFG_ALL }, + SSHD_CONFIG_ENTRIES { "match", sMatch, SSHCFG_ALL }, - { "permitopen", sPermitOpen, SSHCFG_ALL }, - { "permitlisten", sPermitListen, SSHCFG_ALL }, - { "forcecommand", sForceCommand, SSHCFG_ALL }, - { "chrootdirectory", sChrootDirectory, SSHCFG_ALL }, - { "hostcertificate", sHostCertificate, SSHCFG_GLOBAL }, - { "revokedkeys", sRevokedKeys, SSHCFG_ALL }, - { "trustedusercakeys", sTrustedUserCAKeys, SSHCFG_ALL }, - { "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL }, - { "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL }, { "include", sInclude, SSHCFG_ALL }, - { "ipqos", sIPQoS, SSHCFG_ALL }, - { "authorizedkeyscommand", sAuthorizedKeysCommand, SSHCFG_ALL }, - { "authorizedkeyscommanduser", sAuthorizedKeysCommandUser, SSHCFG_ALL }, - { "authorizedprincipalscommand", sAuthorizedPrincipalsCommand, SSHCFG_ALL }, - { "authorizedprincipalscommanduser", sAuthorizedPrincipalsCommandUser, SSHCFG_ALL }, - { "versionaddendum", sVersionAddendum, SSHCFG_GLOBAL }, - { "authenticationmethods", sAuthenticationMethods, SSHCFG_ALL }, - { "streamlocalbindmask", sStreamLocalBindMask, SSHCFG_ALL }, - { "streamlocalbindunlink", sStreamLocalBindUnlink, SSHCFG_ALL }, - { "allowstreamlocalforwarding", sAllowStreamLocalForwarding, SSHCFG_ALL }, - { "fingerprinthash", sFingerprintHash, SSHCFG_GLOBAL }, - { "disableforwarding", sDisableForwarding, SSHCFG_ALL }, - { "exposeauthinfo", sExposeAuthInfo, SSHCFG_ALL }, - { "rdomain", sRDomain, SSHCFG_ALL }, - { "casignaturealgorithms", sCASignatureAlgorithms, SSHCFG_ALL }, - { "securitykeyprovider", sSecurityKeyProvider, SSHCFG_GLOBAL }, - { "requiredrsasize", sRequiredRSASize, SSHCFG_ALL }, - { "channeltimeout", sChannelTimeout, SSHCFG_ALL }, - { "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL }, - { "sshdsessionpath", sSshdSessionPath, SSHCFG_GLOBAL }, - { "sshdauthpath", sSshdAuthPath, SSHCFG_GLOBAL }, - { "refuseconnection", sRefuseConnection, SSHCFG_ALL }, { NULL, sBadOption, 0 } }; +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATED +#undef SSHCONF_IGNORE +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS static struct { int val; @@ -1044,12 +824,13 @@ match_cfg_line(const char *full_line, int *acp, char ***avp, full_line, line); } else { debug3("checking match for '%s' user %s%s host %s addr %s " - "laddr %s lport %d on line %d", full_line, + "laddr %s lport %d rdomain %s on line %d", full_line, ci->user ? ci->user : "(null)", ci->user_invalid ? " (invalid)" : "", ci->host ? ci->host : "(null)", ci->address ? ci->address : "(null)", - ci->laddress ? ci->laddress : "(null)", ci->lport, line); + ci->laddress ? ci->laddress : "(null)", ci->lport, + ci->rdomain ? ci->rdomain : "(null)", line); } while ((oattrib = argv_next(acp, avp)) != NULL) { @@ -1389,6 +1170,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, switch (opcode) { /* Portable-specific options */ +#ifdef USE_PAM case sUsePAM: intptr = &options->use_pam; goto parse_flag; @@ -1402,6 +1184,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, if (*activep && *charptr == NULL) *charptr = xstrdup(arg); break; +#endif /* Standard Options */ case sBadOption: @@ -1499,7 +1282,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, *intptr = value; break; - case sHostKeyFile: + case sHostKey: arg = argv_next(&ac, &av); if (!arg || *arg == '\0') fatal("%s line %d: missing file name.", @@ -1630,6 +1413,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, *intptr = value; break; +#ifdef KRB5 case sKerberosAuthentication: intptr = &options->kerberos_authentication; goto parse_flag; @@ -1641,11 +1425,14 @@ process_server_config_line_depth(ServerOptions *options, char *line, case sKerberosTicketCleanup: intptr = &options->kerberos_ticket_cleanup; goto parse_flag; - +#ifdef USE_AFS case sKerberosGetAFSToken: intptr = &options->kerberos_get_afs_token; goto parse_flag; +#endif /* USE_AFS */ +#endif /* KRB5 */ +#ifdef GSSAPI case sGssAuthentication: intptr = &options->gss_authentication; goto parse_flag; @@ -1661,6 +1448,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, case sGssStrictAcceptor: intptr = &options->gss_strict_acceptor; goto parse_flag; +#endif /* GSSAPI */ case sPasswordAuthentication: intptr = &options->password_authentication; @@ -1674,9 +1462,11 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->print_motd; goto parse_flag; +#ifndef DISABLE_LASTLOG case sPrintLastLog: intptr = &options->print_lastlog; goto parse_flag; +#endif case sX11Forwarding: intptr = &options->x11_forwarding; @@ -1717,7 +1507,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->tcp_keep_alive; goto parse_flag; - case sEmptyPasswd: + case sPermitEmptyPasswords: intptr = &options->permit_empty_passwd; goto parse_flag; @@ -1789,7 +1579,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->use_dns; goto parse_flag; - case sLogFacility: + case sSyslogFacility: log_facility_ptr = &options->log_facility; arg = argv_next(&ac, &av); value = log_facility_number(arg); @@ -2376,7 +2166,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, debug2("%s line %d: no match for %s", filename, linenum, arg); item = xcalloc(1, sizeof(*item)); - item->selector = strdup(arg); + item->selector = xstrdup(arg); TAILQ_INSERT_TAIL(includes, item, entry); } @@ -2386,8 +2176,8 @@ process_server_config_line_depth(ServerOptions *options, char *line, debug2("%s line %d: including %s", filename, linenum, gbuf.gl_pathv[n]); item = xcalloc(1, sizeof(*item)); - item->selector = strdup(arg); - item->filename = strdup(gbuf.gl_pathv[n]); + item->selector = xstrdup(arg); + item->filename = xstrdup(gbuf.gl_pathv[n]); if ((item->contents = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); load_server_config(item->filename, @@ -2854,6 +2644,7 @@ parse_server_match_config(ServerOptions *options, parse_server_config(&mo, "reprocess config", cfg, includes, connectinfo, 0); copy_set_server_options(options, &mo, 0); + free_server_options(&mo); } int @@ -2932,93 +2723,1231 @@ servconf_merge_subsystems(ServerOptions *dst, ServerOptions *src) } } +static int +serialise_s32(struct sshbuf *buf, int v) +{ + uint32_t uv; + int r; + + uv = v < 0 ? (uint32_t)(-(v + 1)) + 1 : (uint32_t)v; + if ((r = sshbuf_put_u8(buf, v < 0)) != 0 || + (r = sshbuf_put_u32(buf, uv)) != 0) + return r; + return 0; +} + +static int +serialise_s64(struct sshbuf *buf, int64_t v) +{ + uint64_t uv; + int r; + + uv = v < 0 ? (uint64_t)(-(v + 1)) + 1 : (uint64_t)v; + if ((r = sshbuf_put_u8(buf, v < 0)) != 0 || + (r = sshbuf_put_u64(buf, uv)) != 0) + return r; + return 0; +} + +static int +serialise_mode(struct sshbuf *buf, mode_t v) +{ + u_int uv; + + if (v == (mode_t)-1) + return serialise_s32(buf, -1); + uv = (u_int)v; + if ((mode_t)uv != v || uv > 0777) + return SSH_ERR_INVALID_FORMAT; + return serialise_s32(buf, (int)uv); +} + +static int +serialise_double(struct sshbuf *buf, double v) +{ + /* + * XXX this is no good for a wire encoding. + * It's fine for passing configurations via RPC, but it would + * be nicer to have an exact binary encoding here. + */ + return sshbuf_put(buf, &v, sizeof(v)); +} + +static int +serialise_nullable_string(struct sshbuf *buf, const char *s) +{ + int r; + + if ((r = sshbuf_put_u8(buf, s != NULL)) != 0) + return r; + if (s == NULL) + return 0; + return sshbuf_put_cstring(buf, s); +} + +static int +serialise_nullable_string_array(struct sshbuf *buf, char **a, u_int n) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, n)) != 0) + return r; + for (i = 0; i < n; i++) { + if ((r = serialise_nullable_string(buf, a[i])) != 0) + return r; + } + return 0; +} + +static int +serialise_hostkeyfile(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, options->num_host_key_files)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_host_key_files; i++) { + if ((r = serialise_s32(buf, + options->host_key_file_userprovided[i])) != 0 || + (r = serialise_nullable_string(buf, + options->host_key_files[i])) != 0) { + error_fr(r, "serialise member"); + return r; + } + } + return 0; +} + +static int +serialise_ipqos(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->ip_qos_interactive)) != 0 || + (r = serialise_s32(buf, options->ip_qos_bulk)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_listenaddress(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + /* Note: only serialises queued listen addresses */ + if ((r = sshbuf_put_u32(buf, options->num_queued_listens)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_queued_listens; i++) { + const struct queued_listenaddr *qla = + options->queued_listen_addrs + i; + + if ((r = sshbuf_put_cstring(buf, qla->addr)) != 0 || + (r = serialise_s32(buf, qla->port)) != 0 || + (r = serialise_nullable_string(buf, qla->rdomain)) != 0) { + error_fr(r, "serialise member"); + return r; + } + } + return 0; +} + +static int +serialise_logfacility(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, (int)options->log_facility)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_loglevel(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, (int)options->log_level)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_port(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, options->num_ports)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_ports; i++) { + if ((r = serialise_s32(buf, options->ports[i])) != 0) { + error_fr(r, "serialise port"); + return r; + } + } + return 0; +} + +static int +serialise_gatewayports(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->fwd_opts.gateway_ports)) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + +static int +serialise_streamlocalbindmask(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_mode(buf, + options->fwd_opts.streamlocal_bind_mask)) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + +static int +serialise_streamlocalbindunlink(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = sshbuf_put_u8(buf, + (options->fwd_opts.streamlocal_bind_unlink != 0))) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + +static int +serialise_maxstartups(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->max_startups_begin)) != 0 || + (r = serialise_s32(buf, options->max_startups_rate)) != 0 || + (r = serialise_s32(buf, options->max_startups)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_permituserenv(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->permit_user_env)) != 0 || + (r = serialise_nullable_string(buf, + options->permit_user_env_allowlist)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_persourcenetblocksize(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->per_source_masklen_ipv4)) != 0 || + (r = serialise_s32(buf, options->per_source_masklen_ipv6)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_persourcepenalties(const ServerOptions *options, struct sshbuf *buf) +{ + const struct per_source_penalty *psp = &options->per_source_penalty; + int r; + + if ((r = serialise_s32(buf, psp->enabled)) != 0 || + (r = serialise_s32(buf, psp->max_sources4)) != 0 || + (r = serialise_s32(buf, psp->max_sources6)) != 0 || + (r = serialise_s32(buf, psp->overflow_mode)) != 0 || + (r = serialise_s32(buf, psp->overflow_mode6)) != 0 || + (r = serialise_double(buf, psp->penalty_crash)) != 0 || + (r = serialise_double(buf, psp->penalty_grace)) != 0 || + (r = serialise_double(buf, psp->penalty_authfail)) != 0 || + (r = serialise_double(buf, psp->penalty_invaliduser)) != 0 || + (r = serialise_double(buf, psp->penalty_noauth)) != 0 || + (r = serialise_double(buf, psp->penalty_refuseconnection)) != 0 || + (r = serialise_double(buf, psp->penalty_max)) != 0 || + (r = serialise_double(buf, psp->penalty_min)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_rekeylimit(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s64(buf, options->rekey_limit)) != 0 || + (r = serialise_s32(buf, options->rekey_interval)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_subsystem(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, options->num_subsystems)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_subsystems; i++) { + if ((r = sshbuf_put_cstring(buf, + options->subsystem_name[i])) != 0 || + (r = sshbuf_put_cstring(buf, + options->subsystem_command[i])) != 0 || + (r = sshbuf_put_cstring(buf, + options->subsystem_args[i])) != 0) { + error_fr(r, "serialise member"); + return r; + } + } + return 0; +} + +static int +serialise_timingsecret(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = sshbuf_put_u64(buf, options->timing_secret)) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + + +int +serialise_server_options(const ServerOptions *options, struct sshbuf **bufp) +{ + struct sshbuf *buf = NULL; + int r = SSH_ERR_INTERNAL_ERROR; + + *bufp = NULL; + + if ((buf = sshbuf_new()) == NULL) + return SSH_ERR_ALLOC_FAIL; + if ((r = sshbuf_put_u32(buf, SSHD_CONFIG_BLOB_VERSION)) != 0) { + error_fr(r, "serialise version"); + goto out; + } + +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + if ((r = serialise_s32(buf, options->var)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + if ((r = serialise_s32(buf, options->var)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRING(var, conf, flags, cp) \ + if ((r = serialise_nullable_string(buf, options->var)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + if ((r = serialise_nullable_string_array(buf, options->var, \ + options->nvar)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + if ((r = serialise_##funcsuffix(options, buf)) != 0) \ + goto out; +#define SSHCONF_NONCONF(funcsuffix) \ + if ((r = serialise_##funcsuffix(options, buf)) != 0) \ + goto out; +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) /* empty */ +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + SSHD_CONFIG_ENTRIES + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS + + /* success */ + r = 0; + *bufp = buf; + buf = NULL; /* transferred */ + out: + sshbuf_free(buf); + return r; +} + +static int +deserialise_s32(struct sshbuf *buf, int *v) +{ + uint32_t tmp; + int r; + u_char was_signed; + + if ((r = sshbuf_get_u8(buf, &was_signed)) != 0 || + (r = sshbuf_get_u32(buf, &tmp)) != 0) + return r; + if (was_signed > 1) + return SSH_ERR_INVALID_FORMAT; + if (was_signed) { + if (tmp > (uint32_t)INT_MAX + 1) + return SSH_ERR_INVALID_FORMAT; + *v = tmp == (uint32_t)INT_MAX + 1 ? INT_MIN : -(int)tmp; + } else { + if (tmp > INT_MAX) + return SSH_ERR_INVALID_FORMAT; + *v = (int)tmp; + } + return 0; +} + +static int +deserialise_s64(struct sshbuf *buf, int64_t *v) +{ + uint64_t tmp; + int r; + u_char was_signed; + + if ((r = sshbuf_get_u8(buf, &was_signed)) != 0 || + (r = sshbuf_get_u64(buf, &tmp)) != 0) + return r; + if (was_signed > 1) + return SSH_ERR_INVALID_FORMAT; + if (was_signed) { + if (tmp > (uint64_t)INT64_MAX + 1) + return SSH_ERR_INVALID_FORMAT; + *v = tmp == (uint64_t)INT64_MAX + 1 ? + INT64_MIN : -(int64_t)tmp; + } else { + if (tmp > INT64_MAX) + return SSH_ERR_INVALID_FORMAT; + *v = (int64_t)tmp; + } + return 0; +} + +static int +deserialise_mode(struct sshbuf *buf, mode_t *v) +{ + int r, tmp; + + if ((r = deserialise_s32(buf, &tmp)) != 0) + return r; + if (tmp == -1) { + *v = (mode_t)-1; + return 0; + } + if (tmp < 0 || tmp > 0777) + return SSH_ERR_INVALID_FORMAT; + *v = (mode_t)tmp; + return 0; +} + +static int +deserialise_double(struct sshbuf *buf, double *v) +{ + return sshbuf_get(buf, v, sizeof(*v)); +} + +static int +deserialise_nullable_string(struct sshbuf *buf, char **sp) +{ + int r; + u_char present; + + if ((r = sshbuf_get_u8(buf, &present)) != 0) + return r; + if (present == 0) { + *sp = NULL; + return 0; + } + if (present != 1) + return SSH_ERR_INVALID_FORMAT; + return sshbuf_get_cstring(buf, sp, NULL); +} + +static void +free_string_array(char **a, u_int n) +{ + u_int i; + + if (a == NULL) + return; + for (i = 0; i < n; i++) + free(a[i]); + free(a); +} + +static int +deserialise_count(struct sshbuf *buf, u_int *np, const char *what) +{ + int r; + uint32_t n; + + if ((r = sshbuf_get_u32(buf, &n)) != 0) { + error_fr(r, "deserialise %s length", what); + return r; + } + if (n > UINT_MAX) { + error_f("bad number of %s", what); + return SSH_ERR_INVALID_FORMAT; + } + if (n > sshbuf_len(buf)) { + error_f("bad number of %s", what); + return SSH_ERR_INVALID_FORMAT; + } + *np = n; + return 0; +} + +static int +deserialise_nullable_string_array(struct sshbuf *buf, char ***arrayp, + u_int *np) +{ + char **a = NULL; + int r; + u_int i, n; + + *arrayp = NULL; + *np = 0; + if ((r = deserialise_count(buf, &n, "strings")) != 0) + return r; + if (n > 0) + a = xcalloc(n, sizeof(*a)); + for (i = 0; i < n; i++) { + if ((r = deserialise_nullable_string(buf, a + i)) != 0) { + free_string_array(a, i + 1); + return r; + } + } + *arrayp = a; + *np = n; + return 0; +} + +static void +free_queued_listen_addrs(struct queued_listenaddr *qla, u_int n) +{ + u_int i; + + if (qla == NULL) + return; + for (i = 0; i < n; i++) { + free(qla[i].addr); + free(qla[i].rdomain); + } + free(qla); +} + +static int +deserialise_hostkeyfile(ServerOptions *options, struct sshbuf *buf) +{ + int r, *userprovided = NULL; + u_int i, n; + char **files = NULL; + + if ((r = deserialise_count(buf, &n, "host key files")) != 0) + return r; + if (n > 0) { + userprovided = xcalloc(n, sizeof(*userprovided)); + files = xcalloc(n, sizeof(*files)); + } + for (i = 0; i < n; i++) { + if ((r = deserialise_s32(buf, userprovided + i)) != 0 || + (r = deserialise_nullable_string(buf, files + i)) != 0) { + error_fr(r, "deserialise member"); + free_string_array(files, i + 1); + free(userprovided); + return r; + } + } + options->num_host_key_files = n; + options->host_key_file_userprovided = userprovided; + options->host_key_files = files; + return 0; +} + +static int +deserialise_ipqos(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->ip_qos_interactive)) != 0 || + (r = deserialise_s32(buf, &options->ip_qos_bulk)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_listenaddress(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i, n; + struct queued_listenaddr *qla = NULL; + + if ((r = deserialise_count(buf, &n, "listen addresses")) != 0) + return r; + if (n > 0) + qla = xcalloc(n, sizeof(*qla)); + for (i = 0; i < n; i++) { + if ((r = sshbuf_get_cstring(buf, &qla[i].addr, NULL)) != 0 || + (r = deserialise_s32(buf, &qla[i].port)) != 0 || + (r = deserialise_nullable_string(buf, + &qla[i].rdomain)) != 0) { + error_fr(r, "deserialise member"); + free_queued_listen_addrs(qla, i + 1); + return r; + } + } + options->num_queued_listens = n; + options->queued_listen_addrs = qla; + return 0; +} + +static int +deserialise_logfacility(ServerOptions *options, struct sshbuf *buf) +{ + int r, tmp; + + if ((r = deserialise_s32(buf, &tmp)) != 0) { + error_fr(r, "deserialise"); + return r; + } + if (tmp != SYSLOG_FACILITY_NOT_SET && + log_facility_name((SyslogFacility)tmp) == NULL) { + error_f("bad syslog facility"); + return SSH_ERR_INVALID_FORMAT; + } + options->log_facility = (SyslogFacility)tmp; + + return 0; +} + +static int +deserialise_loglevel(ServerOptions *options, struct sshbuf *buf) +{ + int r, tmp; + + if ((r = deserialise_s32(buf, &tmp)) != 0) { + error_fr(r, "deserialise"); + return r; + } + if (tmp != SYSLOG_LEVEL_NOT_SET && + log_level_name((LogLevel)tmp) == NULL) { + error_f("bad log level"); + return SSH_ERR_INVALID_FORMAT; + } + options->log_level = (LogLevel)tmp; + + return 0; +} + +static int +deserialise_port(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i, n; + + if ((r = deserialise_count(buf, &n, "ports")) != 0) + return r; + if (n > MAX_PORTS) { + error_f("bad number of ports"); + return SSH_ERR_INVALID_FORMAT; + } + options->num_ports = n; + memset(options->ports, 0, sizeof(options->ports)); + for (i = 0; i < options->num_ports; i++) { + if ((r = deserialise_s32(buf, options->ports + i)) != 0) { + error_fr(r, "deserialise port"); + return r; + } + } + return 0; +} + +static int +deserialise_gatewayports(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->fwd_opts.gateway_ports)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +static int +deserialise_streamlocalbindmask(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_mode(buf, + &options->fwd_opts.streamlocal_bind_mask)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +static int +deserialise_streamlocalbindunlink(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_char tmp; + + if ((r = sshbuf_get_u8(buf, &tmp)) != 0) { + error_fr(r, "deserialise"); + return r; + } + if (tmp > 1) { + error_f("bad boolean"); + return SSH_ERR_INVALID_FORMAT; + } + options->fwd_opts.streamlocal_bind_unlink = tmp; + return 0; +} + +static int +deserialise_maxstartups(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->max_startups_begin)) != 0 || + (r = deserialise_s32(buf, &options->max_startups_rate)) != 0 || + (r = deserialise_s32(buf, &options->max_startups)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_permituserenv(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->permit_user_env)) != 0 || + (r = deserialise_nullable_string(buf, + &options->permit_user_env_allowlist)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +static int +deserialise_persourcenetblocksize(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, + &options->per_source_masklen_ipv4)) != 0 || + (r = deserialise_s32(buf, + &options->per_source_masklen_ipv6)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_persourcepenalties(ServerOptions *options, struct sshbuf *buf) +{ + struct per_source_penalty *psp = &options->per_source_penalty; + int r; + + if ((r = deserialise_s32(buf, &psp->enabled)) != 0 || + (r = deserialise_s32(buf, &psp->max_sources4)) != 0 || + (r = deserialise_s32(buf, &psp->max_sources6)) != 0 || + (r = deserialise_s32(buf, &psp->overflow_mode)) != 0 || + (r = deserialise_s32(buf, &psp->overflow_mode6)) != 0 || + (r = deserialise_double(buf, &psp->penalty_crash)) != 0 || + (r = deserialise_double(buf, &psp->penalty_grace)) != 0 || + (r = deserialise_double(buf, &psp->penalty_authfail)) != 0 || + (r = deserialise_double(buf, &psp->penalty_invaliduser)) != 0 || + (r = deserialise_double(buf, &psp->penalty_noauth)) != 0 || + (r = deserialise_double(buf, + &psp->penalty_refuseconnection)) != 0 || + (r = deserialise_double(buf, &psp->penalty_max)) != 0 || + (r = deserialise_double(buf, &psp->penalty_min)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_rekeylimit(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s64(buf, &options->rekey_limit)) != 0 || + (r = deserialise_s32(buf, &options->rekey_interval)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_subsystem(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i, n; + char **names = NULL, **commands = NULL, **args = NULL; + + if ((r = deserialise_count(buf, &n, "subsystems")) != 0) + return r; + if (n > 0) { + names = xcalloc(n, sizeof(*names)); + commands = xcalloc(n, sizeof(*names)); + args = xcalloc(n, sizeof(*args)); + } + for (i = 0; i < n; i++) { + if ((r = sshbuf_get_cstring(buf, names + i, NULL)) != 0 || + (r = sshbuf_get_cstring(buf, commands + i, NULL)) != 0 || + (r = sshbuf_get_cstring(buf, args + i, NULL)) != 0) { + error_fr(r, "deserialise member"); + free_string_array(names, i + 1); + free_string_array(commands, i + 1); + free_string_array(args, i + 1); + return r; + } + } + options->num_subsystems = n; + options->subsystem_name = names; + options->subsystem_command = commands; + options->subsystem_args = args; + return 0; +} + +static int +deserialise_timingsecret(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = sshbuf_get_u64(buf, &options->timing_secret)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +int +deserialise_server_options(struct sshbuf *buf, ServerOptions *options) +{ + int r = SSH_ERR_INTERNAL_ERROR; + uint32_t version; + ServerOptions new_options; + + initialize_server_options(&new_options); + if ((r = sshbuf_get_u32(buf, &version)) != 0) { + error_fr(r, "deserialise version"); + goto out; + } + if (version != SSHD_CONFIG_BLOB_VERSION) { + error_f("unsupported config blob version %u", version); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + if ((r = deserialise_s32(buf, &new_options.var)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + if ((r = deserialise_s32(buf, &new_options.var)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRING(var, conf, flags, cp) \ + if ((r = deserialise_nullable_string(buf, &new_options.var)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + if ((r = deserialise_nullable_string_array(buf, &new_options.var, \ + &new_options.nvar)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + if ((r = deserialise_##funcsuffix(&new_options, buf)) != 0) \ + goto out; +#define SSHCONF_NONCONF(funcsuffix) \ + if ((r = deserialise_##funcsuffix(&new_options, buf)) != 0) \ + goto out; +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) new_options.var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(new_options.var); \ + new_options.var = NULL; \ + } while (0); +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + SSHD_CONFIG_ENTRIES + + if (sshbuf_len(buf) != 0) { + error_f("trailing data in config blob"); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS + + /* success */ + r = 0; + free_server_options(options); + *options = new_options; + memset(&new_options, 0, sizeof(new_options)); + out: + free_server_options(&new_options); + return r; +} + +static void +free_hostkeyfile(ServerOptions *options) +{ + u_int i; + + for (i = 0; i < options->num_host_key_files; i++) + free(options->host_key_files[i]); + free(options->host_key_files); + free(options->host_key_file_userprovided); +} + +static void +free_listenaddress(ServerOptions *options) +{ + u_int i; + + free_queued_listen_addrs(options->queued_listen_addrs, + options->num_queued_listens); + + for (i = 0; i < options->num_listen_addrs; i++) { + free(options->listen_addrs[i].rdomain); + if (options->listen_addrs[i].addrs != NULL) + freeaddrinfo(options->listen_addrs[i].addrs); + } + free(options->listen_addrs); +} + +static void +free_permituserenv(ServerOptions *options) +{ + free(options->permit_user_env_allowlist); +} + +static void +free_subsystem(ServerOptions *options) +{ + u_int i; + + for (i = 0; i < options->num_subsystems; i++) { + free(options->subsystem_name[i]); + free(options->subsystem_command[i]); + free(options->subsystem_args[i]); + } + free(options->subsystem_name); + free(options->subsystem_command); + free(options->subsystem_args); +} + +void +free_server_options(ServerOptions *options) +{ +#define SSHCONF_INT(var, conf, flags, ms, def, cp) /* empty */ +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) /* empty */ +#define SSHCONF_STRING(var, conf, flags, cp) free(options->var); +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + free_string_array(options->var, options->nvar); +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + free_##funcsuffix(options); +#define SSHCONF_NONCONF(funcsuffix) \ + free_##funcsuffix(options); +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) options->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(options->var); \ + options->var = NULL; \ + } while (0); +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + +#define free_ipqos(options) +#define free_logfacility(options) +#define free_loglevel(options) +#define free_port(options) +#define free_gatewayports(options) +#define free_streamlocalbindmask(options) +#define free_streamlocalbindunlink(options) +#define free_maxstartups(options) +#define free_persourcenetblocksize(options) +#define free_persourcepenalties(options) +#define free_rekeylimit(options) +#define free_timingsecret(options) + + SSHD_CONFIG_ENTRIES + +#undef free_ipqos +#undef free_logfacility +#undef free_loglevel +#undef free_port +#undef free_gatewayports +#undef free_streamlocalbindmask +#undef free_streamlocalbindunlink +#undef free_maxstartups +#undef free_persourcenetblocksize +#undef free_persourcepenalties +#undef free_rekeylimit +#undef free_timingsecret + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS + + initialize_server_options(options); +} + +static void +copy_server_option_int(int *dst, int src) +{ + if (src != -1) + *dst = src; +} + +static void +copy_server_option_int64(int64_t *dst, int64_t src) +{ + if (src != -1) + *dst = src; +} + +static void +copy_server_option_string(char **dst, const char *src) +{ + if (src != NULL && *dst != src) { + free(*dst); + *dst = xstrdup(src); + } +} + +static void +copy_server_option_strarray_values(char ***dst, u_int ndst, + char * const *src, u_int nsrc) +{ + u_int i; + + if (nsrc == 0) + return; + for (i = 0; i < ndst; i++) + free((*dst)[i]); + free(*dst); + *dst = xcalloc(nsrc, sizeof(**dst)); + for (i = 0; i < nsrc; i++) + (*dst)[i] = src[i] == NULL ? NULL : xstrdup(src[i]); +} + +static void +copy_server_option_strarray(char ***dst, u_int *ndst, + char * const *src, u_int nsrc) +{ + if (nsrc == 0) + return; + copy_server_option_strarray_values(dst, *ndst, src, nsrc); + *ndst = nsrc; +} + +static void +copy_ipqos(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int(&dst->ip_qos_interactive, + src->ip_qos_interactive); + copy_server_option_int(&dst->ip_qos_bulk, src->ip_qos_bulk); +} + +static void +copy_gatewayports(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int(&dst->fwd_opts.gateway_ports, + src->fwd_opts.gateway_ports); +} + +static void +copy_streamlocalbindunlink(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int(&dst->fwd_opts.streamlocal_bind_unlink, + src->fwd_opts.streamlocal_bind_unlink); +} + +static void +copy_loglevel(ServerOptions *dst, const ServerOptions *src) +{ + if (src->log_level != -1) + dst->log_level = src->log_level; +} + +static void +copy_rekeylimit(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int64(&dst->rekey_limit, src->rekey_limit); + copy_server_option_int(&dst->rekey_interval, src->rekey_interval); +} + +static void +copy_subsystem(ServerOptions *dst, const ServerOptions *src) +{ + u_int old_num_subsystems = dst->num_subsystems; + + if (src->num_subsystems == 0) + return; + copy_server_option_strarray_values(&dst->subsystem_name, + old_num_subsystems, src->subsystem_name, src->num_subsystems); + copy_server_option_strarray_values(&dst->subsystem_command, + old_num_subsystems, src->subsystem_command, src->num_subsystems); + copy_server_option_strarray_values(&dst->subsystem_args, + old_num_subsystems, src->subsystem_args, src->num_subsystems); + dst->num_subsystems = src->num_subsystems; +} + /* * Copy any supported values that are set. * - * If the preauth flag is set, we do not bother copying the string or - * array values that are not used pre-authentication, because any that we - * do use must be explicitly sent in mm_getpwnamallow(). + * If the preauth flag is set, skip the post-authentication-only manual + * string cleanup and subsystem merge below. */ void copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) { -#define M_CP_INTOPT(n) do {\ - if (src->n != -1) \ - dst->n = src->n; \ -} while (0) + if (dst == src) + return; - M_CP_INTOPT(password_authentication); - M_CP_INTOPT(gss_authentication); - M_CP_INTOPT(pubkey_authentication); - M_CP_INTOPT(pubkey_auth_options); - M_CP_INTOPT(kerberos_authentication); - M_CP_INTOPT(hostbased_authentication); - M_CP_INTOPT(hostbased_uses_name_from_packet_only); - M_CP_INTOPT(kbd_interactive_authentication); - M_CP_INTOPT(permit_root_login); - M_CP_INTOPT(permit_empty_passwd); - M_CP_INTOPT(ignore_rhosts); +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + cp(copy_server_option_int(&dst->var, src->var);) +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + cp(copy_server_option_int(&dst->var, src->var);) +#define SSHCONF_STRING(var, conf, flags, cp) \ + cp(copy_server_option_string(&dst->var, src->var);) +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + cp(copy_server_option_strarray(&dst->var, &dst->nvar, \ + src->var, src->nvar);) +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + cp(copy_##funcsuffix(dst, src);) +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) dst->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(dst->var); \ + dst->var = NULL; \ + } while (0); +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ - M_CP_INTOPT(allow_tcp_forwarding); - M_CP_INTOPT(allow_streamlocal_forwarding); - M_CP_INTOPT(allow_agent_forwarding); - M_CP_INTOPT(disable_forwarding); - M_CP_INTOPT(expose_userauth_info); - M_CP_INTOPT(permit_tun); - M_CP_INTOPT(fwd_opts.gateway_ports); - M_CP_INTOPT(fwd_opts.streamlocal_bind_unlink); - M_CP_INTOPT(x11_display_offset); - M_CP_INTOPT(x11_forwarding); - M_CP_INTOPT(x11_use_localhost); - M_CP_INTOPT(permit_tty); - M_CP_INTOPT(permit_user_rc); - M_CP_INTOPT(max_sessions); - M_CP_INTOPT(max_authtries); - M_CP_INTOPT(client_alive_count_max); - M_CP_INTOPT(client_alive_interval); - M_CP_INTOPT(ip_qos_interactive); - M_CP_INTOPT(ip_qos_bulk); - M_CP_INTOPT(rekey_limit); - M_CP_INTOPT(rekey_interval); - M_CP_INTOPT(log_level); - M_CP_INTOPT(required_rsa_size); - M_CP_INTOPT(unused_connection_timeout); - M_CP_INTOPT(refuse_connection); + SSHD_CONFIG_ENTRIES + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS /* * The bind_mask is a mode_t that may be unsigned, so we can't use - * M_CP_INTOPT - it does a signed comparison that causes compiler - * warnings. + * copy_server_option_int - it does a signed comparison that causes + * compiler warnings. */ if (src->fwd_opts.streamlocal_bind_mask != (mode_t)-1) { dst->fwd_opts.streamlocal_bind_mask = src->fwd_opts.streamlocal_bind_mask; } - /* M_CP_STROPT and M_CP_STRARRAYOPT should not appear before here */ -#define M_CP_STROPT(n) do {\ - if (src->n != NULL && dst->n != src->n) { \ - free(dst->n); \ - dst->n = xstrdup(src->n); \ - } \ -} while(0) -#define M_CP_STRARRAYOPT(s, num_s, clobber) do {\ - u_int i; \ - if (src->num_s != 0) { \ - for (i = 0; i < dst->num_s; i++) \ - free(dst->s[i]); \ - free(dst->s); \ - dst->s = xcalloc(src->num_s, sizeof(*dst->s)); \ - for (i = 0; i < src->num_s; i++) \ - dst->s[i] = xstrdup(src->s[i]); \ - if (clobber) \ - dst->num_s = src->num_s; \ - } \ -} while(0) - - /* See comment in servconf.h */ - COPY_MATCH_STRING_OPTS(); - /* Arguments that accept '+...' need to be expanded */ assemble_algorithms(dst); @@ -3030,12 +3959,14 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) return; /* These options may be "none" to clear a global setting */ - M_CP_STROPT(adm_forced_command); + copy_server_option_string(&dst->adm_forced_command, + src->adm_forced_command); if (option_clear_or_none(dst->adm_forced_command)) { free(dst->adm_forced_command); dst->adm_forced_command = NULL; } - M_CP_STROPT(chroot_directory); + copy_server_option_string(&dst->chroot_directory, + src->chroot_directory); if (option_clear_or_none(dst->chroot_directory)) { free(dst->chroot_directory); dst->chroot_directory = NULL; @@ -3045,10 +3976,6 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) servconf_merge_subsystems(dst, src); } -#undef M_CP_INTOPT -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT - #define SERVCONF_MAX_DEPTH 16 static void parse_server_config_depth(ServerOptions *options, const char *filename, @@ -3306,7 +4233,7 @@ dump_config(ServerOptions *o) dump_cfg_fmtint(sPermitUserRC, o->permit_user_rc); dump_cfg_fmtint(sStrictModes, o->strict_modes); dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive); - dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd); + dump_cfg_fmtint(sPermitEmptyPasswords, o->permit_empty_passwd); dump_cfg_fmtint(sCompression, o->compression); dump_cfg_fmtint(sGatewayPorts, o->fwd_opts.gateway_ports); dump_cfg_fmtint(sUseDNS, o->use_dns); @@ -3353,15 +4280,14 @@ dump_config(ServerOptions *o) /* string arguments requiring a lookup */ dump_cfg_string(sLogLevel, log_level_name(o->log_level)); - dump_cfg_string(sLogFacility, log_facility_name(o->log_facility)); + dump_cfg_string(sSyslogFacility, log_facility_name(o->log_facility)); /* string array arguments */ dump_cfg_strarray_oneline(sAuthorizedKeysFile, o->num_authkeys_files, o->authorized_keys_files); dump_cfg_strarray_oneline(sRevokedKeys, o->num_revoked_keys_files, o->revoked_keys_files); - dump_cfg_strarray(sHostKeyFile, o->num_host_key_files, - o->host_key_files); + dump_cfg_strarray(sHostKey, o->num_host_key_files, o->host_key_files); dump_cfg_strarray(sHostCertificate, o->num_host_cert_files, o->host_cert_files); dump_cfg_strarray(sAllowUsers, o->num_allow_users, o->allow_users); diff --git a/servconf.h b/servconf.h index b06db09e1090..9e64e4673743 100644 --- a/servconf.h +++ b/servconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.176 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: servconf.h,v 1.177 2026/05/31 11:30:50 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -18,6 +18,8 @@ #include <sys/queue.h> +struct sshbuf; + #define MAX_PORTS 256 /* Max # ports. */ /* permit_root_login */ @@ -46,6 +48,15 @@ #define PUBKEYAUTH_TOUCH_REQUIRED (1) #define PUBKEYAUTH_VERIFY_REQUIRED (1<<1) +/* Various defaults */ +#define SSHD_DEFAULT_LOGIN_GRACE_TIME 120 +#define SSHD_DEFAULT_X11_DISPLAY_OFFSET 10 +#ifdef WITH_ZLIB +#define SSHD_DEFAULT_COMPRESSION COMP_DELAYED +#else +#define SSHD_DEFAULT_COMPRESSION COMP_NONE +#endif + struct ssh; /* @@ -83,179 +94,314 @@ struct per_source_penalty { double penalty_min; }; -typedef struct { +/* Options for whether config entries are copied after Match processing */ +#define SSHCFG_COPY_NONE(action) +#define SSHCFG_COPY_MATCH(action) action +#define SSHCFG_COPY_MANUAL(action) + +/* + * This macro is used to generate most of ServerOptions and some of the + * parsing and de/serialisation code in servconf.c. Every variable in + * ServerOptions *must* be represented here. + * + * Variables and configuration options that need special handling (e.g. + * those that represent a struct or use a single option to populate multiple + * values) use the SSHCONF_CUSTOM macro and get manual variable entries in + * ServerOptions below. + * + * Variables that exist in ServerOptions but aren't populated by a keyword + * use the SSHCONF_NONCONF macro and also get manual entries in ServerOptions. + * + * Everything else uses one of the SSHCONF_INT, SSHCONF_INTFLAG, + * SSHCONF_STRING, or SSHCONF_STRARRAY macros. These automatically populate + * their corresponding variable definitions in ServerOptions. The integer + * options also include defaults for initialisation. + * + * Deprecated and ignored options use SSHCONF_DEPRECATE and don't populate + * ServerOptions. Unsupported options use SSHCONF_UNSUPPORTED_INT or + * SSHCONF_UNSUPPORTED_STRING to populate placeholders in ServerOptions that + * are not otherwise used. Deprecated aliases that still work use + * SSHCONF_ALIAS. + * + * Why go to all this trouble? It ensures a level of consistency between + * the configuration structure and the parsing code and helps us write + * serialisation/deserialisation functions that we can be pretty sure will + * capture every value in the configuration file. + * + * Entry formats: + * SSHCONF_INT(field, keyword, scope, multistate, default, copy) + * SSHCONF_INTFLAG(field, keyword, scope, default, copy) + * SSHCONF_STRING(field, keyword, scope, copy) + * SSHCONF_STRARRAY(field, nfield, keyword, scope, copy) + * SSHCONF_CUSTOM(keyword, suffix, scope, copy) + * SSHCONF_NONCONF(suffix) + * SSHCONF_DEPRECATE(keyword, scope, token) + * SSHCONF_UNSUPPORTED_INT(field, keyword, scope) + * SSHCONF_UNSUPPORTED_STRING(field, keyword, scope) + * SSHCONF_ALIAS(old_keyword, keyword, scope) + */ +#define SSHD_CONFIG_ENTRIES_CUSTOM \ +SSHCONF_CUSTOM(Port, port, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(ListenAddress, listenaddress, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(HostKey, hostkeyfile, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(IPQoS, ipqos, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(GatewayPorts, gatewayports, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(StreamLocalBindMask, streamlocalbindmask, SSHCFG_ALL, SSHCFG_COPY_MANUAL) \ +SSHCONF_CUSTOM(StreamLocalBindUnlink, streamlocalbindunlink, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(SyslogFacility, logfacility, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(LogLevel, loglevel, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(PermitUserEnvironment, permituserenv, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(Subsystem, subsystem, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(MaxStartups, maxstartups, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(PerSourceNetBlockSize, persourcenetblocksize, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(PerSourcePenalties, persourcepenalties, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(RekeyLimit, rekeylimit, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_NONCONF(timingsecret) + +#define SSHD_CONFIG_ENTRIES_MAIN \ +SSHCONF_INT(address_family, AddressFamily, SSHCFG_GLOBAL, multistate_addressfamily, AF_UNSPEC, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(routing_domain, RDomain, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(host_cert_files, num_host_cert_files, HostCertificate, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(host_key_agent, HostKeyAgent, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(pid_file, PidFile, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(moduli_file, ModuliFile, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INT(login_grace_time, LoginGraceTime, SSHCFG_GLOBAL, NULL, SSHD_DEFAULT_LOGIN_GRACE_TIME, SSHCFG_COPY_NONE) \ +SSHCONF_INT(permit_root_login, PermitRootLogin, SSHCFG_ALL, multistate_permitrootlogin, PERMIT_NO_PASSWD, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(ignore_rhosts, IgnoreRhosts, SSHCFG_ALL, multistate_ignore_rhosts, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(ignore_user_known_hosts, IgnoreUserKnownHosts, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(print_motd, PrintMotd, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(x11_forwarding, X11Forwarding, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(x11_display_offset, X11DisplayOffset, SSHCFG_ALL, NULL, SSHD_DEFAULT_X11_DISPLAY_OFFSET, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(x11_use_localhost, X11UseLocalhost, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(xauth_location, XAuthLocation, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(permit_tty, PermitTTY, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(permit_user_rc, PermitUserRC, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(strict_modes, StrictModes, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(tcp_keep_alive, TCPKeepAlive, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(ciphers, Ciphers, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(macs, Macs, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(kex_algorithms, KexAlgorithms, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRARRAY(log_verbose, num_log_verbose, LogVerbose, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(hostbased_authentication, HostbasedAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(hostbased_uses_name_from_packet_only, HostbasedUsesNameFromPacketOnly, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(hostbased_accepted_algos, HostbasedAcceptedAlgorithms, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(hostkeyalgorithms, HostKeyAlgorithms, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(ca_sign_algorithms, CASignatureAlgorithms, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(pubkey_auth_options, PubkeyAuthOptions, SSHCFG_ALL, NULL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(pubkey_authentication, PubkeyAuthentication, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(pubkey_accepted_algos, PubkeyAcceptedAlgorithms, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(password_authentication, PasswordAuthentication, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(kbd_interactive_authentication, KbdInteractiveAuthentication, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(permit_empty_passwd, PermitEmptyPasswords, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(compression, Compression, SSHCFG_GLOBAL, multistate_compression, SSHD_DEFAULT_COMPRESSION, SSHCFG_COPY_NONE) \ +SSHCONF_INT(allow_tcp_forwarding, AllowTcpForwarding, SSHCFG_ALL, multistate_tcpfwd, FORWARD_ALLOW, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(allow_streamlocal_forwarding, AllowStreamLocalForwarding, SSHCFG_ALL, multistate_tcpfwd, FORWARD_ALLOW, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(allow_agent_forwarding, AllowAgentForwarding, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(disable_forwarding, DisableForwarding, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(allow_users, num_allow_users, AllowUsers, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(deny_users, num_deny_users, DenyUsers, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(allow_groups, num_allow_groups, AllowGroups, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(deny_groups, num_deny_groups, DenyGroups, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(accept_env, num_accept_env, AcceptEnv, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(setenv, num_setenv, SetEnv, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(per_source_max_startups, PerSourceMaxStartups, SSHCFG_GLOBAL, NULL, INT_MAX, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(per_source_penalty_exempt, PerSourcePenaltyExemptList, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INT(max_authtries, MaxAuthTries, SSHCFG_ALL, NULL, DEFAULT_AUTH_FAIL_MAX, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(max_sessions, MaxSessions, SSHCFG_ALL, NULL, DEFAULT_SESSIONS_MAX, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(banner, Banner, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(use_dns, UseDNS, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ +SSHCONF_INT(client_alive_interval, ClientAliveInterval, SSHCFG_ALL, NULL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(client_alive_count_max, ClientAliveCountMax, SSHCFG_ALL, NULL, 3, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(authorized_keys_files, num_authkeys_files, AuthorizedKeysFile, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(adm_forced_command, ForceCommand, SSHCFG_ALL, SSHCFG_COPY_MANUAL) \ +SSHCONF_INTFLAG(permit_tun, PermitTunnel, SSHCFG_ALL, SSH_TUNMODE_NO, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(permitted_opens, num_permitted_opens, PermitOpen, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(permitted_listens, num_permitted_listens, PermitListen, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(chroot_directory, ChrootDirectory, SSHCFG_ALL, SSHCFG_COPY_MANUAL) \ +SSHCONF_STRARRAY(revoked_keys_files, num_revoked_keys_files, RevokedKeys, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(trusted_user_ca_keys, TrustedUserCAKeys, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_keys_command, AuthorizedKeysCommand, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_keys_command_user, AuthorizedKeysCommandUser, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_principals_file, AuthorizedPrincipalsFile, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_principals_command, AuthorizedPrincipalsCommand, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_principals_command_user, AuthorizedPrincipalsCommandUser, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(version_addendum, VersionAddendum, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRARRAY(auth_methods, num_auth_methods, AuthenticationMethods, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(fingerprint_hash, FingerprintHash, SSHCFG_GLOBAL, NULL, SSH_FP_HASH_DEFAULT, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(expose_userauth_info, ExposeAuthInfo, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(sk_provider, SecurityKeyProvider, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INT(required_rsa_size, RequiredRSASize, SSHCFG_ALL, NULL, SSH_RSA_MINIMUM_MODULUS_SIZE, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(channel_timeouts, num_channel_timeouts, ChannelTimeout, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(unused_connection_timeout, UnusedConnectionTimeout, SSHCFG_ALL, NULL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(sshd_session_path, SshdSessionPath, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(sshd_auth_path, SshdAuthPath, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(refuse_connection, RefuseConnection, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) + +#define SSHD_CONFIG_ENTRIES_LEGACY \ +SSHCONF_DEPRECATE(ServerKeyBits, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(KeyRegenerationInterval, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(RHostsAuthentication, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(RhostsRSAAuthentication, SSHCFG_ALL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(RSAAuthentication, SSHCFG_ALL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(CheckMail, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(UseLogin, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(VerifyReverseMapping, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(ReverseMappingCheck, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(AuthorizedKeysFile2, SSHCFG_ALL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(UsePrivilegeSeparation, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(KerberosTgtPassing, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(AFSTokenPassing, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(Protocol, SSHCFG_GLOBAL, SSHCONF_IGNORE) + +#define SSHD_CONFIG_ENTRIES_ALIASES \ +SSHCONF_ALIAS(HostDSAKey, HostKey, SSHCFG_GLOBAL) \ +SSHCONF_ALIAS(HostBasedAcceptedKeyTypes, HostbasedAcceptedAlgorithms, SSHCFG_ALL) \ +SSHCONF_ALIAS(PubkeyAcceptedKeyTypes, PubkeyAcceptedAlgorithms, SSHCFG_ALL) \ +SSHCONF_ALIAS(DSAAuthentication, PubkeyAuthentication, SSHCFG_GLOBAL) \ +SSHCONF_ALIAS(ChallengeResponseAuthentication, KbdInteractiveAuthentication, SSHCFG_ALL) \ +SSHCONF_ALIAS(SKeyAuthentication, KbdInteractiveAuthentication, SSHCFG_ALL) \ +SSHCONF_ALIAS(KeepAlive, TCPKeepAlive, SSHCFG_GLOBAL) + +#define SSHD_CONFIG_ENTRIES_BASE \ + SSHD_CONFIG_ENTRIES_CUSTOM \ + SSHD_CONFIG_ENTRIES_MAIN \ + SSHD_CONFIG_ENTRIES_LEGACY \ + SSHD_CONFIG_ENTRIES_ALIASES \ + SSHD_CONFIG_ENTRIES_PAM \ + SSHD_CONFIG_ENTRIES_LASTLOG + +#ifdef USE_PAM +#define SSHD_CONFIG_ENTRIES_PAM \ +SSHCONF_INTFLAG(use_pam, UsePAM, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) +#else +#define SSHD_CONFIG_ENTRIES_PAM \ +SSHCONF_UNSUPPORTED_INT(use_pam, UsePAM, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL) +#endif + +#ifdef DISABLE_LASTLOG +#define SSHD_CONFIG_ENTRIES_LASTLOG \ +SSHCONF_UNSUPPORTED_INT(print_lastlog, PrintLastLog, SSHCFG_GLOBAL) +#else +#define SSHD_CONFIG_ENTRIES_LASTLOG \ +SSHCONF_INTFLAG(print_lastlog, PrintLastLog, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) +#endif + +/* Compile-time enabled options */ +#ifdef KRB5 + +#ifdef USE_AFS +#define SSHD_CONFIG_KRB5_AFS \ +SSHCONF_INTFLAG(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) +#else /* USE_AFS */ +#define SSHD_CONFIG_KRB5_AFS \ +SSHCONF_UNSUPPORTED_INT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL) +#endif /* USE_AFS */ + +#define SSHD_CONFIG_ENTRIES_KRB5 \ +SSHCONF_INTFLAG(kerberos_authentication, KerberosAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(kerberos_or_local_passwd, KerberosOrLocalPasswd, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHD_CONFIG_KRB5_AFS +#else /* KRB5 */ +#define SSHD_CONFIG_ENTRIES_KRB5 \ +SSHCONF_UNSUPPORTED_INT(kerberos_authentication, KerberosAuthentication, SSHCFG_ALL) \ +SSHCONF_UNSUPPORTED_INT(kerberos_or_local_passwd, KerberosOrLocalPasswd, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL) +#endif /* KRB5 */ + +#ifdef GSSAPI +#define SSHD_CONFIG_ENTRIES_GSS \ +SSHCONF_INTFLAG(gss_authentication, GssAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) +#else /* GSSAPI */ +#define SSHD_CONFIG_ENTRIES_GSS \ +SSHCONF_UNSUPPORTED_INT(gss_authentication, GssAuthentication, SSHCFG_ALL) \ +SSHCONF_UNSUPPORTED_INT(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL) +#endif /* GSSAPI */ + +#define SSHD_CONFIG_ENTRIES \ + SSHD_CONFIG_ENTRIES_BASE \ + SSHD_CONFIG_ENTRIES_KRB5 \ + SSHD_CONFIG_ENTRIES_GSS \ + +/* Macros to declare ServerOptions member variables */ +#define SSHCONF_INT(var, conf, flags, ms, def, cp) int var; +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) int var; +#define SSHCONF_STRING(var, conf, flags, cp) char *var; +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + char **var; \ + u_int nvar; +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) /* empty */ +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) int var; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) char *var; +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + +typedef struct ServerOptions { + SSHD_CONFIG_ENTRIES + /* Ports */ u_int num_ports; u_int ports_from_cmdline; int ports[MAX_PORTS]; /* Port number to listen on. */ + /* ListenAddress */ struct queued_listenaddr *queued_listen_addrs; u_int num_queued_listens; struct listenaddr *listen_addrs; u_int num_listen_addrs; - int address_family; /* Address family used by the server. */ - - char *routing_domain; /* Bind session to routing domain */ - + /* HostKey */ char **host_key_files; /* Files containing host keys. */ int *host_key_file_userprovided; /* Key was specified by user. */ u_int num_host_key_files; /* Number of files for host keys. */ - char **host_cert_files; /* Files containing host certs. */ - u_int num_host_cert_files; /* Number of files for host certs. */ - - char *host_key_agent; /* ssh-agent socket for host keys. */ - char *pid_file; /* Where to put our pid */ - char *moduli_file; /* moduli file for DH-GEX */ - int login_grace_time; /* Disconnect if no auth in this time - * (sec). */ - int permit_root_login; /* PERMIT_*, see above */ - int ignore_rhosts; /* Ignore .rhosts and .shosts. */ - int ignore_user_known_hosts; /* Ignore ~/.ssh/known_hosts - * for RhostsRsaAuth */ - int print_motd; /* If true, print /etc/motd. */ - int print_lastlog; /* If true, print lastlog */ - int x11_forwarding; /* If true, permit inet (spoofing) X11 fwd. */ - int x11_display_offset; /* What DISPLAY number to start - * searching at */ - int x11_use_localhost; /* If true, use localhost for fake X11 server. */ - char *xauth_location; /* Location of xauth program */ - int permit_tty; /* If false, deny pty allocation */ - int permit_user_rc; /* If false, deny ~/.ssh/rc execution */ - int strict_modes; /* If true, require string home dir modes. */ - int tcp_keep_alive; /* If true, set SO_KEEPALIVE. */ + /* IPQoS */ int ip_qos_interactive; /* IP ToS/DSCP/class for interactive */ int ip_qos_bulk; /* IP ToS/DSCP/class for bulk traffic */ - char *ciphers; /* Supported SSH2 ciphers. */ - char *macs; /* Supported SSH2 macs. */ - char *kex_algorithms; /* SSH2 kex methods in order of preference. */ + /* GatewayPorts, StreamLocalBindMask, StreamLocalBindUnlink */ struct ForwardOptions fwd_opts; /* forwarding options */ + /* LogFacility */ SyslogFacility log_facility; /* Facility for system logging. */ + /* LogLevel */ LogLevel log_level; /* Level for system logging. */ - u_int num_log_verbose; /* Verbose log overrides */ - char **log_verbose; - int hostbased_authentication; /* If true, permit ssh2 hostbased auth */ - int hostbased_uses_name_from_packet_only; /* experimental */ - char *hostbased_accepted_algos; /* Algos allowed for hostbased */ - char *hostkeyalgorithms; /* SSH2 server key types */ - char *ca_sign_algorithms; /* Allowed CA signature algorithms */ - int pubkey_authentication; /* If true, permit ssh2 pubkey authentication. */ - char *pubkey_accepted_algos; /* Signature algos allowed for pubkey */ - int pubkey_auth_options; /* -1 or mask of PUBKEYAUTH_* flags */ - int kerberos_authentication; /* If true, permit Kerberos - * authentication. */ - int kerberos_or_local_passwd; /* If true, permit kerberos - * and any other password - * authentication mechanism, - * such as SecurID or - * /etc/passwd */ - int kerberos_ticket_cleanup; /* If true, destroy ticket - * file on logout. */ - int kerberos_get_afs_token; /* If true, try to get AFS token if - * authenticated with Kerberos. */ - int gss_authentication; /* If true, permit GSSAPI authentication */ - int gss_cleanup_creds; /* If true, destroy cred cache on logout */ - int gss_deleg_creds; /* If true, accept delegated GSS credentials */ - int gss_strict_acceptor; /* If true, restrict the GSSAPI acceptor name */ - int password_authentication; /* If true, permit password - * authentication. */ - int kbd_interactive_authentication; /* If true, permit */ - int permit_empty_passwd; /* If false, do not permit empty - * passwords. */ + /* PermitUserEnvironment */ int permit_user_env; /* If true, read ~/.ssh/environment */ char *permit_user_env_allowlist; /* pattern-list of allowed env names */ - int compression; /* If true, compression is allowed */ - int allow_tcp_forwarding; /* One of FORWARD_* */ - int allow_streamlocal_forwarding; /* One of FORWARD_* */ - int allow_agent_forwarding; - int disable_forwarding; - u_int num_allow_users; - char **allow_users; - u_int num_deny_users; - char **deny_users; - u_int num_allow_groups; - char **allow_groups; - u_int num_deny_groups; - char **deny_groups; - + /* Subsystem */ u_int num_subsystems; char **subsystem_name; char **subsystem_command; char **subsystem_args; - - u_int num_accept_env; - char **accept_env; - u_int num_setenv; - char **setenv; - + /* MaxStartups */ int max_startups_begin; int max_startups_rate; int max_startups; - int per_source_max_startups; + /* PerSourceNetBlockSize */ int per_source_masklen_ipv4; int per_source_masklen_ipv6; - char *per_source_penalty_exempt; + /* PerSourcePenalties */ struct per_source_penalty per_source_penalty; - int max_authtries; - int max_sessions; - char *banner; /* SSH-2 banner message */ - int use_dns; - int client_alive_interval; /* - * poke the client this often to - * see if it's still there - */ - int client_alive_count_max; /* - * If the client is unresponsive - * for this many intervals above, - * disconnect the session - */ - - u_int num_authkeys_files; /* Files containing public keys */ - char **authorized_keys_files; - - char *adm_forced_command; - - int use_pam; /* Enable auth via PAM */ - char *pam_service_name; - - int permit_tun; - - char **permitted_opens; /* May also be one of PERMITOPEN_* */ - u_int num_permitted_opens; - char **permitted_listens; /* May also be one of PERMITOPEN_* */ - u_int num_permitted_listens; - - char *chroot_directory; - uint num_revoked_keys_files; - char **revoked_keys_files; - char *trusted_user_ca_keys; - char *authorized_keys_command; - char *authorized_keys_command_user; - char *authorized_principals_file; - char *authorized_principals_command; - char *authorized_principals_command_user; - + /* RekeyLimit */ int64_t rekey_limit; int rekey_interval; - - char *version_addendum; /* Appended to SSH banner */ - - u_int num_auth_methods; - char **auth_methods; - - int fingerprint_hash; - int expose_userauth_info; + /* Passed by config but not keyword for this */ uint64_t timing_secret; - char *sk_provider; - int required_rsa_size; /* minimum size of RSA keys */ - - char **channel_timeouts; /* inactivity timeout by channel type */ - u_int num_channel_timeouts; - - int unused_connection_timeout; - - char *sshd_session_path; - char *sshd_auth_path; - - int refuse_connection; } ServerOptions; +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING +#undef SSHCONF_ALIAS /* Information about the incoming connection as used by Match */ struct connection_info { @@ -280,49 +426,6 @@ struct include_item { TAILQ_HEAD(include_list, include_item); -/* - * These are string config options that must be copied between the - * Match sub-config and the main config, and must be sent from the - * privsep child to the privsep master. We use a macro to ensure all - * the options are copied and the copies are done in the correct order. - * - * NB. an option must appear in servconf.c:copy_set_server_options() or - * COPY_MATCH_STRING_OPTS here but never both. - */ -#define COPY_MATCH_STRING_OPTS() do { \ - M_CP_STROPT(banner); \ - M_CP_STROPT(trusted_user_ca_keys); \ - M_CP_STROPT(authorized_keys_command); \ - M_CP_STROPT(authorized_keys_command_user); \ - M_CP_STROPT(authorized_principals_file); \ - M_CP_STROPT(authorized_principals_command); \ - M_CP_STROPT(authorized_principals_command_user); \ - M_CP_STROPT(hostbased_accepted_algos); \ - M_CP_STROPT(pubkey_accepted_algos); \ - M_CP_STROPT(ca_sign_algorithms); \ - M_CP_STROPT(routing_domain); \ - M_CP_STROPT(permit_user_env_allowlist); \ - M_CP_STROPT(pam_service_name); \ - M_CP_STRARRAYOPT(authorized_keys_files, num_authkeys_files, 1);\ - M_CP_STRARRAYOPT(revoked_keys_files, \ - num_revoked_keys_files, 1); \ - M_CP_STRARRAYOPT(allow_users, num_allow_users, 1); \ - M_CP_STRARRAYOPT(deny_users, num_deny_users, 1); \ - M_CP_STRARRAYOPT(allow_groups, num_allow_groups, 1); \ - M_CP_STRARRAYOPT(deny_groups, num_deny_groups, 1); \ - M_CP_STRARRAYOPT(accept_env, num_accept_env, 1); \ - M_CP_STRARRAYOPT(setenv, num_setenv, 1); \ - M_CP_STRARRAYOPT(auth_methods, num_auth_methods, 1); \ - M_CP_STRARRAYOPT(permitted_opens, num_permitted_opens, 1); \ - M_CP_STRARRAYOPT(permitted_listens, num_permitted_listens, 1); \ - M_CP_STRARRAYOPT(channel_timeouts, num_channel_timeouts, 1); \ - M_CP_STRARRAYOPT(log_verbose, num_log_verbose, 1); \ - /* Note: don't clobber num_subsystems until all copied */ \ - M_CP_STRARRAYOPT(subsystem_name, num_subsystems, 0); \ - M_CP_STRARRAYOPT(subsystem_command, num_subsystems, 0); \ - M_CP_STRARRAYOPT(subsystem_args, num_subsystems, 1); \ - } while (0) - void initialize_server_options(ServerOptions *); void fill_default_server_options(ServerOptions *); int process_server_config_line(ServerOptions *, char *, const char *, int, @@ -342,4 +445,8 @@ void servconf_add_hostkey(const char *, const int, void servconf_add_hostcert(const char *, const int, ServerOptions *, const char *path); +int serialise_server_options(const ServerOptions *, struct sshbuf **); +int deserialise_server_options(struct sshbuf *, ServerOptions *); +void free_server_options(ServerOptions *); + #endif /* SERVCONF_H */ diff --git a/serverloop.c b/serverloop.c index 8e63480ecefa..8a6e3db8024e 100644 --- a/serverloop.c +++ b/serverloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: serverloop.c,v 1.246 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: serverloop.c,v 1.247 2026/05/31 04:47:29 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -523,7 +523,7 @@ server_request_tun(struct ssh *ssh) ssh_packet_send_debug(ssh, "Unsupported tunnel device mode."); return NULL; } - if ((options.permit_tun & mode) == 0) { + if ((options.permit_tun & mode) == 0 || options.disable_forwarding) { ssh_packet_send_debug(ssh, "Server has rejected tunnel device " "forwarding"); return NULL; diff --git a/session.c b/session.c index 93de35d7c5e3..fc9c9d6f88ff 100644 --- a/session.c +++ b/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.348 2026/03/05 05:40:36 djm Exp $ */ +/* $OpenBSD: session.c,v 1.350 2026/06/05 08:53:07 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * All rights reserved @@ -1607,21 +1607,22 @@ do_child(struct ssh *ssh, Session *s, const char *command) exit(1); } else if (s->is_subsystem == SUBSYSTEM_INT_SFTP) { extern int optind, optreset; - int i; - char *p, *args; + int sftp_argc; + char **sftp_argv; setproctitle("%s@%s", s->pw->pw_name, INTERNAL_SFTP_NAME); - args = xstrdup(command ? command : "sftp-server"); - for (i = 0, (p = strtok(args, " ")); p; (p = strtok(NULL, " "))) - if (i < ARGV_MAX - 1) - argv[i++] = p; - argv[i] = NULL; + if (argv_split(command == NULL ? "sftp-server" : command, + &sftp_argc, &sftp_argv, 1) != 0) { + error("internal error: can't split internal-sftp " + "arguments"); + exit(1); + } optind = optreset = 1; - __progname = argv[0]; + __progname = sftp_argv[0]; #ifdef WITH_SELINUX ssh_selinux_change_context("sftpd_t"); #endif - exit(sftp_server_main(i, argv, s->pw)); + exit(sftp_server_main(sftp_argc, sftp_argv, s->pw)); } fflush(NULL); @@ -1907,7 +1908,7 @@ static int session_subsystem_req(struct ssh *ssh, Session *s) { struct stat st; - int r, success = 0; + int r, success = 0, found = 0; char *prog, *cmd, *type; u_int i; @@ -1918,31 +1919,34 @@ session_subsystem_req(struct ssh *ssh, Session *s) s->pw->pw_name); for (i = 0; i < options.num_subsystems; i++) { - if (strcmp(s->subsys, options.subsystem_name[i]) == 0) { - prog = options.subsystem_command[i]; - cmd = options.subsystem_args[i]; - if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) { - s->is_subsystem = SUBSYSTEM_INT_SFTP; - debug("subsystem: %s", prog); - } else { - if (stat(prog, &st) == -1) - debug("subsystem: cannot stat %s: %s", - prog, strerror(errno)); - s->is_subsystem = SUBSYSTEM_EXT; - debug("subsystem: exec() %s", cmd); - } - xasprintf(&type, "session:subsystem:%s", - options.subsystem_name[i]); - channel_set_xtype(ssh, s->chanid, type); - free(type); - success = do_exec(ssh, s, cmd) == 0; - break; + if (strcmp(s->subsys, options.subsystem_name[i]) != 0) + continue; + found = 1; + prog = options.subsystem_command[i]; + cmd = options.subsystem_args[i]; + if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) { + s->is_subsystem = SUBSYSTEM_INT_SFTP; + debug("subsystem: %s", prog); + } else { + if (stat(prog, &st) == -1) + debug("subsystem: cannot stat %s: %s", + prog, strerror(errno)); + s->is_subsystem = SUBSYSTEM_EXT; + debug("subsystem: exec() %s", cmd); } + xasprintf(&type, "session:subsystem:%s", + options.subsystem_name[i]); + channel_set_xtype(ssh, s->chanid, type); + free(type); + success = do_exec(ssh, s, cmd) == 0; + break; } - if (!success) - logit("subsystem request for %.100s by user %s failed, " - "subsystem not found", s->subsys, s->pw->pw_name); + if (!success) { + logit("subsystem request for %.100s by user %s failed, %s", + s->subsys, s->pw->pw_name, + found ? "execution failed" : "subsystem not found"); + } return success; } diff --git a/sftp-client.c b/sftp-client.c index 69ef28cdc16b..1f031128e141 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.185 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.186 2026/06/29 01:53:21 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> * @@ -1585,7 +1585,7 @@ sftp_download(struct sftp_conn *conn, const char *remote_path, { struct sshbuf *msg; u_char *handle; - int local_fd = -1, write_error; + int local_fd = -1, write_error, seen_zerolen = 0; int read_error, write_errno, lmodified = 0, reordered = 0, r; uint64_t offset = 0, size, highwater = 0, maxack = 0; u_int mode, id, buflen, num_req, max_req, status = SSH2_FX_OK; @@ -1733,6 +1733,11 @@ sftp_download(struct sftp_conn *conn, const char *remote_path, if (len > req->len) fatal("Received more data than asked for " "%zu > %zu", len, req->len); + if (len == 0) { + if (seen_zerolen) + fatal_f("server sent zero data length"); + seen_zerolen = 1; + } lmodified = 1; if ((lseek(local_fd, req->offset, SEEK_SET) == -1 || atomicio(vwrite, local_fd, data, len) != len) && @@ -2446,7 +2451,7 @@ sftp_crossload(struct sftp_conn *from, struct sftp_conn *to, Attrib *a, int preserve_flag) { struct sshbuf *msg; - int write_error, read_error, r; + int write_error, read_error, r, seen_zerolen = 0; uint64_t offset = 0, size; u_int id, buflen, num_req, max_req, status = SSH2_FX_OK; u_int num_upload_req; @@ -2576,6 +2581,11 @@ sftp_crossload(struct sftp_conn *from, struct sftp_conn *to, if (len > req->len) fatal("Received more data than asked for " "%zu > %zu", len, req->len); + if (len == 0) { + if (seen_zerolen) + fatal_f("server sent zero data length"); + seen_zerolen = 1; + } /* Write this chunk out to the destination */ sshbuf_reset(msg); diff --git a/sftp-server.0 b/sftp-server.0 index 91e0cc497c1e..054198498b57 100644 --- a/sftp-server.0 +++ b/sftp-server.0 @@ -53,7 +53,11 @@ DESCRIPTION request with a failure. The -Q flag can be used to determine the supported request types. If both denied and allowed lists are specified, then the denied list is applied before the allowed - list. + list. This flag, along with the -p flag, may be used to disable + operations that are irrelevant or undesirable for the server. + For example, a sftp-server that accepts connections from + untrusted clients may wish to disable the M-bM-^@M-^\copy-dataM-bM-^@M-^] or + M-bM-^@M-^\users-groups-by-idM-bM-^@M-^] operations. -p allowed_requests Specifies a comma-separated list of SFTP protocol requests that @@ -95,4 +99,4 @@ HISTORY AUTHORS Markus Friedl <markus@openbsd.org> -OpenBSD 7.8 July 27, 2021 SFTP-SERVER(8) +OpenBSD 7.9 May 21, 2026 SFTP-SERVER(8) diff --git a/sftp-server.8 b/sftp-server.8 index 5311bf9299fa..d9060ab9a7f7 100644 --- a/sftp-server.8 +++ b/sftp-server.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp-server.8,v 1.31 2021/07/27 14:14:25 jmc Exp $ +.\" $OpenBSD: sftp-server.8,v 1.32 2026/05/21 02:50:59 djm Exp $ .\" .\" Copyright (c) 2000 Markus Friedl. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 27 2021 $ +.Dd $Mdocdate: May 21 2026 $ .Dt SFTP-SERVER 8 .Os .Sh NAME @@ -109,6 +109,17 @@ The flag can be used to determine the supported request types. If both denied and allowed lists are specified, then the denied list is applied before the allowed list. +This flag, along with the +.Fl p +flag, may be used to disable operations that are irrelevant or undesirable +for the server. +For example, a +.Nm +that accepts connections from untrusted clients may wish to disable the +.Dq copy-data +or +.Dq users-groups-by-id +operations. .It Fl p Ar allowed_requests Specifies a comma-separated list of SFTP protocol requests that are permitted by the server. diff --git a/sftp-server.c b/sftp-server.c index ebdb31d32c6a..f87fc5825c22 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.153 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.156 2026/07/01 00:52:23 dtucker Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -1136,7 +1136,7 @@ process_readdir(uint32_t id) send_status(id, SSH2_FX_FAILURE); } else { struct stat st; - char pathname[PATH_MAX]; + char *pathname; Stat *stats; int nstats = 10, count = 0, i; @@ -1146,10 +1146,11 @@ process_readdir(uint32_t id) nstats *= 2; stats = xreallocarray(stats, nstats, sizeof(Stat)); } -/* XXX OVERFLOW ? */ - snprintf(pathname, sizeof pathname, "%s%s%s", path, + xasprintf(&pathname, "%s%s%s", path, strcmp(path, "/") ? "/" : "", dp->d_name); - if (lstat(pathname, &st) == -1) + r = lstat(pathname, &st); + free(pathname); + if (r == -1) continue; stat_to_attrib(&st, &(stats[count].attrib)); stats[count].name = xstrdup(dp->d_name); @@ -1606,6 +1607,7 @@ process_extended_copy_data(uint32_t id) uint64_t len, read_off, read_len, write_off; int r, copy_until_eof, status = SSH2_FX_OP_UNSUPPORTED; size_t ret; + struct stat st_read, st_write; if ((r = get_handle(iqueue, &read_handle)) != 0 || (r = sshbuf_get_u64(iqueue, &read_off)) != 0 || @@ -1628,12 +1630,35 @@ process_extended_copy_data(uint32_t id) } else copy_until_eof = 0; + /* Disallow reading & writing to the same handle, path or inode */ read_fd = handle_to_fd(read_handle); write_fd = handle_to_fd(write_handle); - - /* Disallow reading & writing to the same handle or same path or dirs */ - if (read_handle == write_handle || read_fd < 0 || write_fd < 0 || - !strcmp(handle_to_name(read_handle), handle_to_name(write_handle))) { + if (read_fd < 0 || write_fd < 0) { + error_f("bad read or write fd"); + status = errno_to_portable(EBADF); + goto out; + } + if (fstat(read_fd, &st_read) != 0) { + status = errno_to_portable(errno); + error_f("fstat read_fd failed: %s", strerror(errno)); + goto out; + } + if (fstat(write_fd, &st_write) != 0) { + status = errno_to_portable(errno); + error_f("fstat write_fd failed: %s", strerror(errno)); + goto out; + } + if (read_handle == write_handle || + !strcmp(handle_to_name(read_handle), handle_to_name(write_handle)) || + (st_read.st_dev != 0 && st_read.st_ino != 0 && + st_read.st_dev == st_write.st_dev && + st_read.st_ino == st_write.st_ino)) { + error_f("refusing to read/write same file: " + "read \"%s\" dev %lu ino %lu, write \"%s\" dev %lu ino %lu", + handle_to_name(read_handle), + (u_long)st_read.st_dev, (u_long)st_read.st_ino, + handle_to_name(write_handle), + (u_long)st_write.st_dev, (u_long)st_write.st_ino); status = SSH2_FX_FAILURE; goto out; } @@ -474,4 +474,4 @@ SEE ALSO T. Ylonen and S. Lehtinen, SSH File Transfer Protocol, draft-ietf-secsh- filexfer-00.txt, January 2001, work in progress material. -OpenBSD 7.8 December 6, 2024 SFTP(1) +OpenBSD 7.9 December 6, 2024 SFTP(1) @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.250 2026/02/11 17:01:34 dtucker Exp $ */ +/* $OpenBSD: sftp.c,v 1.257 2026/06/30 02:30:19 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> * @@ -26,6 +26,7 @@ #include <ctype.h> #include <errno.h> +#include <fcntl.h> #include <glob.h> #include <paths.h> #include <libgen.h> @@ -326,7 +327,6 @@ local_do_shell(const char *args) fatal("Couldn't fork: %s", strerror(errno)); if (pid == 0) { - /* XXX: child has pipe fds to ssh subproc open - issue? */ if (args) { debug3("Executing %s -c \"%s\"", shell, args); execl(shell, shell, "-c", args, (char *)NULL); @@ -369,10 +369,9 @@ path_strip(const char *path, const char *strip) { size_t len; - if (strip == NULL) + if (strip == NULL || (len = strlen(strip)) == 0) return (xstrdup(path)); - len = strlen(strip); if (strncmp(path, strip, len) == 0) { if (strip[len - 1] != '/' && path[len] == '/') len++; @@ -900,13 +899,16 @@ do_ls_dir(struct sftp_conn *conn, const char *path, sftp_can_get_users_groups_by_id(conn)) { char *lname; struct stat sb; + const char *user = NULL, *group = NULL; memset(&sb, 0, sizeof(sb)); attrib_to_stat(&d[n]->a, &sb); + if ((lflag & LS_NUMERIC_VIEW) == 0) { + user = ruser_name(sb.st_uid); + group = rgroup_name(sb.st_gid); + } lname = ls_file(fname, &sb, 1, - (lflag & LS_SI_UNITS), - ruser_name(sb.st_uid), - rgroup_name(sb.st_gid)); + (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); free(lname); } else @@ -1039,15 +1041,19 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, i = indices[j]; fname = path_strip(g.gl_pathv[i], strip_path); if (lflag & LS_LONG_VIEW) { + const char *user = NULL, *group = NULL; + if (g.gl_statv[i] == NULL) { error("no stat information for %s", fname); free(fname); continue; } + if ((lflag & LS_NUMERIC_VIEW) == 0) { + user = ruser_name(g.gl_statv[i]->st_uid); + group = rgroup_name(g.gl_statv[i]->st_gid); + } lname = ls_file(fname, g.gl_statv[i], 1, - (lflag & LS_SI_UNITS), - ruser_name(g.gl_statv[i]->st_uid), - rgroup_name(g.gl_statv[i]->st_gid)); + (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); free(lname); } else { @@ -1283,6 +1289,8 @@ makeargv(const char *arg, int *argcp, int sloppy, char *lastquote, /* Unescape everything */ /* XXX support \n and friends? */ i++; + if (arg[i] == '\0') + goto early_nul; argvs[j++] = arg[i]; } } @@ -1293,6 +1301,7 @@ makeargv(const char *arg, int *argcp, int sloppy, char *lastquote, goto string_done; } else if (arg[i] == '\0') { if (state == MA_SQUOTE || state == MA_DQUOTE) { + early_nul: if (sloppy) { state = MA_UNQUOTED; if (terminated != NULL) @@ -2287,13 +2296,8 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2) return (-1); } } else { - /* XXX this is wrong wrt quoting */ - snprintf(cmd, sizeof cmd, "get%s %s%s%s", - global_aflag ? " -a" : "", dir, - file2 == NULL ? "" : " ", - file2 == NULL ? "" : file2); - err = parse_dispatch_command(conn, cmd, - &remote_path, startdir, 1, 0); + err = process_get(conn, dir, file2, remote_path, 0, 0, + global_aflag, 0); free(dir); free(startdir); free(remote_path); @@ -2399,6 +2403,8 @@ connect_to_server(char *path, char **args, int *in, int *out) *in = *out = inout[0]; c_in = c_out = inout[1]; #endif /* USE_PIPES */ + FD_CLOSEONEXEC(*in); + FD_CLOSEONEXEC(*out); if ((sshpid = fork()) == -1) fatal("fork: %s", strerror(errno)); diff --git a/sk-usbhid.c b/sk-usbhid.c index cd248811a51c..ce59c4e9317d 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.48 2025/05/12 05:41:20 tb Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.49 2026/06/01 05:49:20 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -1262,6 +1262,7 @@ read_rks(struct sk_usbhid *sk, const char *pin, struct sk_resident_key ***rksp, size_t *nrksp) { int ret = SSH_SK_ERR_GENERAL, r = -1, internal_uv; + uint32_t alg; fido_credman_metadata_t *metadata = NULL; fido_credman_rp_t *rp = NULL; fido_credman_rk_t *rk = NULL; @@ -1358,6 +1359,20 @@ read_rks(struct sk_usbhid *sk, const char *pin, user_id_len, j, fido_cred_type(cred), fido_cred_flags(cred), fido_cred_prot(cred)); + /* Determine key algorithm */ + switch (fido_cred_type(cred)) { + case COSE_ES256: + alg = SSH_SK_ECDSA; + break; + case COSE_EDDSA: + alg = SSH_SK_ED25519; + break; + default: + skdebug(__func__, "unsupported key type %d", + fido_cred_type(cred)); + continue; + } + /* build response entry */ if ((srk = calloc(1, sizeof(*srk))) == NULL || (srk->key.key_handle = calloc(1, @@ -1369,6 +1384,7 @@ read_rks(struct sk_usbhid *sk, const char *pin, goto out; } + srk->alg = alg; srk->key.key_handle_len = fido_cred_id_len(cred); memcpy(srk->key.key_handle, fido_cred_id_ptr(cred), srk->key.key_handle_len); @@ -1376,19 +1392,6 @@ read_rks(struct sk_usbhid *sk, const char *pin, if (srk->user_id_len != 0) memcpy(srk->user_id, user_id, srk->user_id_len); - switch (fido_cred_type(cred)) { - case COSE_ES256: - srk->alg = SSH_SK_ECDSA; - break; - case COSE_EDDSA: - srk->alg = SSH_SK_ED25519; - break; - default: - skdebug(__func__, "unsupported key type %d", - fido_cred_type(cred)); - goto out; /* XXX free rk and continue */ - } - if (fido_cred_prot(cred) == FIDO_CRED_PROT_UV_REQUIRED && internal_uv == -1) srk->flags |= SSH_SK_USER_VERIFICATION_REQD; diff --git a/ssh-add.0 b/ssh-add.0 index dfdf71fb55cb..ad09faec07d4 100644 --- a/ssh-add.0 +++ b/ssh-add.0 @@ -216,4 +216,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.8 March 5, 2026 SSH-ADD(1) +OpenBSD 7.9 March 5, 2026 SSH-ADD(1) diff --git a/ssh-add.c b/ssh-add.c index 1e9eddf9048e..7ce45103644e 100644 --- a/ssh-add.c +++ b/ssh-add.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-add.c,v 1.186 2026/03/05 05:44:15 djm Exp $ */ +/* $OpenBSD: ssh-add.c,v 1.187 2026/06/29 02:13:05 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -813,7 +813,7 @@ main(int argc, char **argv) { extern char *optarg; extern int optind; - int agent_fd; + int agent_fd = -1; char *pkcs11provider = NULL, *skprovider = NULL; char **dest_constraint_strings = NULL, **hostkey_files = NULL; int r, i, ch, deleting = 0, ret = 0, key_only = 0, cert_only = 0; @@ -835,19 +835,6 @@ main(int argc, char **argv) setvbuf(stdout, NULL, _IOLBF, 0); - /* First, get a connection to the authentication agent. */ - switch (r = ssh_get_authentication_socket(&agent_fd)) { - case 0: - break; - case SSH_ERR_AGENT_NOT_PRESENT: - fprintf(stderr, "Could not open a connection to your " - "authentication agent.\n"); - exit(2); - default: - fprintf(stderr, "Error connecting to agent: %s\n", ssh_err(r)); - exit(2); - } - skprovider = getenv("SSH_SK_PROVIDER"); while ((ch = getopt(argc, argv, "vkKlLNCcdDTxXE:e:h:H:M:m:Qqs:S:t:")) != -1) { @@ -943,7 +930,21 @@ main(int argc, char **argv) if ((xflag != 0) + (lflag != 0) + (Dflag != 0) + (Qflag != 0) > 1) fatal("Invalid combination of actions"); - else if (xflag) { + + /* First, get a connection to the authentication agent. */ + switch (r = ssh_get_authentication_socket(&agent_fd)) { + case 0: + break; + case SSH_ERR_AGENT_NOT_PRESENT: + fprintf(stderr, "Could not open a connection to your " + "authentication agent.\n"); + exit(2); + default: + fprintf(stderr, "Error connecting to agent: %s\n", ssh_err(r)); + exit(2); + } + + if (xflag) { if (lock_agent(agent_fd, xflag == 'x' ? 1 : 0) == -1) ret = 1; goto done; diff --git a/ssh-agent.0 b/ssh-agent.0 index 9abedc210d0f..e53ec00ba8e7 100644 --- a/ssh-agent.0 +++ b/ssh-agent.0 @@ -10,6 +10,7 @@ SYNOPSIS [-P allowed_providers] [-t life] command [arg ...] ssh-agent [-c | -s] -k ssh-agent -u + ssh-agent -V DESCRIPTION ssh-agent is a program to hold private keys used for public key @@ -108,6 +109,8 @@ DESCRIPTION as a subprocess of the agent. The agent exits automatically when the command given on the command line terminates. + -V Display the version number and exit. + There are three main ways to get an agent set up. The first is at the start of an X session, where all other windows or programs are started as children of the ssh-agent program. The agent starts a command under @@ -174,4 +177,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.8 October 4, 2025 SSH-AGENT(1) +OpenBSD 7.9 May 27, 2026 SSH-AGENT(1) diff --git a/ssh-agent.1 b/ssh-agent.1 index 016f7e0ebc76..ff1653386d04 100644 --- a/ssh-agent.1 +++ b/ssh-agent.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-agent.1,v 1.86 2025/10/04 21:41:35 naddy Exp $ +.\" $OpenBSD: ssh-agent.1,v 1.87 2026/05/27 03:04:30 djm Exp $ .\" .\" Author: Tatu Ylonen <ylo@cs.hut.fi> .\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -34,7 +34,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: October 4 2025 $ +.Dd $Mdocdate: May 27 2026 $ .Dt SSH-AGENT 1 .Os .Sh NAME @@ -62,6 +62,8 @@ .Fl k .Nm ssh-agent .Fl u +.Nm ssh-agent +.Fl V .Sh DESCRIPTION .Nm is a program to hold private keys used for public key authentication. @@ -208,6 +210,8 @@ If a command (and optional arguments) is given, this is executed as a subprocess of the agent. The agent exits automatically when the command given on the command line terminates. +.It Fl V +Display the version number and exit. .El .Pp There are three main ways to get an agent set up. diff --git a/ssh-agent.c b/ssh-agent.c index c73abd1d08f8..5fc73d6971cd 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.324 2026/03/10 07:27:14 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.330 2026/07/05 02:46:44 dtucker Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -80,6 +80,7 @@ #include "ssh-pkcs11.h" #include "sk-api.h" #include "myproposal.h" +#include "version.h" #ifndef DEFAULT_ALLOWED_PROVIDERS # define DEFAULT_ALLOWED_PROVIDERS "/usr/lib*/*,/usr/local/lib*/*" @@ -100,6 +101,8 @@ #define AGENT_MAX_DEST_CONSTRAINTS 1024 /* Maximum number of associated certificate constraints to accept on a key */ #define AGENT_MAX_EXT_CERTS 1024 +/* Max length of username constraint */ +#define AGENT_USER_CONSTRAINT_MAX_LEN 256 /* XXX store hostkey_sid in a refcounted tree */ @@ -610,7 +613,7 @@ send_status_generic(SocketEntry *e, u_int code) static void send_status(SocketEntry *e, int success) { - return send_status_generic(e, + send_status_generic(e, success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); } @@ -1077,13 +1080,13 @@ static int parse_dest_constraint_hop(struct sshbuf *b, struct dest_constraint_hop *dch) { u_char key_is_ca; - size_t elen = 0; + size_t elen = 0, userlen = 0; int r; struct sshkey *k = NULL; char *fp; memset(dch, '\0', sizeof(*dch)); - if ((r = sshbuf_get_cstring(b, &dch->user, NULL)) != 0 || + if ((r = sshbuf_get_cstring(b, &dch->user, &userlen)) != 0 || (r = sshbuf_get_cstring(b, &dch->hostname, NULL)) != 0 || (r = sshbuf_get_string_direct(b, NULL, &elen)) != 0) { error_fr(r, "parse"); @@ -1101,6 +1104,10 @@ parse_dest_constraint_hop(struct sshbuf *b, struct dest_constraint_hop *dch) if (*dch->user == '\0') { free(dch->user); dch->user = NULL; + } else if (userlen > AGENT_USER_CONSTRAINT_MAX_LEN) { + error_f("user match pattern too long"); + r = SSH_ERR_INVALID_FORMAT; + goto out; } while (sshbuf_len(b) != 0) { dch->keys = xrecallocarray(dch->keys, dch->nkeys, @@ -1785,7 +1792,7 @@ process_ext_query(SocketEntry *e) static void process_extension(SocketEntry *e) { - int r, success = 0; + int r, replied = 0, success = 0; char *name; debug2_f("entering"); @@ -1796,7 +1803,7 @@ process_extension(SocketEntry *e) } if (strcmp(name, "query") == 0) - success = process_ext_query(e); + replied = success = process_ext_query(e); else if (strcmp(name, "session-bind@openssh.com") == 0) success = process_ext_session_bind(e); else { @@ -1807,8 +1814,10 @@ process_extension(SocketEntry *e) } free(name); /* Agent failures are signalled with a different error code */ - send_status_generic(e, - success ? SSH_AGENT_SUCCESS : SSH_AGENT_EXTENSION_FAILURE); + if (!replied) { + send_status_generic(e, + success ? SSH_AGENT_SUCCESS : SSH_AGENT_EXTENSION_FAILURE); + } } /* @@ -2221,7 +2230,8 @@ usage(void) " ssh-agent [-TU] [-a bind_address] [-E fingerprint_hash] [-O option]\n" " [-P allowed_providers] [-t life] command [arg ...]\n" " ssh-agent [-c | -s] -k\n" - " ssh-agent -u\n"); + " ssh-agent -u\n" + " ssh-agent -V\n"); exit(1); } @@ -2268,7 +2278,7 @@ main(int ac, char **av) __progname = ssh_get_progname(av[0]); seed_rng(); - while ((ch = getopt(ac, av, "cDdksTuUE:a:O:P:t:")) != -1) { + while ((ch = getopt(ac, av, "cDdksTuUVE:a:O:P:t:")) != -1) { switch (ch) { case 'E': fingerprint_hash = ssh_digest_alg_by_name(optarg); @@ -2334,6 +2344,10 @@ main(int ac, char **av) case 'U': U_flag++; break; + case 'V': + fprintf(stderr, "%s, %s\n", + SSH_VERSION, SSH_OPENSSL_VERSION); + exit(0); default: usage(); } @@ -2572,6 +2586,14 @@ skip: sigaddset(&nsigset, SIGTERM); sigaddset(&nsigset, SIGUSR1); + if (socket_name != NULL && unveil(socket_name, "c") == -1) { + fatal("%s: unveil %s %s", __progname, socket_name, + strerror(errno)); + } + if (*socket_dir != '\0' && unveil(socket_dir, "c") == -1) { + fatal("%s: unveil %s %s", __progname, socket_dir, + strerror(errno)); + } if (unveil("/", "r") == -1) fatal("%s: unveil /: %s", __progname, strerror(errno)); if ((ccp = getenv("SSH_SK_HELPER")) == NULL || *ccp == '\0') diff --git a/ssh-keygen.0 b/ssh-keygen.0 index 1c1ca7793669..01ec6cb02432 100644 --- a/ssh-keygen.0 +++ b/ssh-keygen.0 @@ -6,7 +6,8 @@ NAME SYNOPSIS ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile] [-m format] [-N new_passphrase] [-O option] - [-t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa] + [-t ecdsa | + ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa] [-w provider] [-Z cipher] ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase] [-P old_passphrase] [-Z cipher] @@ -57,9 +58,9 @@ DESCRIPTION Normally each user wishing to use SSH with public key authentication runs this once to create the authentication key in ~/.ssh/id_ecdsa, - ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519, ~/.ssh/id_ed25519_sk or - ~/.ssh/id_rsa. Additionally, the system administrator may use this to - generate host keys, as seen in /etc/rc. + ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519, ~/.ssh/id_ed25519_sk, + ~/.ssh/id_mldsa44-ed25519 or ~/.ssh/id_rsa. Additionally, the system + administrator may use this to generate host keys, as seen in /etc/rc. Normally this program generates the key and asks for a file in which to store the private key. The public key is stored in a file with the same @@ -96,13 +97,13 @@ DESCRIPTION The options are as follows: - -A Generate host keys of all default key types (rsa, ecdsa, and - ed25519) if they do not already exist. The host keys are - generated with the default key file path, an empty passphrase, - default bits for the key type, and default comment. If -f has - also been specified, its argument is used as a prefix to the - default path for the resulting host key files. This is used by - /etc/rc to generate new host keys. + -A Generate host keys of all default key types (rsa, ecdsa, + mldsa44-ed25519 and ed25519) if they do not already exist. The + host keys are generated with the default key file path, an empty + passphrase, default bits for the key type, and default comment. + If -f has also been specified, its argument is used as a prefix + to the default path for the resulting host key files. This is + used by /etc/rc to generate new host keys. -a rounds When saving a private key, this option specifies the number of @@ -317,10 +318,10 @@ DESCRIPTION file used to revoke certificates directly by key ID or serial number. See the KEY REVOCATION LISTS section for details. - -t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa + -t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa Specifies the type of key to create. The possible values are - M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ecdsa-skM-bM-^@M-^], M-bM-^@M-^\ed25519 (the default),M-bM-^@M-^] M-bM-^@M-^\ed25519-skM-bM-^@M-^], or - M-bM-^@M-^\rsaM-bM-^@M-^]. + M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ecdsa-skM-bM-^@M-^], M-bM-^@M-^\ed25519 (the default),M-bM-^@M-^] M-bM-^@M-^\ed25519-skM-bM-^@M-^], + M-bM-^@M-^\mldsa44-ed25519M-bM-^@M-^] or M-bM-^@M-^\rsaM-bM-^@M-^]. This flag may also be used to specify the desired signature type when signing certificates using an RSA CA key. The available RSA @@ -869,6 +870,7 @@ FILES ~/.ssh/id_ecdsa_sk ~/.ssh/id_ed25519 ~/.ssh/id_ed25519_sk + ~/.ssh/id_mldsa44-ed25519 ~/.ssh/id_rsa Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA authentication identity of @@ -884,6 +886,7 @@ FILES ~/.ssh/id_ecdsa_sk.pub ~/.ssh/id_ed25519.pub ~/.ssh/id_ed25519_sk.pub + ~/.ssh/id_mldsa44-ed25519.pub ~/.ssh/id_rsa.pub Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA public key for @@ -908,4 +911,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.8 December 22, 2025 SSH-KEYGEN(1) +OpenBSD 7.9 July 1, 2026 SSH-KEYGEN(1) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index c5f3f741017f..33f78fe3937b 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.237 2025/12/22 01:49:03 djm Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.238 2026/07/01 01:14:39 djm Exp $ .\" .\" Author: Tatu Ylonen <ylo@cs.hut.fi> .\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: December 22 2025 $ +.Dd $Mdocdate: July 1 2026 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -51,7 +51,7 @@ .Op Fl m Ar format .Op Fl N Ar new_passphrase .Op Fl O Ar option -.Op Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa +.Op Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa .Op Fl w Ar provider .Op Fl Z Ar cipher .Nm ssh-keygen @@ -208,7 +208,8 @@ key in .Pa ~/.ssh/id_ecdsa , .Pa ~/.ssh/id_ecdsa_sk , .Pa ~/.ssh/id_ed25519 , -.Pa ~/.ssh/id_ed25519_sk +.Pa ~/.ssh/id_ed25519_sk , +.Pa ~/.ssh/id_mldsa44-ed25519 or .Pa ~/.ssh/id_rsa . Additionally, the system administrator may use this to generate host keys, @@ -270,7 +271,7 @@ should be placed to be activated. The options are as follows: .Bl -tag -width Ds .It Fl A -Generate host keys of all default key types (rsa, ecdsa, and +Generate host keys of all default key types (rsa, ecdsa, mldsa44-ed25519 and ed25519) if they do not already exist. The host keys are generated with the default key file path, an empty passphrase, default bits for the key type, and default comment. @@ -576,13 +577,14 @@ by key ID or serial number. See the .Sx KEY REVOCATION LISTS section for details. -.It Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa +.It Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa Specifies the type of key to create. The possible values are .Dq ecdsa , .Dq ecdsa-sk , .Dq ed25519 (the default), .Dq ed25519-sk , +.Dq mldsa44-ed25519 or .Dq rsa . .Pp @@ -1299,6 +1301,7 @@ the built-in USB HID support. .It Pa ~/.ssh/id_ecdsa_sk .It Pa ~/.ssh/id_ed25519 .It Pa ~/.ssh/id_ed25519_sk +.It Pa ~/.ssh/id_mldsa44-ed25519 .It Pa ~/.ssh/id_rsa Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA authentication identity of the user. @@ -1316,6 +1319,7 @@ will read this file when a login attempt is made. .It Pa ~/.ssh/id_ecdsa_sk.pub .It Pa ~/.ssh/id_ed25519.pub .It Pa ~/.ssh/id_ed25519_sk.pub +.It Pa ~/.ssh/id_mldsa44-ed25519.pub .It Pa ~/.ssh/id_rsa.pub Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA public key for authentication. diff --git a/ssh-keygen.c b/ssh-keygen.c index 584d5a899993..a62e5dc4a26c 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.490 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.492 2026/06/30 23:55:32 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -273,6 +273,10 @@ ask_filename(struct passwd *pw, const char *prompt) case KEY_ED25519_SK_CERT: name = _PATH_SSH_CLIENT_ID_ED25519_SK; break; + case KEY_MLDSA44_ED25519: + case KEY_MLDSA44_ED25519_CERT: + name = _PATH_SSH_CLIENT_ID_MLDSA44_ED25519; + break; default: fatal("bad key type"); } @@ -1015,6 +1019,10 @@ do_gen_all_hostkeys(struct passwd *pw) #endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ { "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE }, +#ifdef USE_MLDSA + { "mldsa44-ed25519", "MLDSA44-ED25519", + _PATH_HOST_MLDSA44_ED25519_KEY_FILE }, +#endif { NULL, NULL, NULL } }; @@ -3239,7 +3247,7 @@ usage(void) fprintf(stderr, "usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]\n" " [-m format] [-N new_passphrase] [-O option]\n" - " [-t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]\n" + " [-t ecdsa|ecdsa-sk|ed25519|ed25519-sk|mldsa44-ed25519|rsa]\n" " [-w provider] [-Z cipher]\n" " ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]\n" " [-P old_passphrase] [-Z cipher]\n" diff --git a/ssh-keyscan.0 b/ssh-keyscan.0 index beb5c32d296d..a575fa135c36 100644 --- a/ssh-keyscan.0 +++ b/ssh-keyscan.0 @@ -25,6 +25,12 @@ DESCRIPTION network range (e.g. 192.168.16/28). If a network range is specified, then all addresses in that range will be scanned. + ssh-keyscan cannot verify the authenticity of the host keys it obtains, + and an attacker on the network with the ability to intercept traffic + could substitute their own host keys to enable impersonation of servers. + Because of this, ssh-keyscan output should be verified out of band, or + only used directly for host authentication if the network is trusted. + The options are as follows: -4 Force ssh-keyscan to use IPv4 addresses only. @@ -120,4 +126,4 @@ AUTHORS Davison <wayned@users.sourceforge.net> added support for protocol version 2. -OpenBSD 7.8 October 4, 2025 SSH-KEYSCAN(1) +OpenBSD 7.9 June 26, 2026 SSH-KEYSCAN(1) diff --git a/ssh-keyscan.1 b/ssh-keyscan.1 index e17957367367..7446b862fff2 100644 --- a/ssh-keyscan.1 +++ b/ssh-keyscan.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keyscan.1,v 1.53 2025/10/04 21:41:35 naddy Exp $ +.\" $OpenBSD: ssh-keyscan.1,v 1.54 2026/06/26 06:17:13 djm Exp $ .\" .\" Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>. .\" @@ -6,7 +6,7 @@ .\" permitted provided that due credit is given to the author and the .\" OpenBSD project by leaving this copyright notice intact. .\" -.Dd $Mdocdate: October 4 2025 $ +.Dd $Mdocdate: June 26 2026 $ .Dt SSH-KEYSCAN 1 .Os .Sh NAME @@ -50,6 +50,15 @@ network range (e.g. 192.168.16/28). If a network range is specified, then all addresses in that range will be scanned. .Pp +.Nm +cannot verify the authenticity of the host keys it obtains, and an attacker +on the network with the ability to intercept traffic could substitute their +own host keys to enable impersonation of servers. +Because of this, +.Nm +output should be verified out of band, or only used directly for host +authentication if the network is trusted. +.Pp The options are as follows: .Bl -tag -width Ds .It Fl 4 diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 9bd3e78ebbd3..ddaf8dfb1de5 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keyscan.c,v 1.167 2025/08/29 03:50:38 djm Exp $ */ +/* $OpenBSD: ssh-keyscan.c,v 1.168 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>. * @@ -64,12 +64,13 @@ int ssh_port = SSH_DEFAULT_PORT; #define KT_ED25519 (1<<2) #define KT_ECDSA_SK (1<<4) #define KT_ED25519_SK (1<<5) +#define KT_MLDSA44_ED25519 (1<<6) #define KT_MIN KT_RSA -#define KT_MAX KT_ED25519_SK +#define KT_MAX KT_MLDSA44_ED25519 int get_cert = 0; -int get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK; +int get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK|KT_MLDSA44_ED25519; int hash_hosts = 0; /* Hash hostname on output */ @@ -257,6 +258,11 @@ keygrab_ssh2(con *c) "ecdsa-sha2-nistp384," "ecdsa-sha2-nistp521"; break; + case KT_MLDSA44_ED25519: + myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ? + "ssh-mldsa44-ed25519-cert-v01@openssh.com" : + "ssh-mldsa44-ed25519@openssh.com"; + break; case KT_ECDSA_SK: myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ? "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com" : @@ -745,6 +751,9 @@ main(int argc, char **argv) case KEY_ECDSA_SK: get_keytypes |= KT_ECDSA_SK; break; + case KEY_MLDSA44_ED25519: + get_keytypes |= KT_MLDSA44_ED25519; + break; case KEY_UNSPEC: default: fatal("Unknown key type \"%s\"", tname); diff --git a/ssh-keysign.0 b/ssh-keysign.0 index 569f85964b5f..ba62dbec5cdb 100644 --- a/ssh-keysign.0 +++ b/ssh-keysign.0 @@ -47,4 +47,4 @@ HISTORY AUTHORS Markus Friedl <markus@openbsd.org> -OpenBSD 7.8 June 17, 2024 SSH-KEYSIGN(8) +OpenBSD 7.9 June 17, 2024 SSH-KEYSIGN(8) diff --git a/ssh-keysign.c b/ssh-keysign.c index 6cfa51102a62..fd6cf7c00330 100644 --- a/ssh-keysign.c +++ b/ssh-keysign.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keysign.c,v 1.80 2026/03/19 02:36:28 djm Exp $ */ +/* $OpenBSD: ssh-keysign.c,v 1.81 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2002 Markus Friedl. All rights reserved. * @@ -203,6 +203,7 @@ main(int argc, char **argv) key_fd[i++] = open(_PATH_HOST_ECDSA_KEY_FILE, O_RDONLY); key_fd[i++] = open(_PATH_HOST_ED25519_KEY_FILE, O_RDONLY); key_fd[i++] = open(_PATH_HOST_RSA_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, O_RDONLY); if ((pw = getpwuid(getuid())) == NULL) fatal("getpwuid failed"); diff --git a/ssh-mldsa-eddsa.c b/ssh-mldsa-eddsa.c new file mode 100644 index 000000000000..89c35c7d1a00 --- /dev/null +++ b/ssh-mldsa-eddsa.c @@ -0,0 +1,506 @@ +/* $OpenBSD: ssh-mldsa-eddsa.c,v 1.1 2026/06/14 03:59:34 djm Exp $ */ +/* + * Copyright (c) 2026 Damien Miller <djm@mindrot.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* draft-miller-sshm-mldsa44-ed25519-composite-sigs-00 */ + +#include "includes.h" + +#ifdef USE_MLDSA + +#include <sys/types.h> +#include <stdint.h> +#include <string.h> +#include <stdlib.h> + +#include "crypto_api.h" +#include "sshbuf.h" +#include "ssherr.h" +#include "digest.h" +#define SSHKEY_INTERNAL +#include "sshkey.h" +#include "log.h" + +#define COMPOSITE_PREFIX "CompositeAlgorithmSignatures2025" +#define COMPOSITE_LABEL "COMPSIG-MLDSA44-Ed25519-SHA512" +#define SSH_MLDSA44_ED25519_ALG_NAME "ssh-mldsa44-ed25519@openssh.com" + +/* + * raw_* functions implement the draft-ietf-lamps-pq-composite-sigs-18 + * composite signature scheme. These are exposed (i.e. not static) so + * we can test them separately in unittests/crypto. + */ + +int +crypto_sign_mldsa44_ed25519_keygen(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ]) +{ + uint8_t mldsa_seed[32], ed25519_seed[32]; + int r; + + arc4random_buf(mldsa_seed, sizeof(mldsa_seed)); + arc4random_buf(ed25519_seed, sizeof(ed25519_seed)); + + r = crypto_sign_mldsa44_ed25519_keygen_seeded(pk, sk, mldsa_seed, + ed25519_seed); + explicit_bzero(mldsa_seed, sizeof(mldsa_seed)); + explicit_bzero(ed25519_seed, sizeof(ed25519_seed)); + return r; +} + +int +crypto_sign_mldsa44_ed25519_keygen_seeded(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ], const uint8_t mldsa_seed[32], + const uint8_t ed25519_seed[32]) +{ + uint8_t ed25519_pk[32], ed25519_sk[64]; + uint8_t mldsa_sk[MLDSA44_SECRETKEYBYTES]; + int ret = -1; + + if (crypto_sign_mldsa44_keypair_seeded(pk, mldsa_sk, mldsa_seed) != 0) + goto out; + if (crypto_sign_ed25519_keypair_from_seed(ed25519_pk, ed25519_sk, + ed25519_seed) != 0) + goto out; + + /* Serialize PK: mldsaPK || ed25519PK */ + memcpy(pk + MLDSA44_PUBLICKEYBYTES, ed25519_pk, 32); + + /* Serialize SK: mldsaSeed || ed25519Seed */ + memcpy(sk, mldsa_seed, 32); + memcpy(sk + 32, ed25519_seed, 32); + + /* success */ + ret = 0; + out: + explicit_bzero(mldsa_sk, sizeof(mldsa_sk)); + explicit_bzero(ed25519_sk, sizeof(ed25519_sk)); + return ret; +} + +static int +construct_m_prime(uint8_t **m_primep, size_t *m_prime_lenp, + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen) +{ + int r; + uint8_t hash[64]; + struct sshbuf *m_prime; + + *m_primep = NULL; + *m_prime_lenp = 0; + + if (ctxlen > 255) + return SSH_ERR_INVALID_ARGUMENT; + if ((r = ssh_digest_memory(SSH_DIGEST_SHA512, msg, msglen, + hash, sizeof(hash))) != 0) + return r; + if ((m_prime = sshbuf_new()) == NULL) + return SSH_ERR_ALLOC_FAIL; + if ((r = sshbuf_put(m_prime, COMPOSITE_PREFIX, + sizeof(COMPOSITE_PREFIX) - 1)) != 0 || + (r = sshbuf_put(m_prime, COMPOSITE_LABEL, + sizeof(COMPOSITE_LABEL) - 1)) != 0 || + (r = sshbuf_put_u8(m_prime, (uint8_t)ctxlen)) != 0 || + (r = sshbuf_put(m_prime, ctx, ctxlen)) != 0 || + (r = sshbuf_put(m_prime, hash, sizeof(hash))) != 0) { + sshbuf_free(m_prime); + return r; + } + if ((*m_primep = malloc(sshbuf_len(m_prime))) == NULL) { + sshbuf_free(m_prime); + return SSH_ERR_ALLOC_FAIL; + } + memcpy(*m_primep, sshbuf_ptr(m_prime), sshbuf_len(m_prime)); + *m_prime_lenp = sshbuf_len(m_prime); + /* success */ + sshbuf_free(m_prime); + return 0; +} + +int +crypto_sign_mldsa44_ed25519_sign(uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_ED25519_SK_SZ]) +{ + uint8_t *m_prime = NULL; + size_t m_prime_len = 0; + uint8_t mldsa_sk[MLDSA44_SECRETKEYBYTES]; + uint8_t mldsa_pk_dummy[MLDSA44_PUBLICKEYBYTES]; + uint8_t ed25519_pk[32], ed25519_sk[64]; + uint8_t mldsa_rnd[32]; + unsigned long long smlen; + int r = -1; + + if (construct_m_prime(&m_prime, &m_prime_len, msg, msglen, + ctx, ctxlen) != 0) + return -1; + + /* Expand ML-DSA key from seed */ + if (crypto_sign_mldsa44_keypair_seeded(mldsa_pk_dummy, mldsa_sk, sk) != 0) + goto out; + + /* Sign with ML-DSA */ + arc4random_buf(mldsa_rnd, sizeof(mldsa_rnd)); + if (crypto_sign_mldsa44_seeded(sig, m_prime, m_prime_len, + (const uint8_t *)COMPOSITE_LABEL, sizeof(COMPOSITE_LABEL) - 1, + mldsa_sk, mldsa_rnd) != 0) + goto out; + + /* Expand Ed25519 key from seed */ + if (crypto_sign_ed25519_keypair_from_seed(ed25519_pk, ed25519_sk, + sk + 32) != 0) + goto out; + + /* Sign with Ed25519 */ + uint8_t *sm = malloc(m_prime_len + 64); + if (sm == NULL) + goto out; + + if (crypto_sign_ed25519(sm, &smlen, m_prime, m_prime_len, + ed25519_sk) != 0) { + free(sm); + goto out; + } + memcpy(sig + MLDSA44_SIGBYTES, sm, 64); + free(sm); + + r = 0; + out: + free(m_prime); + explicit_bzero(mldsa_rnd, sizeof(mldsa_rnd)); + explicit_bzero(mldsa_sk, sizeof(mldsa_sk)); + explicit_bzero(ed25519_sk, sizeof(ed25519_sk)); + return r; +} + +int +crypto_sign_mldsa44_ed25519_verify(const uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_ED25519_PK_SZ]) +{ + uint8_t *m_prime = NULL; + size_t m_prime_len = 0; + uint8_t *sm = NULL, *m = NULL; + unsigned long long smlen, mlen; + int r = -1; + + if (construct_m_prime(&m_prime, &m_prime_len, msg, msglen, + ctx, ctxlen) != 0) + return -1; + + /* Verify ML-DSA */ + if (crypto_sign_mldsa44_verify(sig, m_prime, m_prime_len, + (const uint8_t *)COMPOSITE_LABEL, sizeof(COMPOSITE_LABEL) - 1, + pk) != 0) + goto out; + + /* Verify Ed25519 */ + smlen = m_prime_len + 64; + mlen = smlen; + if ((sm = malloc(smlen)) == NULL || (m = malloc(mlen)) == NULL) + goto out; + memcpy(sm, sig + MLDSA44_SIGBYTES, 64); + memcpy(sm + 64, m_prime, m_prime_len); + + if (crypto_sign_ed25519_open(m, &mlen, sm, smlen, + pk + MLDSA44_PUBLICKEYBYTES) != 0) + goto out; + if (mlen != m_prime_len) + goto out; + + r = 0; + out: + free(m_prime); + free(sm); + free(m); + return r; +} + +/* sshkey integration */ + +static void +ssh_mldsa44_ed25519_cleanup(struct sshkey *k) +{ + freezero(k->mldsa_ed25519_pk, MLDSA44_ED25519_PK_SZ); + freezero(k->mldsa_ed25519_sk, MLDSA44_ED25519_SK_SZ); + k->mldsa_ed25519_pk = NULL; + k->mldsa_ed25519_sk = NULL; +} + +static int +ssh_mldsa44_ed25519_equal(const struct sshkey *a, const struct sshkey *b) +{ + if (a->mldsa_ed25519_pk == NULL || b->mldsa_ed25519_pk == NULL) + return 0; + if (memcmp(a->mldsa_ed25519_pk, b->mldsa_ed25519_pk, + MLDSA44_ED25519_PK_SZ) != 0) + return 0; + return 1; +} + +static int +ssh_mldsa44_ed25519_serialize_public(const struct sshkey *key, struct sshbuf *b, + enum sshkey_serialize_rep opts) +{ + int r; + + if (key->mldsa_ed25519_pk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if ((r = sshbuf_put_string(b, key->mldsa_ed25519_pk, + MLDSA44_ED25519_PK_SZ)) != 0) + return r; + + return 0; +} + +static int +ssh_mldsa44_ed25519_serialize_private(const struct sshkey *key, struct sshbuf *b, + enum sshkey_serialize_rep opts) +{ + int r; + + if (key->mldsa_ed25519_sk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if (!sshkey_is_cert(key)) { + if ((r = ssh_mldsa44_ed25519_serialize_public(key, + b, opts)) != 0) + return r; + } + if ((r = sshbuf_put_string(b, key->mldsa_ed25519_sk, + MLDSA44_ED25519_SK_SZ)) != 0) + return r; + + return 0; +} + +static int +ssh_mldsa44_ed25519_deserialize_public(const char *ktype, struct sshbuf *b, + struct sshkey *key) +{ + u_char *pk = NULL; + size_t len = 0; + int r; + + if ((r = sshbuf_get_string(b, &pk, &len)) != 0) + return r; + if (len != MLDSA44_ED25519_PK_SZ) { + freezero(pk, len); + return SSH_ERR_INVALID_FORMAT; + } + key->mldsa_ed25519_pk = pk; + return 0; +} + +static int +ssh_mldsa44_ed25519_deserialize_private(const char *ktype, struct sshbuf *b, + struct sshkey *key) +{ + int r; + size_t sklen = 0; + u_char *sk = NULL; + + if (!sshkey_is_cert(key)) { + if ((r = ssh_mldsa44_ed25519_deserialize_public(ktype, + b, key)) != 0) + return r; + } + if ((r = sshbuf_get_string(b, &sk, &sklen)) != 0) + goto out; + if (sklen != MLDSA44_ED25519_SK_SZ) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + key->mldsa_ed25519_sk = sk; + sk = NULL; /* transferred */ + r = 0; + out: + freezero(sk, sklen); + return r; +} + +static int +ssh_mldsa44_ed25519_generate(struct sshkey *k, int bits) +{ + free(k->mldsa_ed25519_pk); + free(k->mldsa_ed25519_sk); + k->mldsa_ed25519_pk = NULL; + k->mldsa_ed25519_sk = NULL; + if ((k->mldsa_ed25519_pk = malloc(MLDSA44_ED25519_PK_SZ)) == NULL || + (k->mldsa_ed25519_sk = malloc(MLDSA44_ED25519_SK_SZ)) == NULL) { + free(k->mldsa_ed25519_pk); + return SSH_ERR_ALLOC_FAIL; + } + if (crypto_sign_mldsa44_ed25519_keygen(k->mldsa_ed25519_pk, + k->mldsa_ed25519_sk) != 0) { + free(k->mldsa_ed25519_pk); + free(k->mldsa_ed25519_sk); + return SSH_ERR_CRYPTO_ERROR; + } + return 0; +} + +static int +ssh_mldsa44_ed25519_copy_public(const struct sshkey *from, struct sshkey *to) +{ + if (from->mldsa_ed25519_pk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if ((to->mldsa_ed25519_pk = malloc(MLDSA44_ED25519_PK_SZ)) == NULL) + return SSH_ERR_ALLOC_FAIL; + memcpy(to->mldsa_ed25519_pk, from->mldsa_ed25519_pk, + MLDSA44_ED25519_PK_SZ); + return 0; +} + +static int +ssh_mldsa44_ed25519_sign(struct sshkey *key, + u_char **sigp, size_t *lenp, const u_char *data, size_t datalen, + const char *alg, const char *sk_provider, const char *sk_pin, + u_int compat) +{ + u_char sig[MLDSA44_ED25519_SIG_SZ]; + struct sshbuf *b = NULL; + int r = SSH_ERR_INTERNAL_ERROR; + + if (lenp != NULL) + *lenp = 0; + if (sigp != NULL) + *sigp = NULL; + + if (key == NULL || + sshkey_type_plain(key->type) != KEY_MLDSA44_ED25519 || + key->mldsa_ed25519_sk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + + if (crypto_sign_mldsa44_ed25519_sign(sig, data, datalen, NULL, 0, + key->mldsa_ed25519_sk) != 0) { + r = SSH_ERR_CRYPTO_ERROR; + goto out; + } + + if ((b = sshbuf_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + if ((r = sshbuf_put_cstring(b, SSH_MLDSA44_ED25519_ALG_NAME)) != 0 || + (r = sshbuf_put_string(b, sig, sizeof(sig))) != 0) + goto out; + + if (sigp != NULL) { + if ((*sigp = malloc(sshbuf_len(b))) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + memcpy(*sigp, sshbuf_ptr(b), sshbuf_len(b)); + } + if (lenp != NULL) + *lenp = sshbuf_len(b); + r = 0; + out: + sshbuf_free(b); + explicit_bzero(sig, sizeof(sig)); + return r; +} + +static int +ssh_mldsa44_ed25519_verify(const struct sshkey *key, + const u_char *sig, size_t siglen, const u_char *data, size_t dlen, + const char *alg, u_int compat, struct sshkey_sig_details **detailsp) +{ + struct sshbuf *b = NULL; + char *ktype = NULL; + const u_char *sigblob; + size_t len; + int r; + + if (key == NULL || + sshkey_type_plain(key->type) != KEY_MLDSA44_ED25519 || + key->mldsa_ed25519_pk == NULL || + sig == NULL || siglen == 0) + return SSH_ERR_INVALID_ARGUMENT; + + if ((b = sshbuf_from(sig, siglen)) == NULL) + return SSH_ERR_ALLOC_FAIL; + if ((r = sshbuf_get_cstring(b, &ktype, NULL)) != 0 || + (r = sshbuf_get_string_direct(b, &sigblob, &len)) != 0) + goto out; + if (strcmp(SSH_MLDSA44_ED25519_ALG_NAME, ktype) != 0) { + r = SSH_ERR_KEY_TYPE_MISMATCH; + goto out; + } + if (sshbuf_len(b) != 0) { + r = SSH_ERR_UNEXPECTED_TRAILING_DATA; + goto out; + } + if (len != MLDSA44_ED25519_SIG_SZ) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + + if (crypto_sign_mldsa44_ed25519_verify(sigblob, data, dlen, NULL, 0, + key->mldsa_ed25519_pk) != 0) { + r = SSH_ERR_SIGNATURE_INVALID; + goto out; + } + + r = 0; + out: + sshbuf_free(b); + free(ktype); + return r; +} + +const struct sshkey_impl_funcs sshkey_mldsa44_ed25519_funcs = { + /* .size = */ NULL, + /* .alloc = */ NULL, + /* .cleanup = */ ssh_mldsa44_ed25519_cleanup, + /* .equal = */ ssh_mldsa44_ed25519_equal, + /* .ssh_serialize_public = */ ssh_mldsa44_ed25519_serialize_public, + /* .ssh_deserialize_public = */ ssh_mldsa44_ed25519_deserialize_public, + /* .ssh_serialize_private = */ ssh_mldsa44_ed25519_serialize_private, + /* .ssh_deserialize_private = */ ssh_mldsa44_ed25519_deserialize_private, + /* .generate = */ ssh_mldsa44_ed25519_generate, + /* .copy_public = */ ssh_mldsa44_ed25519_copy_public, + /* .sign = */ ssh_mldsa44_ed25519_sign, + /* .verify = */ ssh_mldsa44_ed25519_verify, +}; + +const struct sshkey_impl sshkey_mldsa44_ed25519_impl = { + /* .name = */ "ssh-mldsa44-ed25519@openssh.com", + /* .shortname = */ "MLDSA44-ED25519", + /* .sigalg = */ NULL, + /* .type = */ KEY_MLDSA44_ED25519, + /* .nid = */ 0, + /* .cert = */ 0, + /* .sigonly = */ 0, + /* .keybits = */ 256, + /* .funcs = */ &sshkey_mldsa44_ed25519_funcs, +}; + +const struct sshkey_impl sshkey_mldsa44_ed25519_cert_impl = { + /* .name = */ "ssh-mldsa44-ed25519-cert-v01@openssh.com", + /* .shortname = */ "MLDSA44-ED25519-CERT", + /* .sigalg = */ NULL, + /* .type = */ KEY_MLDSA44_ED25519_CERT, + /* .nid = */ 0, + /* .cert = */ 1, + /* .sigonly = */ 0, + /* .keybits = */ 256, + /* .funcs = */ &sshkey_mldsa44_ed25519_funcs, +}; +#endif /* USE_MLDSA */ diff --git a/ssh-pkcs11-helper.0 b/ssh-pkcs11-helper.0 index ccb05e283196..5449eb1ec9ed 100644 --- a/ssh-pkcs11-helper.0 +++ b/ssh-pkcs11-helper.0 @@ -32,4 +32,4 @@ HISTORY AUTHORS Markus Friedl <markus@openbsd.org> -OpenBSD 7.8 April 29, 2022 SSH-PKCS11-HELPER(8) +OpenBSD 7.9 April 29, 2022 SSH-PKCS11-HELPER(8) diff --git a/ssh-sk-helper.0 b/ssh-sk-helper.0 index 886eac9dec5f..ed12665f0255 100644 --- a/ssh-sk-helper.0 +++ b/ssh-sk-helper.0 @@ -31,4 +31,4 @@ HISTORY AUTHORS Damien Miller <djm@openbsd.org> -OpenBSD 7.8 April 29, 2022 SSH-SK-HELPER(8) +OpenBSD 7.9 April 29, 2022 SSH-SK-HELPER(8) @@ -285,7 +285,6 @@ DESCRIPTION GatewayPorts GlobalKnownHostsFile HashKnownHosts - Host HostKeyAlgorithms HostKeyAlias HostbasedAcceptedAlgorithms @@ -296,7 +295,6 @@ DESCRIPTION IdentityAgent IdentityFile IgnoreUnknown - Include KbdInteractiveAuthentication KbdInteractiveDevices KexAlgorithms @@ -320,6 +318,7 @@ DESCRIPTION ProxyUseFdpass PubkeyAcceptedAlgorithms PubkeyAuthentication + RefuseConnection RekeyLimit RemoteCommand RemoteForward @@ -345,7 +344,9 @@ DESCRIPTION User UserKnownHostsFile VerifyHostKeyDNS + VersionAddendum VisualHostKey + WarnWeakCrypto XAuthLocation -P tag Specify a tag name that may be used to select configuration in @@ -1030,4 +1031,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.8 December 22, 2025 SSH(1) +OpenBSD 7.9 July 1, 2026 SSH(1) @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.447 2025/12/22 01:17:31 djm Exp $ -.Dd $Mdocdate: December 22 2025 $ +.\" $OpenBSD: ssh.1,v 1.449 2026/07/01 00:04:46 djm Exp $ +.Dd $Mdocdate: July 1 2026 $ .Dt SSH 1 .Os .Sh NAME @@ -547,7 +547,6 @@ For full details of the options listed below, and their possible values, see .It GatewayPorts .It GlobalKnownHostsFile .It HashKnownHosts -.It Host .It HostKeyAlgorithms .It HostKeyAlias .It HostbasedAcceptedAlgorithms @@ -558,7 +557,6 @@ For full details of the options listed below, and their possible values, see .It IdentityAgent .It IdentityFile .It IgnoreUnknown -.It Include .It KbdInteractiveAuthentication .It KbdInteractiveDevices .It KexAlgorithms @@ -582,6 +580,7 @@ For full details of the options listed below, and their possible values, see .It ProxyUseFdpass .It PubkeyAcceptedAlgorithms .It PubkeyAuthentication +.It RefuseConnection .It RekeyLimit .It RemoteCommand .It RemoteForward @@ -607,7 +606,9 @@ For full details of the options listed below, and their possible values, see .It User .It UserKnownHostsFile .It VerifyHostKeyDNS +.It VersionAddendum .It VisualHostKey +.It WarnWeakCrypto .It XAuthLocation .El .Pp @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.630 2026/04/02 07:50:55 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.634 2026/07/06 07:49:58 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -399,6 +399,7 @@ check_follow_cname(int direct, char **namep, const char *cname) "\"%s\" => \"%s\"", *namep, cname); free(*namep); *namep = xstrdup(cname); + lowercase(*namep); return 1; } return 0; @@ -612,26 +613,6 @@ set_addrinfo_port(struct addrinfo *addrs, int port) } } -static void -ssh_conn_info_free(struct ssh_conn_info *cinfo) -{ - if (cinfo == NULL) - return; - free(cinfo->conn_hash_hex); - free(cinfo->shorthost); - free(cinfo->uidstr); - free(cinfo->keyalias); - free(cinfo->thishost); - free(cinfo->host_arg); - free(cinfo->portstr); - free(cinfo->remhost); - free(cinfo->remuser); - free(cinfo->homedir); - free(cinfo->locuser); - free(cinfo->jmphost); - free(cinfo); -} - /* * Main program for the ssh client. */ @@ -1650,7 +1631,8 @@ main(int ac, char **av) if (options.control_path != NULL) { int sock; if ((sock = muxclient(options.control_path)) >= 0) { - ssh_packet_set_connection(ssh, sock, sock); + if (ssh_packet_set_connection(ssh, sock, sock) == NULL) + fatal("ssh_packet_set_connection failed"); ssh_packet_set_mux(ssh); goto skip_connect; } @@ -1739,9 +1721,11 @@ main(int ac, char **av) L_CERT(_PATH_HOST_ECDSA_KEY_FILE, 0); L_CERT(_PATH_HOST_ED25519_KEY_FILE, 1); L_CERT(_PATH_HOST_RSA_KEY_FILE, 2); + L_CERT(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, 3); L_PUBKEY(_PATH_HOST_ECDSA_KEY_FILE, 4); L_PUBKEY(_PATH_HOST_ED25519_KEY_FILE, 5); L_PUBKEY(_PATH_HOST_RSA_KEY_FILE, 6); + L_PUBKEY(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, 7); if (loaded == 0) debug("HostbasedAuthentication enabled but no " "local public host keys could be loaded."); @@ -1799,8 +1783,8 @@ main(int ac, char **av) ssh_signal(SIGCHLD, main_sigchld_handler); /* Log into the remote system. Never returns if the login fails. */ - ssh_login(ssh, &sensitive_data, host, (struct sockaddr *)&hostaddr, - options.port, pw, timeout_ms, cinfo); + ssh_login(ssh, &sensitive_data, host, &hostaddr, options.port, + pw, timeout_ms, cinfo); /* We no longer need the private host keys. Clear them now. */ if (sensitive_data.nkeys != 0) { diff --git a/ssh_config.0 b/ssh_config.0 index 1c9273f9b804..ffa33d4eecd6 100644 --- a/ssh_config.0 +++ b/ssh_config.0 @@ -11,24 +11,28 @@ DESCRIPTION 2. user's configuration file (~/.ssh/config) 3. system-wide configuration file (/etc/ssh/ssh_config) - Unless noted otherwise, for each parameter, the first obtained value will - be used. The configuration files contain sections separated by Host - specifications, and that section is only applied for hosts that match one - of the patterns given in the specification. The matched host name is - usually the one given on the command line (see the CanonicalizeHostname - option for exceptions). + Unless noted otherwise, for each configuration directive, the first + specified value will be used. - Since the first obtained value for each parameter is used, more host- + The configuration files may contain sections separated by conditional + Host or Match directives. Configuration in these sections is only + applied if the conditional directive that started the section matches. + + Since the first obtained value for each directive is used, more host- specific declarations should be given near the beginning of the file, and general defaults at the end. - The file contains keyword-argument pairs, one per line. Lines starting - with M-bM-^@M-^X#M-bM-^@M-^Y and empty lines are interpreted as comments. Arguments may + The file contains directive/values pairs, one per line. Lines starting + with M-bM-^@M-^X#M-bM-^@M-^Y and empty lines are interpreted as comments. M-bM-^@M-^X#M-bM-^@M-^Y outside of a + quoted string may be used to add a comment to the end of a line. + Whitespace at the beginning or end of lines is ignored. Values may optionally be enclosed in double quotes (") in order to represent - arguments containing spaces. Configuration options may be separated by - whitespace or optional whitespace and exactly one M-bM-^@M-^X=M-bM-^@M-^Y; the latter format - is useful to avoid the need to quote whitespace when specifying - configuration options using the ssh, scp, and sftp -o option. + arguments containing spaces. + + Configuration directives are separated from their values by whitespace or + exactly one M-bM-^@M-^X=M-bM-^@M-^Y character (which may be surrounded by whitespace); the + latter format is useful to avoid the need to quote whitespace when + specifying configuration options using the ssh, scp, and sftp -o option. The possible keywords and their meanings are as follows (note that keywords are case-insensitive and arguments are case-sensitive): @@ -116,6 +120,18 @@ DESCRIPTION invocations such as sftp(1), or none for transport-only sessions, such as when ssh(1) is started with the -N flag. + Include + Include the specified configuration file(s). Multiple pathnames + may be specified and each pathname may contain glob(7) wildcards, + tokens as described in the TOKENS section, environment variables + as described in the ENVIRONMENT VARIABLES section and, for user + configurations, shell-like M-bM-^@M-^X~M-bM-^@M-^Y references to user home + directories. Wildcards will be expanded and processed in lexical + order. Files without absolute paths are assumed to be in ~/.ssh + if included in a user configuration file or /etc/ssh if included + from the system configuration file. Include directive may appear + inside a Match or Host block to perform conditional inclusion. + AddKeysToAgent Specifies whether keys should be automatically added to a running ssh-agent(1). If this option is set to yes and a key is loaded @@ -351,6 +367,13 @@ DESCRIPTION Specifies whether to use compression. The argument must be yes or no (the default). + Compression applies to all traffic that flows over the SSH + connection. If untrusted traffic (such as an open port-forward) + is permitted over the connection alongside trusted traffic, then + compression may leak information about session contents. For + this reason, it is not recommended to enable compression for + connections that share trusted and untrusted traffic. + ConnectionAttempts Specifies the number of tries (one per second) to make before exiting. The argument must be an integer. This may be useful in @@ -721,18 +744,6 @@ DESCRIPTION listed early in the configuration file as it will not be applied to unknown options that appear before it. - Include - Include the specified configuration file(s). Multiple pathnames - may be specified and each pathname may contain glob(7) wildcards, - tokens as described in the TOKENS section, environment variables - as described in the ENVIRONMENT VARIABLES section and, for user - configurations, shell-like M-bM-^@M-^X~M-bM-^@M-^Y references to user home - directories. Wildcards will be expanded and processed in lexical - order. Files without absolute paths are assumed to be in ~/.ssh - if included in a user configuration file or /etc/ssh if included - from the system configuration file. Include directive may appear - inside a Match or Host block to perform conditional inclusion. - IPQoS Specifies the Differentiated Services Field Codepoint (DSCP) value for connections. Accepted values are af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, cs0, cs1, @@ -1499,4 +1510,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.8 March 23, 2026 SSH_CONFIG(5) +OpenBSD 7.9 July 1, 2026 SSH_CONFIG(5) diff --git a/ssh_config.5 b/ssh_config.5 index b459b0449709..4ac0d3d45d04 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.423 2026/03/23 01:33:46 djm Exp $ -.Dd $Mdocdate: March 23 2026 $ +.\" $OpenBSD: ssh_config.5,v 1.426 2026/07/01 00:52:31 djm Exp $ +.Dd $Mdocdate: July 1 2026 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -56,31 +56,36 @@ system-wide configuration file .Pq Pa /etc/ssh/ssh_config .El .Pp -Unless noted otherwise, for each parameter, the first obtained value -will be used. -The configuration files contain sections separated by +Unless noted otherwise, for each configuration directive, the first +specified value will be used. +.Pp +The configuration files may contain sections separated by conditional .Cm Host -specifications, and that section is only applied for hosts that -match one of the patterns given in the specification. -The matched host name is usually the one given on the command line -(see the -.Cm CanonicalizeHostname -option for exceptions). +or +.Cm Match +directives. +Configuration in these sections is only applied if the conditional directive +that started the section matches. .Pp -Since the first obtained value for each parameter is used, more +Since the first obtained value for each directive is used, more host-specific declarations should be given near the beginning of the file, and general defaults at the end. .Pp -The file contains keyword-argument pairs, one per line. +The file contains directive/values pairs, one per line. Lines starting with .Ql # and empty lines are interpreted as comments. -Arguments may optionally be enclosed in double quotes +.Ql # +outside of a quoted string may be used to add a comment to the end of a line. +Whitespace at the beginning or end of lines is ignored. +Values may optionally be enclosed in double quotes .Pq \&" in order to represent arguments containing spaces. -Configuration options may be separated by whitespace or -optional whitespace and exactly one -.Ql = ; +.Pp +Configuration directives are separated from their values by whitespace +or exactly one +.Ql = +character (which may be surrounded by whitespace); the latter format is useful to avoid the need to quote whitespace when specifying configuration options using the .Nm ssh , @@ -280,6 +285,31 @@ for transport-only sessions, such as when is started with the .Fl N flag. +.It Cm Include +Include the specified configuration file(s). +Multiple pathnames may be specified and each pathname may contain +.Xr glob 7 +wildcards, +tokens as described in the +.Sx TOKENS +section, environment variables as described in the +.Sx ENVIRONMENT VARIABLES +section and, for user configurations, shell-like +.Sq ~ +references to user home directories. +Wildcards will be expanded and processed in lexical order. +Files without absolute paths are assumed to be in +.Pa ~/.ssh +if included in a user configuration file or +.Pa /etc/ssh +if included from the system configuration file. +.Cm Include +directive may appear inside a +.Cm Match +or +.Cm Host +block +to perform conditional inclusion. .It Cm AddKeysToAgent Specifies whether keys should be automatically added to a running .Xr ssh-agent 1 . @@ -648,6 +678,13 @@ The argument must be or .Cm no (the default). +.Pp +Compression applies to all traffic that flows over the SSH connection. +If untrusted traffic (such as an open port-forward) is permitted over the +connection alongside trusted traffic, then compression may leak information +about session contents. +For this reason, it is not recommended to enable compression for connections +that share trusted and untrusted traffic. .It Cm ConnectionAttempts Specifies the number of tries (one per second) to make before exiting. The argument must be an integer. @@ -1220,31 +1257,6 @@ It is recommended that .Cm IgnoreUnknown be listed early in the configuration file as it will not be applied to unknown options that appear before it. -.It Cm Include -Include the specified configuration file(s). -Multiple pathnames may be specified and each pathname may contain -.Xr glob 7 -wildcards, -tokens as described in the -.Sx TOKENS -section, environment variables as described in the -.Sx ENVIRONMENT VARIABLES -section and, for user configurations, shell-like -.Sq ~ -references to user home directories. -Wildcards will be expanded and processed in lexical order. -Files without absolute paths are assumed to be in -.Pa ~/.ssh -if included in a user configuration file or -.Pa /etc/ssh -if included from the system configuration file. -.Cm Include -directive may appear inside a -.Cm Match -or -.Cm Host -block -to perform conditional inclusion. .It Cm IPQoS Specifies the .Em Differentiated Services Field Codepoint Pq DSCP diff --git a/sshbuf-io.c b/sshbuf-io.c index 13ef40e7d272..426b7e2343c0 100644 --- a/sshbuf-io.c +++ b/sshbuf-io.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-io.c,v 1.2 2020/01/25 23:28:06 djm Exp $ */ +/* $OpenBSD: sshbuf-io.c,v 1.4 2026/07/05 00:16:21 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -43,8 +43,7 @@ sshbuf_load_fd(int fd, struct sshbuf **blobp) if (fstat(fd, &st) == -1) return SSH_ERR_SYSTEM_ERROR; - if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 && - st.st_size > SSHBUF_SIZE_MAX) + if (S_ISREG(st.st_mode) && st.st_size > SSHBUF_SIZE_MAX) return SSH_ERR_INVALID_FORMAT; if ((blob = sshbuf_new()) == NULL) return SSH_ERR_ALLOC_FAIL; @@ -62,7 +61,7 @@ sshbuf_load_fd(int fd, struct sshbuf **blobp) goto out; } } - if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 && + if (S_ISREG(st.st_mode) != 0 && st.st_size != (off_t)sshbuf_len(blob)) { r = SSH_ERR_FILE_CHANGED; goto out; @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.h,v 1.35 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: sshbuf.h,v 1.36 2026/04/07 07:40:40 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -21,6 +21,7 @@ #include <sys/types.h> #include <stdarg.h> #include <stdio.h> +#include <stdint.h> #ifdef WITH_OPENSSL # include <openssl/bn.h> diff --git a/sshconnect.c b/sshconnect.c index 4384277a6eab..0ddfc76b367b 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.382 2026/02/16 00:45:41 dtucker Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.384 2026/07/06 07:49:58 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -70,6 +70,49 @@ extern char *__progname; static int show_other_keys(struct hostkeys *, struct sshkey *); static void warn_changed_key(struct sshkey *); +void +ssh_conn_info_free(struct ssh_conn_info *cinfo) +{ + if (cinfo == NULL) + return; + free(cinfo->conn_hash_hex); + free(cinfo->shorthost); + free(cinfo->uidstr); + free(cinfo->keyalias); + free(cinfo->thishost); + free(cinfo->host_arg); + free(cinfo->portstr); + free(cinfo->remhost); + free(cinfo->remuser); + free(cinfo->homedir); + free(cinfo->locuser); + free(cinfo->jmphost); + freezero(cinfo, sizeof(*cinfo)); +} + +struct ssh_conn_info * +ssh_conn_info_dup(const struct ssh_conn_info *cinfo) +{ + struct ssh_conn_info *ret; + + if (cinfo == NULL) + return NULL; + ret = xcalloc(1, sizeof(*ret)); + ret->conn_hash_hex = xstrdup(cinfo->conn_hash_hex); + ret->shorthost = xstrdup(cinfo->shorthost); + ret->uidstr = xstrdup(cinfo->uidstr); + ret->keyalias = xstrdup(cinfo->keyalias); + ret->thishost = xstrdup(cinfo->thishost); + ret->host_arg = xstrdup(cinfo->host_arg); + ret->portstr = xstrdup(cinfo->portstr); + ret->remhost = xstrdup(cinfo->remhost); + ret->remuser = xstrdup(cinfo->remuser); + ret->homedir = xstrdup(cinfo->homedir); + ret->locuser = xstrdup(cinfo->locuser); + ret->jmphost = xstrdup(cinfo->jmphost); + return ret; +} + /* Expand a proxy command */ static char * expand_proxy_command(const char *proxy_command, const char *user, @@ -1585,8 +1628,8 @@ warn_nonpq_kex(void) */ void ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost, - struct sockaddr *hostaddr, u_short port, struct passwd *pw, int timeout_ms, - const struct ssh_conn_info *cinfo) + struct sockaddr_storage *hostaddr, u_short port, struct passwd *pw, + int timeout_ms, const struct ssh_conn_info *cinfo) { char *host; char *server_user, *local_user; @@ -1633,6 +1676,7 @@ show_other_keys(struct hostkeys *hostkeys, struct sshkey *key) KEY_RSA, KEY_ECDSA, KEY_ED25519, + KEY_MLDSA44_ED25519, -1 }; int i, ret = 0; diff --git a/sshconnect.h b/sshconnect.h index 4c19490da487..2ac2c07e005a 100644 --- a/sshconnect.h +++ b/sshconnect.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.h,v 1.50 2026/02/13 01:04:47 jsg Exp $ */ +/* $OpenBSD: sshconnect.h,v 1.51 2026/07/06 07:49:58 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -76,7 +76,7 @@ int ssh_connect(struct ssh *, const char *, const char *, void ssh_kill_proxy_command(void); void ssh_login(struct ssh *, Sensitive *, const char *, - struct sockaddr *, u_short, struct passwd *, int, + struct sockaddr_storage *, u_short, struct passwd *, int, const struct ssh_conn_info *); int verify_host_key(char *, struct sockaddr *, struct sshkey *, @@ -85,7 +85,7 @@ int verify_host_key(char *, struct sockaddr *, struct sshkey *, void get_hostfile_hostname_ipaddr(char *, struct sockaddr *, u_short, char **, char **); -void ssh_kex2(struct ssh *ssh, char *, struct sockaddr *, u_short, +void ssh_kex2(struct ssh *ssh, char *, struct sockaddr_storage *, u_short, const struct ssh_conn_info *); void ssh_userauth2(struct ssh *ssh, const char *, const char *, @@ -101,3 +101,6 @@ void load_hostkeys_command(struct hostkeys *, const char *, const struct sshkey *, const char *); int hostkey_accepted_by_hostkeyalgs(const struct sshkey *); + +void ssh_conn_info_free(struct ssh_conn_info *); +struct ssh_conn_info *ssh_conn_info_dup(const struct ssh_conn_info *); diff --git a/sshconnect2.c b/sshconnect2.c index 478a9a52fd38..d1555ee97274 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.385 2026/04/02 07:48:13 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.388 2026/07/06 07:49:58 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -83,7 +83,7 @@ extern Options options; */ static char *xxx_host; -static struct sockaddr *xxx_hostaddr; +static struct sockaddr_storage xxx_hostaddr; static const struct ssh_conn_info *xxx_conn_info; static int key_type_allowed(struct sshkey *, const char *); @@ -99,7 +99,7 @@ verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh) fatal("Server host key %s not in HostKeyAlgorithms", sshkey_ssh_name(hostkey)); } - if (verify_host_key(xxx_host, xxx_hostaddr, hostkey, + if (verify_host_key(xxx_host, (struct sockaddr *)&xxx_hostaddr, hostkey, xxx_conn_info) != 0) fatal("Host key verification failed."); return 0; @@ -216,16 +216,16 @@ order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port, } void -ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, - const struct ssh_conn_info *cinfo) +ssh_kex2(struct ssh *ssh, char *host, struct sockaddr_storage *hostaddr, + u_short port, const struct ssh_conn_info *cinfo) { char *myproposal[PROPOSAL_MAX]; char *all_key, *hkalgs = NULL; int r, use_known_hosts_order = 0; - xxx_host = host; - xxx_hostaddr = hostaddr; - xxx_conn_info = cinfo; + xxx_host = xstrdup(host); + xxx_hostaddr = *hostaddr; + xxx_conn_info = ssh_conn_info_dup(cinfo); if (options.rekey_limit || options.rekey_interval) ssh_packet_set_rekey_limits(ssh, options.rekey_limit, @@ -248,8 +248,10 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, fatal_fr(r, "kex_assemble_namelist"); free(all_key); - if (use_known_hosts_order) - hkalgs = order_hostkeyalgs(host, hostaddr, port, cinfo); + if (use_known_hosts_order) { + hkalgs = order_hostkeyalgs(host, (struct sockaddr *)hostaddr, + port, cinfo); + } kex_proposal_populate_entries(ssh, myproposal, options.kex_algorithms, options.ciphers, options.macs, @@ -1277,7 +1279,7 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp, * PKCS#11 tokens may not support all signature algorithms, * so check what we get back. */ - if ((id->key->flags & SSHKEY_FLAG_EXT) != 0 && + if (id->key != NULL && (id->key->flags & SSHKEY_FLAG_EXT) != 0 && (r = sshkey_check_sigtype(*sigp, *lenp, alg)) != 0) { debug_fr(r, "sshkey_check_sigtype"); goto out; @@ -1441,7 +1443,8 @@ sign_and_send_pubkey(struct ssh *ssh, Identity *id) !fallback_sigtype) { if (sign_id->agent_fd != -1) loc = "agent "; - else if ((sign_id->key->flags & SSHKEY_FLAG_EXT) != 0) + else if (sign_id->key != NULL && + (sign_id->key->flags & SSHKEY_FLAG_EXT) != 0) loc = "token "; logit("%skey %s %s returned incorrect signature type", loc, sshkey_type(id->key), fp); diff --git a/sshd-auth.c b/sshd-auth.c index 76350a2a3501..fb1bab66fad1 100644 --- a/sshd-auth.c +++ b/sshd-auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-auth.c,v 1.14 2026/03/11 09:10:59 dtucker Exp $ */ +/* $OpenBSD: sshd-auth.c,v 1.16 2026/06/14 03:59:34 djm Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -249,6 +249,7 @@ list_hostkey_types(void) /* FALLTHROUGH */ case KEY_ECDSA: case KEY_ED25519: + case KEY_MLDSA44_ED25519: case KEY_ECDSA_SK: case KEY_ED25519_SK: append_hostkey_type(b, sshkey_ssh_name(key)); @@ -268,6 +269,7 @@ list_hostkey_types(void) /* FALLTHROUGH */ case KEY_ECDSA_CERT: case KEY_ED25519_CERT: + case KEY_MLDSA44_ED25519_CERT: case KEY_ECDSA_SK_CERT: case KEY_ED25519_SK_CERT: append_hostkey_type(b, sshkey_ssh_name(key)); @@ -292,6 +294,7 @@ get_hostkey_public_by_type(int type, int nid, struct ssh *ssh) case KEY_RSA_CERT: case KEY_ECDSA_CERT: case KEY_ED25519_CERT: + case KEY_MLDSA44_ED25519_CERT: case KEY_ECDSA_SK_CERT: case KEY_ED25519_SK_CERT: key = host_certificates[i]; @@ -412,14 +415,13 @@ parse_hostkeys(struct sshbuf *hostkeys) } static void -recv_privsep_state(struct ssh *ssh, struct sshbuf *conf, - uint64_t *timing_secretp) +recv_privsep_state(struct ssh *ssh, ServerOptions *o, uint64_t *timing_secretp) { struct sshbuf *hostkeys; debug3_f("begin"); - mm_get_state(ssh, &includes, conf, NULL, timing_secretp, + mm_get_state(ssh, o, NULL, timing_secretp, &hostkeys, NULL, NULL, NULL, NULL); parse_hostkeys(hostkeys); @@ -439,11 +441,9 @@ main(int ac, char **av) extern int optind; int r, opt, have_key = 0; int sock_in = -1, sock_out = -1, rexeced_flag = 0; - char *line; u_int i; mode_t new_umask; Authctxt *authctxt; - struct connection_info *connection_info = NULL; sigset_t sigmask; uint64_t timing_secret = 0; @@ -482,17 +482,16 @@ main(int ac, char **av) "C:E:b:c:f:g:h:k:o:p:u:46DGQRTdeiqrtV")) != -1) { switch (opt) { case '4': - options.address_family = AF_INET; + /* ignore */ break; case '6': - options.address_family = AF_INET6; + /* ignore */ break; case 'f': - config_file_name = optarg; + /* ignore */ break; case 'c': - servconf_add_hostcert("[command-line]", 0, - &options, optarg); + /* ignore */ break; case 'd': if (debug_flag == 0) { @@ -519,46 +518,28 @@ main(int ac, char **av) /* ignored */ break; case 'q': - options.log_level = SYSLOG_LEVEL_QUIET; + /* ignored */ break; case 'b': /* protocol 1, ignored */ break; case 'p': - options.ports_from_cmdline = 1; - if (options.num_ports >= MAX_PORTS) { - fprintf(stderr, "too many ports.\n"); - exit(1); - } - options.ports[options.num_ports++] = a2port(optarg); - if (options.ports[options.num_ports-1] <= 0) { - fprintf(stderr, "Bad port number.\n"); - exit(1); - } + /* ignored */ break; case 'g': - if ((options.login_grace_time = convtime(optarg)) == -1) { - fprintf(stderr, "Invalid login grace time.\n"); - exit(1); - } + /* ignored */ break; case 'k': /* protocol 1, ignored */ break; case 'h': - servconf_add_hostkey("[command-line]", 0, - &options, optarg, 1); + /* ignored */ break; case 't': case 'T': case 'G': - fatal("test/dump modes not supported"); - break; case 'C': - connection_info = server_get_connection_info(ssh, 0, 0); - if (parse_server_match_testspec(connection_info, - optarg) == -1) - exit(1); + fatal("test/dump modes not supported"); break; case 'u': utmp_len = (u_int)strtonum(optarg, 0, HOST_NAME_MAX+1+1, NULL); @@ -568,11 +549,7 @@ main(int ac, char **av) } break; case 'o': - line = xstrdup(optarg); - if (process_server_config_line(&options, line, - "command-line", 0, NULL, NULL, &includes) != 0) - exit(1); - free(line); + /* ignored */ break; case 'V': fprintf(stderr, "%s, %s\n", @@ -637,10 +614,7 @@ main(int ac, char **av) if ((cfg = sshbuf_new()) == NULL) fatal("sshbuf_new config buf failed"); setproctitle("%s", "[session-auth early]"); - recv_privsep_state(ssh, cfg, &timing_secret); - parse_server_config(&options, "rexec", cfg, &includes, NULL, 1); - /* Fill in default values for those options not explicitly set. */ - fill_default_server_options(&options); + recv_privsep_state(ssh, &options, &timing_secret); options.timing_secret = timing_secret; /* XXX eliminate from unpriv */ ssh_packet_set_qos(ssh, options.ip_qos_interactive, options.ip_qos_bulk); diff --git a/sshd-session.c b/sshd-session.c index e9a488d08906..be30c8d70dd3 100644 --- a/sshd-session.c +++ b/sshd-session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-session.c,v 1.23 2026/03/11 09:10:59 dtucker Exp $ */ +/* $OpenBSD: sshd-session.c,v 1.24 2026/06/14 03:59:34 djm Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -439,6 +439,7 @@ get_hostkey_by_type(int type, int nid, int need_private, struct ssh *ssh) case KEY_ED25519_CERT: case KEY_ECDSA_SK_CERT: case KEY_ED25519_SK_CERT: + case KEY_MLDSA44_ED25519_CERT: key = sensitive_data.host_certificates[i]; break; default: @@ -684,4 +684,4 @@ AUTHORS versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support for privilege separation. -OpenBSD 7.8 October 4, 2025 SSHD(8) +OpenBSD 7.9 October 4, 2025 SSHD(8) @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.626 2026/02/09 21:21:39 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.628 2026/06/29 07:36:37 djm Exp $ */ /* * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved. @@ -1591,7 +1591,8 @@ main(int ac, char **av) if (options.host_key_files[i] == NULL) continue; if ((r = sshkey_load_private(options.host_key_files[i], "", - &key, NULL)) != 0 && r != SSH_ERR_SYSTEM_ERROR) + &key, NULL)) != 0 && + r != SSH_ERR_SYSTEM_ERROR && !have_agent) do_log2_r(r, ll, "Unable to load host key \"%s\"", options.host_key_files[i]); if (sshkey_is_sk(key) && @@ -1653,6 +1654,7 @@ main(int ac, char **av) case KEY_RSA: case KEY_ECDSA: case KEY_ED25519: + case KEY_MLDSA44_ED25519: case KEY_ECDSA_SK: case KEY_ED25519_SK: if (have_agent || key != NULL) diff --git a/sshd_config.0 b/sshd_config.0 index 770ec742e42b..9bafd243e534 100644 --- a/sshd_config.0 +++ b/sshd_config.0 @@ -379,6 +379,13 @@ DESCRIPTION authenticated successfully. The argument must be yes, delayed (a legacy synonym for yes) or no. The default is yes. + Compression applies to all traffic that flows over the SSH + connection. If untrusted traffic (such as an open port-forward) + is permitted over the connection alongside trusted traffic, then + compression may leak information about session contents. For + this reason, it is not recommended to enable compression for + connections that share trusted and untrusted traffic. + DenyGroups This keyword can be followed by a list of group name patterns, separated by spaces. Login is disallowed for users whose primary @@ -473,7 +480,8 @@ DESCRIPTION hostname. If set to no then the client may authenticate against any service key stored in the machine's default store. This facility is provided to assist with operation on multi homed - machines. The default is yes. + machines. The default is yes. This option may not be effective + in Windows Active Directory environments. HostbasedAcceptedAlgorithms Specifies the signature algorithms that will be accepted for @@ -1448,4 +1456,4 @@ AUTHORS versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support for privilege separation. -OpenBSD 7.8 March 28, 2026 SSHD_CONFIG(5) +OpenBSD 7.9 June 24, 2026 SSHD_CONFIG(5) diff --git a/sshd_config.5 b/sshd_config.5 index 3f5e29812d3f..39a864dee6d7 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.397 2026/03/28 05:07:12 djm Exp $ -.Dd $Mdocdate: March 28 2026 $ +.\" $OpenBSD: sshd_config.5,v 1.399 2026/06/24 06:55:12 djm Exp $ +.Dd $Mdocdate: June 24 2026 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -633,6 +633,13 @@ or .Cm no . The default is .Cm yes . +.Pp +Compression applies to all traffic that flows over the SSH connection. +If untrusted traffic (such as an open port-forward) is permitted over the +connection alongside trusted traffic, then compression may leak information +about session contents. +For this reason, it is not recommended to enable compression for connections +that share trusted and untrusted traffic. .It Cm DenyGroups This keyword can be followed by a list of group name patterns, separated by spaces. @@ -769,6 +776,7 @@ machine's default store. This facility is provided to assist with operation on multi homed machines. The default is .Cm yes . +This option may not be effective in Windows Active Directory environments. .It Cm HostbasedAcceptedAlgorithms Specifies the signature algorithms that will be accepted for hostbased authentication as a list of comma-separated patterns. diff --git a/ssherr-libcrypto.c b/ssherr-libcrypto.c index 5b817e54aa80..8f84183f46eb 100644 --- a/ssherr-libcrypto.c +++ b/ssherr-libcrypto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssherr-libcrypto.c,v 1.1 2026/02/06 23:31:29 dtucker Exp $ */ +/* $OpenBSD: ssherr-libcrypto.c,v 1.2 2026/06/30 03:42:53 tb Exp $ */ /* * Copyright (c) 2026 Darren Tucker * @@ -36,7 +36,7 @@ ssherr_libcrypto(void) const char *reason = NULL, *file, *data; int ln, fl; - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); while ((e = ERR_get_error_line_data(&file, &ln, &data, &fl)) != 0) { ERR_error_string_n(e, buf, sizeof(buf)); snprintf(msg, sizeof(msg), "%s:%s:%d:%s", buf, file, ln, @@ -1,4 +1,4 @@ -/* $OpenBSD: ssherr.c,v 1.11 2026/02/06 23:31:29 dtucker Exp $ */ +/* $OpenBSD: ssherr.c,v 1.12 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -72,6 +72,8 @@ ssh_err(int n) case SSH_ERR_LIBCRYPTO_ERROR: msg = ssherr_libcrypto(); return msg != NULL ? msg : "error in libcrypto"; + case SSH_ERR_INTERNAL_CRYPTO_ERROR: + return "cryptographic operation failed"; case SSH_ERR_UNEXPECTED_TRAILING_DATA: return "unexpected bytes remain after decoding"; case SSH_ERR_SYSTEM_ERROR: @@ -1,4 +1,4 @@ -/* $OpenBSD: ssherr.h,v 1.9 2026/02/06 23:31:29 dtucker Exp $ */ +/* $OpenBSD: ssherr.h,v 1.10 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -82,6 +82,8 @@ #define SSH_ERR_SIGN_ALG_UNSUPPORTED -58 #define SSH_ERR_FEATURE_UNSUPPORTED -59 #define SSH_ERR_DEVICE_NOT_FOUND -60 +#define SSH_ERR_CRYPTO_ERROR -61 +#define SSH_ERR_INTERNAL_CRYPTO_ERROR -62 /* Translate a numeric error code to a human-readable error string */ const char *ssh_err(int n); @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.161 2026/02/06 22:59:18 dtucker Exp $ */ +/* $OpenBSD: sshkey.c,v 1.163 2026/06/29 01:58:29 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -90,6 +90,10 @@ extern const struct sshkey_impl sshkey_ed25519_impl; extern const struct sshkey_impl sshkey_ed25519_cert_impl; extern const struct sshkey_impl sshkey_ed25519_sk_impl; extern const struct sshkey_impl sshkey_ed25519_sk_cert_impl; +#ifdef USE_MLDSA +extern const struct sshkey_impl sshkey_mldsa44_ed25519_impl; +extern const struct sshkey_impl sshkey_mldsa44_ed25519_cert_impl; +#endif /* USE_MLDSA */ #ifdef WITH_OPENSSL # ifdef OPENSSL_HAS_ECC # ifdef ENABLE_SK @@ -122,6 +126,10 @@ const struct sshkey_impl * const keyimpls[] = { &sshkey_ed25519_sk_impl, &sshkey_ed25519_sk_cert_impl, #endif +#ifdef USE_MLDSA + &sshkey_mldsa44_ed25519_impl, + &sshkey_mldsa44_ed25519_cert_impl, +#endif /* USE_MLDSA */ #ifdef WITH_OPENSSL # ifdef OPENSSL_HAS_ECC &sshkey_ecdsa_nistp256_impl, @@ -439,6 +447,8 @@ sshkey_type_plain(int type) return KEY_ECDSA_SK; case KEY_ED25519_CERT: return KEY_ED25519; + case KEY_MLDSA44_ED25519_CERT: + return KEY_MLDSA44_ED25519; case KEY_ED25519_SK_CERT: return KEY_ED25519_SK; default: @@ -459,6 +469,8 @@ sshkey_type_certified(int type) return KEY_ECDSA_SK_CERT; case KEY_ED25519: return KEY_ED25519_CERT; + case KEY_MLDSA44_ED25519: + return KEY_MLDSA44_ED25519_CERT; case KEY_ED25519_SK: return KEY_ED25519_SK_CERT; default: @@ -2713,6 +2725,10 @@ sshkey_ec_validate_public(const EC_GROUP *group, const EC_POINT *public) ret = SSH_ERR_ALLOC_FAIL; goto out; } + if (EC_GROUP_get_order(group, order, NULL) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } if ((nq = EC_POINT_new(group)) == NULL) { ret = SSH_ERR_ALLOC_FAIL; goto out; @@ -3388,6 +3404,7 @@ sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob, #ifdef WITH_OPENSSL case KEY_ECDSA_SK: #endif /* WITH_OPENSSL */ + case KEY_MLDSA44_ED25519: return sshkey_private_to_blob2(key, blob, passphrase, comment, openssh_format_cipher, openssh_format_rounds); default: @@ -3447,6 +3464,9 @@ translate_libcrypto_error(unsigned long pem_err) return SSH_ERR_LIBCRYPTO_ERROR; } case ERR_LIB_ASN1: +#ifdef ERR_LIB_OSSL_DECODER + case ERR_LIB_OSSL_DECODER: +#endif return SSH_ERR_INVALID_FORMAT; } return SSH_ERR_LIBCRYPTO_ERROR; @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.h,v 1.73 2026/03/03 09:57:26 dtucker Exp $ */ +/* $OpenBSD: sshkey.h,v 1.74 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -67,6 +67,8 @@ enum sshkey_types { KEY_ECDSA_SK_CERT, KEY_ED25519_SK, KEY_ED25519_SK_CERT, + KEY_MLDSA44_ED25519, + KEY_MLDSA44_ED25519_CERT, KEY_UNSPEC }; @@ -124,6 +126,9 @@ struct sshkey { /* KEY_ED25519 and KEY_ED25519_SK */ u_char *ed25519_sk; u_char *ed25519_pk; + /* KEY_MLDSA44_ED25519 */ + u_char *mldsa_ed25519_sk; + u_char *mldsa_ed25519_pk; /* KEY_ECDSA_SK and KEY_ED25519_SK */ char *sk_application; uint8_t sk_flags; diff --git a/version.h b/version.h index fceafae97661..e26bb18d9086 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ -/* $OpenBSD: version.h,v 1.108 2026/04/02 07:51:12 djm Exp $ */ +/* $OpenBSD: version.h,v 1.109 2026/07/06 07:54:26 djm Exp $ */ -#define SSH_VERSION "OpenSSH_10.3" +#define SSH_VERSION "OpenSSH_10.4" #define SSH_PORTABLE "p1" #define SSH_RELEASE SSH_VERSION SSH_PORTABLE |
